docker compose 中“多网卡”实为服务接入多个自定义网络以实现流量隔离;需在 networks 下声明多个 bridge 网络,并在 services 的 networks 中指定所属网络,支持子网划分与连通性验证。

docker-compose.yml 里没有“多网卡接口”的概念,容器本身不挂载物理网卡;所谓“多网卡”实际是指让一个服务接入多个自定义网络(即多个逻辑网络),从而实现业务层面的流量隔离与路径控制。
明确目标:用多个网络代替“多网卡”
每个 Docker 自定义网络相当于一个独立的二层广播域(如 frontend、backend、cache)。服务通过声明 networks: [net-a, net-b] 同时接入多个网络,就能在不同业务平面间收发流量——这比绑定多个物理网卡更轻量、更可移植。
基础写法:定义网络 + 分配服务
在 docker-compose.yml 中分两步操作:
- 在顶层 networks: 下声明多个自定义网络(推荐全部设为 driver: bridge)
- 在各 services: 下用 networks: 列出该服务要加入的网络名
示例:
version: '3.8'
services:
web:
image: nginx
networks: [frontend]
<p>api:
image: my-api
networks: [frontend, backend]</p><p>redis:
image: redis:alpine
networks: [backend, cache]</p><p>db:
image: postgres
networks: [backend]</p><p>networks:
frontend:
driver: bridge
backend:
driver: bridge
cache:
driver: bridge
</p>
这样,api 就能同时与 web(走 frontend)和 db/redis(走 backend/cache)通信,而 web 完全无法直连 db 或 redis。
增强隔离:指定子网与 IP 范围
若需进一步避免地址冲突或做路由策略,可在 network 定义中加入 ipam 配置:
networks:
frontend:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/16
backend:
driver: bridge
ipam:
config:
- subnet: 172.21.0.0/16
cache:
driver: bridge
ipam:
config:
- subnet: 172.22.0.0/16
每个网络独占一个 CIDR 段,容器启动后自动分配对应网段 IP,便于监控、防火墙规则或调试时识别流量归属。
验证连通性:确认隔离是否生效
部署后,进容器测试跨网访问是否符合预期:
- docker exec -it web sh → ping api 应成功(同属 frontend)
- ping db 或 ping redis 应失败(不在同一网络)
- docker exec -it api sh → ping db 和 ping redis 均应成功(api 同时在 backend 和 cache)
失败即说明隔离有效;若意外通了,检查是否误将服务都加到了同一个网络,或存在默认网络未关闭(可通过 docker-compose down -v 彻底清理后重试)。











