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
    image-20231024170952969

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不能通过远程连接。解决这个远程连接问题有两种方式:

  1. 直接重启加载宿主机配置,并重启dokcer,缺点就是需要重启下docker,我采用的是这种,至于还有没有其他问题还没发现

    systemctl daemon-reload
    systemctl restart docker
    
  2. 禁用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
    
posted @ 2024-09-05 17:12  plum_wink  阅读(155)  评论(0编辑  收藏  举报