Docker内部Redis集群无法被外部客户端连接的问题求助
Docker Redis集群外部连接问题解决方案
背景与配置
我通过以下docker-compose.yml在Docker中搭建Redis集群:
version: '3.9' services: redis-stack-node-1: image: redis:latest container_name: redis-stack-node-1 command: redis-server /redis/redis.conf volumes: - ./node1:/redis ports: - 7001:7001 networks: - redis-cluster redis-stack-node-2: image: redis:latest container_name: redis-stack-node-2 command: redis-server /redis/redis.conf volumes: - ./node2:/redis ports: - 7002:7002 networks: - redis-cluster redis-stack-node-3: image: redis:latest container_name: redis-stack-node-3 command: redis-server /redis/redis.conf volumes: - ./node3:/redis ports: - 7003:7003 networks: - redis-cluster redis-stack-node-4: image: redis:latest container_name: redis-stack-node-4 command: redis-server /redis/redis.conf volumes: - ./node4:/redis ports: - 7004:7004 networks: - redis-cluster redis-stack-node-5: image: redis:latest container_name: redis-stack-node-5 command: redis-server /redis/redis.conf volumes: - ./node5:/redis ports: - 7005:7005 networks: - redis-cluster redis-stack-node-6: image: redis:latest container_name: redis-stack-node-6 command: redis-server /redis/redis.conf volumes: - ./node6:/redis ports: - 7006:7006 networks: - redis-cluster redis-cluster-creator: image: redis:latest container_name: redis-cluster-creator command: redis-cli -p 7001 --cluster create redis-stack-node-1:7001 redis-stack-node-2:7002 redis-stack-node-3:7003 redis-stack-node-4:7004 redis-stack-node-5:7005 redis-stack-node-6:7006 --cluster-replicas 1 --cluster-yes depends_on: - redis-stack-node-1 - redis-stack-node-2 - redis-stack-node-3 - redis-stack-node-4 - redis-stack-node-5 - redis-stack-node-6 networks: - redis-cluster redis-insight: image: redislabs/redisinsight container_name: redis-insight ports: - 5540:5540 networks: - redis-cluster volumes: - ./redisinsight:/db depends_on: - redis-cluster-creator networks: redis-cluster: driver: bridge
每个Redis节点的redis.conf配置如下(端口和总线端口对应7001-7006、17001-17006):
port 7001 bind 0.0.0.0 protected-mode no cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes cluster-announce-port 7001 cluster-announce-bus-port 17001
集群在Docker内部运行正常,容器内可通过redis-cli实现节点间连接。Docker主机为带公网IP的Ubuntu系统。
问题
无法从外部客户端(如RESP.app、RedisInsight)连接集群:初始连接成功,但无法与集群交互。客户端检测到集群并重定向至单个节点时,节点返回Docker内部IP而非主机公网IP,导致连接失败。
已尝试操作:在redis.conf中设置cluster-announce-ip为主机公网IP,但节点无法加入集群。
解决方案
1. 完善Redis节点配置与端口映射
每个节点的redis.conf必须同时配置公网IP、对外端口和总线端口,且主机要映射总线端口:
port 7001 bind 0.0.0.0 protected-mode no cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes # 替换为你的主机公网IP cluster-announce-ip 1.2.3.4 # 与docker-compose中端口映射一致 cluster-announce-port 7001 # 总线端口,需在主机映射 cluster-announce-bus-port 17001
修改docker-compose.yml,给每个Redis节点添加总线端口映射(以node1为例,其他节点同理):
redis-stack-node-1: image: redis:latest container_name: redis-stack-node-1 command: redis-server /redis/redis.conf volumes: - ./node1:/redis ports: - 7001:7001 - 17001:17001 # 新增总线端口映射 networks: - redis-cluster
2. 修改集群创建命令为公网IP
原集群创建命令使用容器名,导致集群内部节点用容器名通信,外部客户端无法识别。需改为公网IP+端口:
redis-cluster-creator: image: redis:latest container_name: redis-cluster-creator # 替换为你的主机公网IP command: redis-cli -p 7001 --cluster create 1.2.3.4:7001 1.2.3.4:7002 1.2.3.4:7003 1.2.3.4:7004 1.2.3.4:7005 1.2.3.4:7006 --cluster-replicas 1 --cluster-yes depends_on: - redis-stack-node-1 - redis-stack-node-2 - redis-stack-node-3 - redis-stack-node-4 - redis-stack-node-5 - redis-stack-node-6 networks: - redis-cluster
3. 开放主机防火墙端口
在Ubuntu主机上开放所有相关TCP端口:
sudo ufw allow 7001:7006/tcp sudo ufw allow 17001:17006/tcp sudo ufw reload
4. 清理旧数据重新部署
之前的nodes.conf已保存旧节点信息,需删除后重新部署:
docker-compose down rm -rf ./node1/* ./node2/* ./node3/* ./node4/* ./node5/* ./node6/* docker-compose up -d
内容的提问来源于stack exchange,提问作者Minh Giang
相关产品推荐
相关产品推荐

