无法从Docker宿主机及其他容器连接Redis的排查求助
我来帮你一步步排查这个Redis在Docker环境下的连接异常问题,从你描述的症状来看,核心问题大概率和Redis的监听配置有关,咱们逐条梳理:
检查Redis的绑定地址配置
你提到Redis绑定的是127.0.0.1,这是容器内部的回环地址——意味着Redis只会响应来自容器自身的请求,完全不会监听容器的桥接网络接口(比如172.18.0.2)或者端口映射过来的宿主机请求。这就完美解释了所有症状:- 容器内可以正常连接:因为请求走的是容器自身的回环接口
- 宿主机连接后被断开:端口映射把请求转到容器的eth0接口,但Redis没监听这个接口,内核会主动终止连接
- 同网络容器连不上:其他容器请求的是容器的私有IP,Redis根本没在这个IP上监听
解决方法:把
redis.conf里的bind 127.0.0.1改成bind 0.0.0.0(监听所有可用接口,最灵活),或者绑定容器的私有IP(比如172.18.0.2,但不如前者通用)。确认自定义配置文件是否被正确加载
你说已经设置了protected-mode no,但要注意:如果启动Redis容器时没有明确指定加载你的自定义redis.conf,默认的Redis镜像会用内置的默认配置,你的修改根本没生效。
比如正确的启动命令应该是这样(假设你的配置文件在宿主机/opt/redis/redis.conf路径):docker run --name redis -p 6379:6379 -d --net redisnet -v /opt/redis/redis.conf:/etc/redis/redis.conf redis redis-server /etc/redis/redis.conf你可以进入容器执行以下命令,确认当前生效的配置是不是你预期的:
redis-cli config get bind redis-cli config get protected-mode验证Redis的实际监听端口
进入Redis容器,执行以下命令查看Redis的监听状态:# 如果容器有netstat工具 netstat -tulpn | grep redis-server # 如果容器只有ss工具 ss -tulpn | grep redis-server如果输出只有
127.0.0.1:6379,就坐实了绑定地址的问题;如果是0.0.0.0:6379,再往下排查。检查容器网络归属与连通性
确认Redis容器和其他容器确实在同一个redisnet网络里:# 查看redis容器的网络信息 docker inspect redis | grep -A 10 Networks # 查看apiserver容器的网络信息 docker inspect apiserver | grep -A 10 Networks另外,可以在apiserver容器里ping一下Redis容器的IP(
172.18.0.2),先确认网络层是通的:docker exec -it apiserver ping 172.18.0.2查看Redis完整启动日志
虽然你设置了debug级别,但建议查看Redis容器的完整启动日志,确认启动时的配置加载情况:docker logs redis日志里会明确显示Redis监听的地址,比如
* Listening on 127.0.0.1:6379或者* Listening on 0.0.0.0:6379,这能直接验证绑定地址是否正确。排查宿主机连接的端口映射
虽然你说端口映射正常,但可以在宿主机上用以下命令确认宿主机确实在监听6379端口,并且是Docker进程在占用该端口:netstat -tulpn | grep 6379
内容的提问来源于stack exchange,提问作者nishant

