在 compose.yml 中通过定义多个自定义 bridge 网络并显式分配服务接入,可实现业务组间网络隔离;需禁用默认 network、避免跨网接入,并验证容器间不可互通及 dns 解析受限。

在 compose.yml(即 Docker Compose v2+ 的默认配置文件)中,通过定义自定义桥接网络并显式分配服务到对应网络,可实现不同业务组之间的网络隔离。关键在于:不依赖默认的 `default` 网络,而是为每组业务创建独立的自定义网络,并只让相关服务接入该网络。
定义多个自定义桥接网络
在 networks 顶层键下声明多个网络,指定驱动为 bridge,并可选配子网、网关等以增强可控性:
networks:
frontend-net:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/24
<p>backend-net:
driver: bridge
ipam:
config:</p>
- subnet: 172.21.0.0/24
admin-net: driver: bridge ipam: config:
- subnet: 172.22.0.0/24
每个网络拥有独立 IP 段,天然隔离 —— 不同网络中的容器默认无法互相通信,即使知道对方容器名或 IP 也不通。
按业务组分配服务到对应网络
在各服务的 networks 配置中,**只列出其所属业务组的网络**,不跨接其他网络。例如:
services:
web:
image: nginx:alpine
networks:
- frontend-net
<p>api:
image: myapp/api:v1
networks:</p>
- backend-net
dashboard: image: myapp/admin:v1 networks:
- admin-net
若需跨组通信(如 API 调用管理后台),才显式加入多个网络
sync-worker:
image: myapp/sync
networks:
- backend-net
- admin-net
- web 只在
frontend-net中,无法直接访问api或dashboard - api 和 dashboard 彼此不可见,即使它们都运行在同一台宿主机上
- 如确需有限互通(如后台任务调用 API),再按需将服务加入多个网络,而非默认全连
禁用默认网络,避免意外互通
Docker Compose 默认会为项目创建一个隐式 default 网络,并把所有服务自动接入 —— 这会破坏隔离效果。必须显式关闭:
services:
web:
image: nginx:alpine
networks:
- frontend-net
# 关键:不写 networks: [],而是确保没挂 default 网络
# 同时在顶层 networks 中不要定义名为 "default" 的网络
<h1>✅ 正确做法:不声明 default 网络,且各服务 network 列表中不含 default</h1><h1>❌ 错误:networks: ["default", "frontend-net"] —— 会重新启用默认网络</h1><p></p>若想彻底杜绝,默认网络不会被创建;只要所有服务都指定了明确的自定义网络,Compose 就不会生成 default 网络。
验证隔离是否生效
启动后进入某容器,尝试 ping 或 telnet 其他组的服务名或 IP:
-
docker compose exec web sh→ping api应失败(无路由) -
docker network inspect <network-name></network-name>查看各网络中实际连接的容器列表 -
docker compose ps结合--format或查看输出的 NETWORKS 列,确认服务归属正确
注意:DNS 解析也受网络限制 —— 容器只能解析同网络内的服务名,进一步强化逻辑隔离。











