最有效方式是直接修改Docker默认网段并禁用重叠子网:停止服务、清理docker0、配置daemon.json中bip与default-address-pools为隔离网段(如192.168.200.1/24及后续/24池),同步至集群所有节点,重建容器确保使用新网络栈。

直接改 Docker 默认网段并禁用重叠子网,是解决 IP 冲突引发集群网络瘫痪最有效的方式。默认的 172.17.0.0/16 很容易和企业内网、云 VPC 或其他容器平台(如 Kubernetes 的 Pod CIDR)撞车,一旦冲突,容器间通信中断、服务注册失败、健康检查超时,整个集群就“静默失联”——不是报错,而是无声断连。
确认是否真为 IP 冲突导致瘫痪
别急着改配置,先验证问题根源:
- 运行
docker network inspect bridge,重点看IPAM.Config.Subnet和IPRange是否不一致(比如 Subnet 是192.168.100.0/24,IPRange 却是172.99.0.0/16),这是典型配置错乱信号 - 执行
ip route,检查宿主机路由表里是否存在两条指向同一目标网段但出口不同的条目(例如同时有172.17.0.0/16 via docker0和172.17.0.0/16 via eth0),这会导致流量被错误转发或丢弃 - 在任意容器中执行
ping -c 3和ping -c 3,若前者通、后者不通,高度提示跨节点通信因子网重叠被内核路由策略拦截
永久性修复:重配 Docker 网络地址池
仅重启 Docker 或删掉个别网络治标不治本。必须从 daemon 层统一约束所有地址分配:
- 停止服务:
sudo systemctl stop docker containerd - 清理残留:
sudo ip link delete docker0 2>/dev/null || true;sudo brctl delbr docker0 2>/dev/null || true - 编辑
/etc/docker/daemon.json(不存在则新建),写入明确且隔离的网段:
{ "bip": "192.168.200.1/24", "default-address-pools": [ { "base": "192.168.201.0/24", "size": 24 }, { "base": "192.168.202.0/24", "size": 24 } ] } - 特别注意:
bip必须是宿主机未使用的 /24 子网网关地址;default-address-pools要避开公司内网(如10.0.0.0/8)、云平台 VPC(如阿里云常用172.16.0.0/12)、K8s Pod 网段(如10.244.0.0/16)
集群协同:统一各节点 Docker 网络策略
单点修复无法拯救集群——所有节点必须使用相同、互斥的地址池,否则跨节点容器仍会 IP 冲突:
- 将上述
daemon.json配置通过 Ansible / SaltStack / 或手动方式同步到全部工作节点 - 重启后,在每台节点执行:
docker network create --driver bridge --subnet=192.168.201.0/24 app-net,确保自定义网络也落在预设池内,避免docker-compose自动创建时又抢到旧网段 - 对已有容器,重建比迁移更稳妥:
docker-compose down && docker-compose up -d,强制使用新网络栈
预防机制:自动化冲突检测
靠人工排查太滞后。建议加入轻量级巡检:
- 写一个脚本定期运行:
docker network ls --format '{{.ID}}' | xargs -I{} docker network inspect {} 2>/dev/null | jq -r '.[].IPAM.Config[].Subnet',再与已知内网段比对 - 在 CI/CD 流水线部署前,校验
docker-compose.yml中ipam.config.subnet字段是否落在白名单范围内 - 监控项增加:
docker info | grep -i 'bridge.*subnet'变更告警,早于业务故障发现配置漂移











