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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 05:43:15