docker安装redis(单机)
docker 安装 Redis
拉取镜像
docker pull redis
创建目录
mkdir /tool/redis
镜像里不包含配置文件,需要拉取redis配置文件,查看 一定要注意redis版本
下载完成直接通过ftp传到/tool/reids
目录下就行
因为是官方配置,需要我们手动改下配置:
# 常用配置
bind 127.0.0.1 # 注释掉这部分,使redis可以外部访问
daemonize no # 用守护线程的方式启动 docker启动这个改不改无所谓
requirepass 你的密码 # 给redis设置密码
appendonly yes # redis持久化 默认是no
tcp-keepalive 300 # 防止出现远程主机强迫关闭了一个现有的连接的错误 默认是300
创建容器
docker run -d \
-p 6379:6379 \
--name redis \
--restart=always \
--privileged=true \
-v /tool/redis:/usr/local/redis \
-v /tool/redis/redis.conf:/etc/redis/redis.conf \
redis:latest
redis-server /etc/redis/redis.conf
进入redis容器
[root@VM-4-7-centos redis]# docker exec -it redis bash
root@e4e0a72ace3d:/data# redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379>
如果要配置远程连接需要几个前提:
- 注释掉配置
bind 127.0.0.1
- 开放端口6379
docker启动redis常见问题和警告
以下是我通过docker部署redis时碰到的一些问题:
1.Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
机翻:警告:未指定配置文件,使用默认配置。要指定配置文件,请使用 redis-server /path/to/redis.conf
原因:配置文件未指定,docker拉取redis是没有配置文件的,可以手动让redis通过配置文件启动
# 前提,容器内部包含redis.conf,但是没有,所以需要去挂载宿主机的配置文件到容器内部,参考上方的redis启动命令
docker run --name redis -p 6379:6379 -d redis:latest redis-server /etc/redis/redis.conf
2.WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. 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.
机翻:警告 overcommit_memory设置为 0!在内存不足的情况下,后台保存可能会失败。要解决此问题,请将“vm.overcommit_memory = 1”添加到 /etc/sysctl.conf,然后重新启动或运行命令“sysctl vm.overcommit_memory=1”以使其生效。
个人解决方法:修改宿主机的内核参数vm.overcommit_memory
,默认为0
vim /etc/sysctl.conf
# 添加以下行,保存
vm.overcommit_memory = 1
# 查看是否修改成功
sysctl -p
3.WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
机翻:警告:无法强制执行 TCP 积压设置 511,因为 /proc/sys/net/core/somaxconn 设置为较低的值 128。
个人在网上看到的解决方法都是修改宿主机的sysctl.conf文件中net.core.somaxconn
(内核参数 tcp最大连接值),修改完成后重启docker,重启redis都没用。docker的内核参数基本都是继承自宿主机的。但是为什么修改docker不生效,我还是有点懵,如果有大佬们知道并有幸看到这个贴子,麻烦指点下
具体解决方法:在创建redis容器时手动指定内核参数(docker容器的内核参数,不是宿主机的)参考
docker run -d \
-p 6379:6379 \
--name redis \
# 指定内核参数
--sysctl net.core.somaxconn=511 \
--restart=always \
--privileged=true \
redis:latest
注意
如果要解决上面这个警告,并且采用手动指定docker内核(也就是往宿主机里添加规则)的方式,会导致当前redis不能通过远程连接。解决这个远程连接问题有两种方式:
-
直接重启加载宿主机配置,并重启dokcer,缺点就是需要重启下docker,我采用的是这种,至于还有没有其他问题还没发现
systemctl daemon-reload systemctl restart docker
-
禁用docker往iptables添加规则,让docker访问采用nat模式,缺点就是也需要重启docker,容器内无法获取得到客户端的真实 IP,常常nginx 日志上记录的是 docker0 网络的子网 IP,参考
vi /usr/lib/systemd/system/docker.service # 添加 --iptables=false systemctl daemon-reload systemctl restart docker # 开启 NAT 转发 firewall-cmd --permanent --zone=public --add-masquerade # 检查是否允许 NAT 转发 firewall-cmd --query-masquerade # 禁止防火墙 NAT 转发 firewall-cmd --remove-masquerad