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
相关产品推荐
相关产品推荐

