You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker部署Redis主哨兵集群连接失败及Dockerfile正确性咨询

Redis容器连接失败与Dockerfile错误分析

问题根源:Docker CMD指令的特性

你遇到的连接拒绝问题,核心原因是Docker容器中多个CMD指令只有最后一条会被执行。你的Dockerfile里写了三个CMD:

CMD [ "redis-server", "/etc/redis/redis.conf" ]
CMD [ "redis-sentinel", "/etc/redis/sentinel.conf" ]
CMD [ "redis-sentinel", "/etc/redis/sentinel.conf" ]

这意味着只有最后一条redis-sentinel命令在运行,Redis主节点的redis-server进程根本没有启动!所以当你尝试连接127.0.0.1:6379时,端口上没有监听服务,自然会提示连接拒绝。

正确的Dockerfile写法:多进程管理

Docker容器默认是单进程模型,要同时运行多个进程(Redis主节点+2个哨兵),你需要用一个启动脚本或者进程管理工具来统筹。这里推荐最简单的启动脚本方案:

  1. 创建启动脚本start.sh
#!/bin/sh
# 启动Redis主节点(后台运行,避免阻塞后续命令)
redis-server /etc/redis/redis.conf &
# 启动第一个哨兵(后台运行)
redis-sentinel /etc/redis/sentinel.conf &
# 启动第二个哨兵(前台运行,保持容器存活)
redis-sentinel /etc/redis/sentinel.conf

给脚本添加执行权限:chmod +x start.sh

  1. 修改Dockerfile
FROM redis
COPY redis.conf /etc/redis/redis.conf
COPY sentinel.conf /etc/redis/sentinel.conf
COPY start.sh /usr/local/bin/start.sh
# 确保脚本可执行
RUN chmod +x /usr/local/bin/start.sh
# 执行启动脚本
CMD [ "/usr/local/bin/start.sh" ]

额外注意事项

  • Redis主节点配置:确保你的redis.conf中设置了bind 0.0.0.0(允许容器内外部访问),并且关闭了保护模式(protected-mode no),避免连接限制。
  • 哨兵配置:sentinel.conf中要正确指向Redis主节点,比如:
    sentinel monitor mymaster <主机A的IP> 6379 2
    
    这里的2是quorum值,因为总共有3个哨兵(主机A的2个+主机B的1个),需要至少2个哨兵同意才能进行主从切换。
  • 容器端口映射:启动容器时记得映射所需端口:Redis主节点的6379,哨兵默认的26379(如果需要外部访问哨兵的话),比如:
    docker run -d -p 6379:6379 -p 26379:26379 -p 26380:26380 --name rdbcontainer <你的镜像名>
    
    这里映射两个哨兵端口(26379和26380),因为你在主机A上跑了两个哨兵。

验证方法

启动容器后,先进入容器查看运行的进程:

docker exec -it rdbcontainer ps aux

你应该能看到一个redis-server进程和两个redis-sentinel进程。此时再执行redis-cli就能正常连接Redis主节点了。

内容的提问来源于stack exchange,提问作者Rahul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 19:17:51