用docker-compose.yml搭redis哨兵集群需确保哨兵能正确发现主从关系、端口不冲突、配置不写死:哨兵必须挂载自定义sentinel.conf,监控名与服务名一致;从节点须设replica-announce-ip为自身service name;三个哨兵端口需宿主机唯一映射;禁用host网络,依赖bridge内置dns。

直接上结论:用 docker-compose.yml 搭 Redis 哨兵集群,关键不是堆服务数量,而是让哨兵容器能正确发现主从关系、监听端口不冲突、配置项不写死——否则启动后 SENTINEL get-master-addr-by-name 返回空或连不上,基本就是配置没对齐。
哨兵容器必须显式指定 sentinel.conf 并挂载,不能靠默认配置
Redis 官方镜像启动哨兵时,如果只传 redis-sentinel /etc/redis/sentinel.conf 但没提前准备好配置文件,它会用内置默认值(比如只监控 myredis 127.0.0.1:6379),而实际主从是不同容器 IP,必然失败。
- 每个
sentinel服务都要挂载自定义sentinel.conf,内容至少包含:sentinel monitor mymaster redis-master 6379 2(注意主机名用服务名redis-master,不是localhost) -
sentinel down-after-milliseconds和sentinel failover-timeout建议调大(如5000和60000),避免 Docker 网络抖动触发误判 - 配置里不要写
bind 0.0.0.0,Docker 内部通信走桥接网络,绑定0.0.0.0反而可能被外部干扰
redis-master 和 redis-slave 必须启用 replica-announce-ip
从节点在向主节点注册自己时,默认用容器内网 IP(如 172.20.0.3),但哨兵运行在另一容器里,它通过主节点获取从节点地址后,会尝试直连这个 IP —— 这个 IP 在宿主机或其它容器里根本不可达,导致 INFO replication 显示从节点状态为 connecting 或 down。
- 主节点无需额外配置,但每个从节点必须加启动参数:
redis-server --port 6379 --replica-of redis-master 6379 --replica-announce-ip redis-slave1 --replica-announce-port 6379 - 对应到
docker-compose.yml就是command字段,且replica-announce-ip的值必须和该服务在 Compose 中定义的 service name 一致(如redis-slave1) - 别用
hostname:字段替代,Docker 不保证 hostname 被 DNS 解析;依赖服务名才是 Compose 内置 DNS 的可靠方式
三个哨兵必须使用不同端口并暴露到宿主机(调试必需)
哨兵之间要互相通信,也要接受客户端查询,如果全绑在 26379 并只暴露一个,会导致部分哨兵无法被访问,SENTINEL sentinels mymaster 查不到全部节点。
- 每个
sentinel服务的ports需唯一映射,例如:- "26379:26379"、- "26380:26379"、- "26381:26379" - 对应地,每个
sentinel.conf里要配port 26379(容器内端口),但启动命令里不用改,因为镜像默认就是26379 - 不暴露端口也能跑,但你没法用
redis-cli -p 26379连上去查状态,出问题时只能进容器exec,效率极低
网络模式必须用 default(bridge)且禁用 network_mode: host
有人为了省事把所有服务设成 host 网络,结果哨兵报告的主节点地址变成 127.0.0.1:6379,客户端一连就连到自己宿主机的 Redis(如果装了的话),或者直接拒绝连接。
- 保持默认 bridge 网络,让 Compose 自动创建内部 DNS,服务名可互通
- 所有容器都不要写
network_mode: host,包括哨兵——它必须通过服务名访问redis-master和redis-slave1 - 如果需要从宿主机访问,只靠
ports暴露即可,不需要改网络模式
最常被跳过的细节是:哨兵配置里的 sentinel monitor 第二个参数必须和主服务的 service name 完全一致,大小写、横线都不能错;而从节点的 replica-announce-ip 必须和它自己的 service name 一致。这两个字符串对不上,整个集群就卡在「发现不了从节点」或「切主后客户端连不到新主」的状态,日志里只显示 +sdown 却不触发 +odown,排查起来特别耗时间。











