关键在于网络隔离+精准路由:单机用独立自定义桥接网络(如project-a-net/project-b-net),跨主机需子网划分+主机路由打通,并通过docker compose声明式管理实现自动化隔离与互通。

要让多个 Docker 项目并行运行且互不干扰,关键不是“堆端口”,而是用网络隔离 + 精准路由组合实现灵活部署。核心思路是:同一主机上靠独立网桥隔离,跨主机时靠子网划分 + 主机路由打通。
为每个项目创建专属桥接网络
这是单机多项目最稳妥的方式。默认 bridge 网络不支持容器名解析、缺乏隔离性,必须用自定义网络替代。
- 为项目 A 创建网络:
docker network create --subnet=172.20.1.0/24 project-a-net - 为项目 B 创建网络:
docker network create --subnet=172.20.2.0/24 project-b-net - 启动容器时显式指定网络,例如:
docker run -d --name api-a --network project-a-net nginx - 同网络内服务可直接用容器名通信(如
curl http://api-a),无需硬编码 IP 或端口
跨主机容器直连需规划子网与路由
当项目分布在不同物理机时,不能只靠端口映射。必须避免 IP 冲突,并让主机能识别对方容器子网。
- 主机 A 上配置 Docker 使用
10.0.10.0/24子网(修改/etc/docker/daemon.json中的bip) - 主机 B 上配置 Docker 使用
10.0.20.0/24子网 - 在主机 A 添加路由:
ip route add 10.0.20.0/24 via 192.168.91.129(指向主机 B 的 IP) - 在主机 B 添加路由:
ip route add 10.0.10.0/24 via 192.168.91.128(指向主机 A 的 IP) - 确保两台主机防火墙放行对应子网流量(如
ufw allow from 10.0.20.0/24)
用 Docker Compose 自动化网络声明
避免手动管理容器网络,推荐用 Compose 声明式定义。它默认为每个 docker-compose.yml 创建独立网络,天然支持多实例隔离。
- 在
docker-compose.yml中定义 networks 段,指定 driver 和 subnet - 所有 services 默认接入该网络,内部通过服务名互通
- 如需跨项目调用(如项目 B 要访问项目 A 的 DB),可通过
external: true引用已存在的网络 - 配合
network_mode: "service:xxx"可复用另一容器的网络栈(适合调试或轻量集成)
验证与排障要点
网络配置后务必验证连通性,常见问题往往出在路由或 DNS 上。
- 进容器执行
ip a确认获取到预期子网 IP - 用
ping 容器名测试 DNS 解析是否生效(仅限自定义 bridge 网络) - 跨主机时,在源容器中
traceroute 目标容器IP,确认路径经过正确主机网关 - 检查宿主机
ip route show输出,确认子网路由已写入 - 若应用连接失败,先排除容器内是否绑定了
127.0.0.1(应改用0.0.0.0)











