目录
一.复制以及使用自定义的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或者docker-compose启动redis时,如果想用自定义的redis.conf文件启动redis,有两种方式获取默认的redis.conf文件。
1.在官网拷贝对应版本的配置文件内容新建redis.conf文件进行粘贴。(推荐)
官网配置文件地址:
Redis configuration | Redis
需要点击你的redis对应的版本去复制,这里我用的是redis7.2.3,所以点击7.2的版本,点进去复制全部即可。
2.也可以去官网下载对应版本的redis的tar.gz包,解压后在根目录下找到redis.conf文件复制也可也可。
官网所有版本redis下载地址:
Index of /releases/
推荐第一种方法,方便省事,并且第二种方法有些特殊的镜像版本可能不知道对应哪个版本的tar.gz包。
不管哪种方式,注意一定要对应版本,不然启动会报配置文件相关的错误。
然后将此文件放置在你想挂载的目录下进行挂载,可以直接将redis.conf文件存放目录挂载(目录挂载时容器内的路径最好是一个新创建的路径,不然用容器内已有目录进行挂载那这个目录下其他的文件或者目录就没了),或者也可以直接挂载到conf文件就不会影响到其他文件或者目录(但是配合sentinel搭建集群的时候就不能挂载到文件,会没有权限写入的,需要挂载到目录),挂载好后按照下面的配置进行修改,然后启动时在docker run命令或者docker-compose文件中command参数部分中加上redis-server <你的容器内conf文件存放路径>/redis.conf。
二.配置redis.conf文件(这里有个小坑)
redis不管是常规安装或者docker/docker-compose安装配置除了第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.将protected-mode改为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的默认数据保存目录(rdb与aof数据保存都是在这个文件夹下)是在执行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指定日志存储机制,max-size为单个日志最大容量,max-file为最多的日志文件个数。
四.关于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 add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl 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命令,然后删掉原来的容器重新启动了一个容器,这时日志就没有这个警告了。
后面还有一些其他警告,懒得去管了,既然跑起来了那就是不存在[手动狗头],有需要的自行查询。