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

Docker跨2台服务器部署6节点Redis集群的网络问题排查

Redis集群部署问题排查与解决

问题背景

我要在Docker环境搭建Redis集群,6个节点分2台服务器部署,每台3个节点。已完成以下操作:

  • 创建Docker Swarm集群(管理节点初始化+工作节点加入)
  • 创建了overlay类型的redis-cluster网络
  • 编写了docker-compose.yml配置文件及redis-node1.conf节点配置文件

已用配置与命令

docker-compose.yml

version: '3.8'
networks:
  redis-cluster:
    driver: overlay
    external: true

services:
  redis-node-1:
    image: redis:7.0
    container_name: redis-node-1
    volumes:
      - ./config/redis-node1.conf:/usr/local/etc/redis/redis.conf
      - ./data/redis-node1:/data
      - ./logs/redis-node1:/var/log/redis
    ports:
      - "7001:6379"
      - "17001:16379"
    networks:
      redis-cluster:
        ipv4_address: 172.18.0.11
    command: redis-server /usr/local/etc/redis/redis.conf

redis-node1.conf

port 6379
bind 0.0.0.0
cluster-announce-ip 172.18.0.11
cluster-enabled yes
cluster-config-file nodes-7001.conf
cluster-node-timeout 5000
appendonly yes
dir /var/lib/redis/7001
logfile /var/log/redis/redis-7001.log
pidfile /var/run/redis-7001.pid
requirepass DevRedis01
masterauth DevRedis01
cluster-require-full-coverage no

网络创建命令

docker swarm init --advertise-addr <server-ip>
docker swarm join --token <your-token> <manager-ip>:2377
docker network create --driver overlay --subnet=172.18.0.0/16 redis-cluster

遇到的问题

执行sudo docker-compose up -d时,出现Swarm模式需使用docker stack deploy的警告,同时报错:Cannot start service redis-node-*: network redis-cluster not found,想确认创建网络时是否有遗漏。


问题原因与解决步骤

1. 核心问题:Swarm模式下的部署命令与网络兼容性

docker-compose up是单节点Docker的部署命令,在Swarm集群环境下不适用——Swarm集群的服务必须用docker stack deploy来部署。这也是警告的直接原因,同时单节点的docker-compose无法识别Swarm集群级别的overlay网络,导致“network not found”错误。

2. 网络创建的修正与验证

先检查Swarm集群中是否存在redis-cluster网络:

docker network ls

如果找不到该网络,重新在Swarm管理节点执行创建命令,建议加上--attachable参数(允许非Swarm服务临时连接,避免识别问题):

docker network create --driver overlay --subnet=172.18.0.0/16 --attachable redis-cluster

3. 适配Swarm的docker-compose.yml调整

Swarm模式下有两个配置不能用,必须移除:

  • container_name:Swarm会自动生成容器名称,固定名称会导致部署失败
  • ipv4_address:Swarm的overlay网络会自动分配IP,手动指定易引发冲突

调整后的单节点配置示例:

version: '3.8'
networks:
  redis-cluster:
    driver: overlay
    external: true

services:
  redis-node-1:
    image: redis:7.0
    volumes:
      - ./config/redis-node1.conf:/usr/local/etc/redis/redis.conf
      - ./data/redis-node1:/data
      - ./logs/redis-node1:/var/log/redis
    ports:
      - "7001:6379"
      - "17001:16379"
    networks:
      - redis-cluster
    command: redis-server /usr/local/etc/redis/redis.conf
    deploy:
      placement:
        constraints: [node.hostname == <server1-hostname>] # 指定部署到第一台服务器

同理复制出另外5个节点的配置:

  • redis-node-2、redis-node-3:修改端口、挂载目录、配置文件路径,deploy.placement.constraints指定为第一台服务器的主机名
  • redis-node-4、redis-node-5、redis-node-6:对应第二台服务器的端口、挂载路径,约束部署到第二台服务器

4. 正确的Swarm部署命令

在Swarm管理节点执行:

docker stack deploy -c docker-compose.yml redis-cluster-stack

5. Redis配置的关键修正

cluster-announce-ip不能用overlay网络的内部IP(172.18.0.11),必须设置为节点所在服务器的可被集群其他节点访问的IP(比如公网IP或局域网IP),否则跨服务器的Redis节点无法通信。同时建议显式声明集群端口:

cluster-announce-ip <server1-accessible-ip>
cluster-announce-port 7001
cluster-announce-bus-port 17001

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 03:02:13