Docker Bridge网络迁移指将容器从默认docker0迁至自定义Bridge网络,核心是重建容器并指定新网络,以实现DNS解析、网络隔离与避免IP冲突。需确认端口映射、禁用硬编码IP、排除host/none网络容器,再创建新网桥、逐个重建容器、验证名称解析与连通性,支持零停机双网桥切流。

Docker Bridge 网络迁移,通常指将容器从默认 docker0 网络迁移到自定义 Bridge 网络,或在不同自定义网桥之间切换。这不是“停机搬迁”,而是通过重建+重连实现平滑过渡,核心目标是:保留服务逻辑、避免硬编码 IP、维持容器间可解析通信。
一、为什么要迁移?常见触发场景
- 容器名无法互相访问(默认 bridge 不支持 DNS 解析)
- 默认子网
172.17.0.0/16与企业内网冲突(如办公网也是172.17.x.x) - 多项目混跑导致广播风暴或端口映射混乱
- 需要网络隔离(如 dev/test/prod 分网)
- 升级到支持服务发现的网络拓扑(为后续接入 Swarm 或 Service Mesh 做准备)
二、迁移前必须确认的三件事
- ✅ 所有容器已使用
-p显式暴露端口(若依赖宿主机端口,迁移后映射规则不变) - ✅ 应用不硬编码
172.17.x.x这类 IP(应改用容器名或环境变量) - ✅ 没有容器直接绑定
--network host或--network none(这类容器需单独处理)
三、标准迁移操作流程(推荐分步执行)
创建新网桥
docker network create \ --driver bridge \ --subnet 192.168.100.0/24 \ --gateway 192.168.100.1 \ app-net
提示:子网避开常用局域网段(如
192.168.1.x),避免与物理网络冲突。
停止并重建容器(关键步骤)
逐个操作,不批量停机:
# 1. 查看原容器配置(记下镜像、端口、卷、环境变量等) docker inspect web1 | jq '.[0].HostConfig.PortBindings, .[0].Config.Env, .[0].Mounts' # 2. 停止旧容器 docker stop web1 # 3. 用相同参数启动,但指定新网络 docker run -d \ --name web1 \ --network app-net \ -p 8080:80 \ -v /data:/usr/share/nginx/html \ -e ENV=prod \ nginx:alpine
⚠️ 注意:不要用
docker commit + docker run --network,会导致配置丢失;务必用原始启动参数重建。
验证通信是否正常
进入任一容器,测试名称解析和连通性:
docker exec -it web1 sh -c "ping -c 2 db && curl -s http://db:3306"
- 若能 ping 通
db(而非192.168.100.3),说明 DNS 生效 ✅ - 若
curl返回 MySQL 协议头(非 connection refused),说明端口可达 ✅
四、进阶技巧:零停机迁移(适用于生产服务)
对不能中断的服务(如 API 网关、数据库代理),可用「双网桥共存 + 切流」策略:
- 新建
app-net并让新版本容器先加入 - 旧容器仍运行在
docker0,新容器运行在app-net - 通过反向代理(Nginx / Traefik)把流量逐步切到新容器
- 确认稳定后,再停旧容器、清理
docker0上残留
补充:Docker 允许单容器连接多个网络(
--network app-net --network legacy),可用于临时跨网通信调试。
五、迁移后清理与验证
- 删除无用容器和旧网络(确认无依赖后再执行):
docker network rm bridge # ❌ 错误!不能删默认 bridge docker network rm my-old-net # ✅ 只删自定义网桥
- 检查 DNS 是否生效:容器内
cat /etc/resolv.conf应含127.0.0.11 - 查看路由表:
ip route中默认网关应为新网桥网关(如192.168.100.1)
不复杂但容易忽略


















