目录

一.复制以及使用自定义的redis.conf文件

1.在官网拷贝对应版本的配置文件内容新建redis.conf文件进行粘贴。(推荐)

2.也可以去官网下载对应版本的redis的tar.gz包,解压后在根目录下找到redis.conf文件复制也可也可。

二.配置redis.conf文件(这里有个小坑)

1.注释掉bind 127.0.0.1 -::1,不然外部无法连接到redis

2.将daemonize改为no,也就是后台启动关闭(小坑)

3.将protected-mode改为no,也就是关闭保护模式

4.appendonly改为yes,开启aof持久化(可选)

5.放开requirepass的注释,将原来的foobared改为你自己的密码(可选)

三.docker-compose.yml文件配置

四.关于Memory overcommit的警告


一.复制以及使用自定义redis.conf文件

使用docker或者dockercompose启动redis时,如果想用自定义redis.conf文件启动redis,有两种方式获取默认redis.conf文件

1.在官网拷贝对应版本配置文件内容新建redis.conf文件进行粘贴。(推荐

官网配置文件地址

Redis configuration | Redis

要点击你的redis对应版本复制,这里我用的是redis7.2.3,所以点击7.2的版本,点进去复制全部即可

2.也可以官网下载对应版本redistar.gz包,解压后在根目录找到redis.conf文件复制也可也可。

 官网所有版本redis下载地址

Index of /releases/

推荐第一种方法,方便省事,并且第二种方法有些特殊镜像版本可能知道对应哪个版本的tar.gz包。

不管哪种方式,注意一定要对应版本,不然启动会报配置文件相关错误

然后将此文件放置在你想挂载的目录下进行挂载可以直接redis.conf文件存放目录挂载(目录挂载容器内的路径最好是一个创建的路径,不然用容器内已有目录进行挂载这个目录下其他的文件或者目录就没了),或者也可以直接挂载到conf文件就不会影响到其他文件或者目录(但是配合sentinel搭建集群时候就不能挂载到文件,会没有权限写入的,需要挂载到目录),挂载好后按照下面的配置进行修改然后启动时在docker run命令或者dockercompose文件中command参数部分中加上redisserver <你的容器内conf文件存放路径>/redis.conf

二.配置redis.conf文件(这里有个小坑)

redis不管是常规安装或者docker/dockercompose安装配置除了第2点都一样,小坑就在第2点。

1.注释bind 127.0.0.1 -::1,不然外部无法连接redis

这个选项绑定连接redis的ip,127.0.0.1代表本地,只能本机就是容器内部使用redis,所以外部要连接的话需要注释这个选项,或者有需要的也可以将ip改为需要固定连接的ip,::1代表的是允许ipv6连接。

2.将daemonize改为no,也就是后台启动关闭(小坑)

如果是linux常规安装是要将这个选项改成yes的,因为要后台启动,但是如果是以docker容器的放弃启动,这个选项必须改为no,否则会跟docker的-d或者docker compose的后台启动冲突,导致容器启动不起来,并且用docker logs 看不到任何日志,千万记住redis的docker与常规安装的这个选项是反的。

3.将protectedmode改为no,也就是关闭保护模式

保护模式开启只会允许本地的回环连接,不允许外部访问关闭才能从外部连接redis。

4.appendonly改为yes开启aof持久化(可选)

aof持久选项,最好开启

5.放开requirepass的注释,将原来的foobared改为你自己密码(可选)

一步设置redis的密码,注释就是无密码,最好设置一下。

三.docker-compose.yml文件配置

这是我自己用的redis的docker-compose.yml配置,如果发现错误请指正。

  redis:
    container_name: redis
    image: redis:7.2.3
    privileged: true
    command: redis-server /etc/redis/redis.conf
    volumes:
      - /app/redis/redis.conf:/etc/redis/redis.conf
      - /app/redis/data:/data
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "6379:6379"
    restart: always
    networks:
      - learn_default
    logging:
      driver: "json-file"
      options:
        max-size: "20m"
        max-file: "3"    

privileged: true是为了获取完整权限。 

挂载- /app/redis/data:/data是为了同步redis的持久数据

为什么数据是在/data目录?因为redis的默认数据保存目录(rdbaof数据保存都是在这个文件夹下)是在执行redis-server命令当前所处的目录下,可以在默认的redis.conf文件中看到dir这一项就是配置数据文件保存位置,默认的是./,这个.就是在执行redis-serve命令时所处的目录。而redis镜像启动的容器的工作目录就是/data目录,redis-server命令就是在这个目录下运行的,所以自然而然就是/data目录。

当然你也可以指定目录,修改dir后面的路径即可,注意如果是不存在的目录,redis不会自己创建目录需要手动创建。如果是不存在的目录,想在容器启动后使用docker exec进入容器mkdir新建目录然后重启使修改的新目录生效这种方式修改数据保存位置的话是不行的,redis启动不了,会报权限错误访问拒绝解决方式是在command的redis-server命令执行之前先执行mkdir命令创建你想指定的目录,重新创建一个容器即可,而且记得要带上privileged获取权限。不过属实是没有这个必要,使用默认的即可

挂载- /etc/localtime:/etc/localtime:ro是为了让容器与主机之间时间日期进行完全同步,因为docker容器与宿主机日期时间会存在同步问题,最好保持一致,:ro是只读权限,因为这是系统文件所以只给只读权限

restart: always是为了自行启动。

networks加入指定网络中。

logging是跟容器日志有关的配置,driver指定日志存储机制maxsize为单个日志最大容量,maxfile为最多的日志文件个数

四.关于Memory overcommit警告

本来在程序员眼里警告基本是不存在的[手动狗头],之所以我会注意到这个警告,是因为上面的第二点我写成了yes,一直启动不起来,docker logs就只报了这个警告,后面查了半天解决了这个警告,发现还是启动不起来,并且日志也没有。后面百度了才发现是由于daemonize设置yes原因,突然想起好像常规安装docker安装是反的,后面改回来之后就好了,所以这里千万要注意。晕死,浪费半天力气。不过这个警告解决还有点曲折,所以分享一下。

启动redis容器后时,用docker logs -f命令可以发现出现如下的警告 

WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. To fix this issue addvm.overcommit_memory = 1′ to /etc/sysctl.conf and then reboot or run the commandsysctl vm.overcommit_memory=1′ for this to take effect.
 

翻译过来就是

警告必须启用内存过度使用!如果没有它,后台保存或复制可能会在内存不足的情况下失败。如果被禁用,它也可能在没有内存不足的情况下导致故障,请参阅https://github.com/jemalloc/jemalloc/issues/1328.若要解决问题,请将“vm.overcommit_memory=1”添加到/etc/sysctl.conf,然后重新启动或运行命令sysctl vm.overommit_memory=1”以使其生效

redis给出了解决方案,就是在/etc目录下的sysctl.conf文件中添加vm.overcommit_memory=1,并且重新启动或运行命令sysctl vm.overommit_memory=1”以使其生效。刚开始我一直以为要容器内部修改redis容器内的/etc/sysctl.conf文件,但是容器内部的/etc目录下是没有sysctl.conf文件的,并且容器内部也没有sysctl命令

后面我在gitbub看到了有人说这个问题,原来单个容器时无法修改这个选项的,需要在宿主机修改/etc/sysctl.conf,然后重新启动或运行命令“sysctl vm.overommit_memory=1”以使其生效

原帖地址如下

Warning about memory overcommit at start up · Issue #346 · docker-library/redis · GitHub

后面在宿主机上的/etc目录下修改sysctl.conf文件,并且执行了sysctl vm.overommit_memory=1命令,然后删掉原来的容器重新启动了一个容器,这时日志就没有这个警告了。

后面还有一些其他警告,懒得去管了,既然跑起来了那就是不存在[手动狗头],有需要的自行查询

原文地址:https://blog.csdn.net/CNBDZGL/article/details/134680671

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_42535.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注