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

如何在Docker Compose中模拟Redis集群网络隔离故障场景?

模拟Docker Compose环境下Redis集群的网络隔离故障场景

Docker Compose完全支持这类网络故障模拟需求,下面提供两种可行的解决方案,覆盖静态配置和动态故障模拟场景:

方案一:多网络划分(静态配置+动态切换)

通过创建专属隔离网络,限制storage服务仅能访问指定Redis主节点,其余节点保留在原网络中:

1. 调整docker-compose.yml网络配置

新增一个内部隔离网络,同时修改Redis节点和storage的网络关联:

networks:
  my-network:
    ipam:
      driver: default
      config:
        - subnet: 172.28.0.0/16
    # 保留原网络配置,供Redis集群内部通信
  isolated-storage-net:
    driver: bridge
    internal: true # 仅允许容器内部访问,禁止外部连通

# 可被storage访问的Redis主节点(同时加入两个网络)
redis-master-1:
  image: redis
  networks:
    my-network:
      ipv4_address: 172.28.0.10
    isolated-storage-net: {}
  ports:
    - 7000:7000
    - 17000:17000

# 其他Redis主/从节点(仅保留在my-network)
redis-master-2:
  image: redis
  networks:
    my-network:
      ipv4_address: 172.28.0.11
  ports:
    - 7001:7000
    - 17001:17000

redis-slave-1:
  image: redis
  networks:
    my-network:
      ipv4_address: 172.28.0.20
  # 省略其他从节点配置...

# storage服务仅连接隔离网络
storage:
  # 你的storage镜像及其他配置
  networks:
    isolated-storage-net: {}

2. 动态切换故障状态(运行中模拟)

如果不需要提前配置,可在服务运行后通过Docker命令调整网络:

  • 将storage从原网络断开:docker network disconnect my-network storage
  • 将目标Redis主节点加入隔离网络:docker network connect isolated-storage-net redis-master-1
    此时storage仅能访问该Redis节点,其余节点仍在my-network中正常通信,但无法被storage访问。

方案二:iptables规则阻断(快速临时模拟)

直接通过iptables规则限制storage到指定Redis节点的网络流量,无需修改docker-compose配置:

1. 获取容器固定IP

确保storage和Redis节点在docker-compose中配置了固定IPv4地址(如你示例中的172.28.x.y),避免重启后IP变化。

2. 添加阻断规则

假设storageIP为172.28.0.30,需要隔离的Redis节点IP为172.28.0.11、172.28.0.12:

# 阻断storage到目标Redis节点的业务端口和集群端口
iptables -A DOCKER-USER -s 172.28.0.30 -d 172.28.0.11 -p tcp --dport 7000 -j DROP
iptables -A DOCKER-USER -s 172.28.0.30 -d 172.28.0.11 -p tcp --dport 17000 -j DROP
iptables -A DOCKER-USER -s 172.28.0.30 -d 172.28.0.12 -p tcp --dport 7000 -j DROP
iptables -A DOCKER-USER -s 172.28.0.30 -d 172.28.0.12 -p tcp --dport 17000 -j DROP

3. 恢复网络

删除对应规则即可恢复正常访问:

iptables -D DOCKER-USER -s 172.28.0.30 -d 172.28.0.11 -p tcp --dport 7000 -j DROP
iptables -D DOCKER-USER -s 172.28.0.30 -d 172.28.0.11 -p tcp --dport 17000 -j DROP

注意事项

  • 多网络方案中,Redis集群的主从同步、节点间通信不受影响,所有Redis节点仍在my-network中正常交互,仅storage的访问范围被限制。
  • iptables方案需注意规则的优先级,使用DOCKER-USER链是Docker官方推荐的自定义规则位置,不会被Docker自身的网络规则覆盖。
  • 端口映射仅需在my-network中配置,容器内部网络访问无需依赖端口映射,直接使用容器IP+端口即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 14:55:22