Docker Compose部署三主三从Redis集群需两阶段启动:先启6个节点并确保就绪,再用redis-cli --cluster create初始化,严格配对主从、固定端口(7000–7005)、声明总线端口(+10000)、关闭protected-mode、统一密码及开启AOF持久化。

明确节点角色与端口绑定
6 个节点必须严格配对:3 个主节点(7000–7002)各带 1 个从节点(7003–7005),不能混用或跳号。每个节点需固定容器内端口(如 6379)并映射到宿主机唯一端口(如 7000:6379),同时声明总线端口(cluster-announce-bus-port 17000)。所有节点配置中必须包含:
cluster-enabled yescluster-config-file nodes.confcluster-node-timeout 5000-
protected-mode no(否则节点握手失败) -
appendonly yes(保障 AOF 持久化)
用统一模板生成配置,避免手写错误
不建议为每个节点单独维护一份 redis.conf。推荐做法是:写一个含占位符的模板(如 PORT=7000、ANNOUNCE_IP=redis-node1),再用 envsubst 或脚本批量生成 6 份配置文件。每份配置中,port、cluster-announce-port 和 cluster-announce-bus-port 必须严格匹配实际暴露端口,否则集群无法识别节点身份。
分阶段启动:先就绪,再建簇
Docker Compose 启动本身不等于集群就绪。正确流程是两步:
- 第一阶段:
docker-compose up -d启动全部 6 个节点,等待日志显示Ready to accept connections且无报错 - 第二阶段:进入任意一个容器,执行初始化命令:
redis-cli --cluster create redis-node1:6379 redis-node2:6379 redis-node3:6379 redis-node4:6379 redis-node5:6379 redis-node6:6379 --cluster-replicas 1
该命令会自动分配槽位(0–5460 / 5461–10922 / 10923–16383),并建立主从配对关系。注意:所有节点必须已运行且网络互通,否则报 Node is not empty 或 Connection refused 错误。
网络与持久化必须显式定义
默认 bridge 网络不支持服务名解析和跨容器稳定通信。必须在 docker-compose.yml 中声明自定义网络:
- 用
driver: bridge(单机)或driver: overlay(Swarm),并为所有 Redis 服务指定同一networks - 每个节点挂载独立命名卷(如
redis-data-1),不可共用 host 路径,避免数据覆盖 - 敏感配置(如密码)通过
.env文件注入,启动命令中只写redis-server /usr/local/etc/redis.conf,不硬编码参数
验证与收尾
初始化完成后,用 redis-cli -c -p 7000 连入任一节点,执行 cluster nodes 查看 6 个节点状态是否均为 connected;再用 cluster info 确认 cluster_state: ok 和 cluster_known_nodes: 6。若某节点显示 fail,大概率是总线端口未开放或 protected-mode 未关闭。


















