docker compose 通过网络分层、显式连接和内置 dns 解析实现多容器路由,无需手动配置路由表或 iptables;服务按业务层级划分独立网络,仅加入所需网络以控制通信范围,并依赖服务名自动 dns 解析完成跨容器调用。

用 Docker Compose 处理多容器间复杂网络路由,核心不是写路由表,而是靠网络分层 + 显式连接 + DNS 自动解析来实现逻辑控制。它不依赖 iptables 或手动配置 IP 路由,Docker 内部已封装好这一层。
明确服务归属的网络拓扑
默认所有服务都在同一个 _default 网络里,彼此能通——但这不适合生产。复杂场景下要先拆网络,再按需连接。
- 每个业务层级(如 frontend、backend、db)定义独立网络,用
networks根级字段声明 - 服务只加入它真正需要通信的网络,比如 Web 前端连
frontend和backend,数据库只连backend - 这样 DB 就不会出现在 frontend 网络中,宿主机或外部请求根本无法直接 ping 到它,也不被 DNS 解析
利用服务名自动 DNS 解析
Docker Compose 的内置 DNS 是关键:只要服务在同一个网络里,就能用服务名当主机名访问,不需要写死 IP 或端口映射。
- 例如
web服务要连db,代码里直接写postgres://db:5432即可 - 如果
web同时接入frontend和backend两个网络,它既能被浏览器通过web:80访问(frontend 网络),也能主动调用db:5432(backend 网络) - 注意:跨网络的服务名不可解析,比如
db不在frontend网络里,curl db在前端容器里会失败
控制流量走向的三种实用手段
路由效果不是靠“转发规则”,而是靠“谁连谁”和“谁暴露谁”来达成:
-
ports:只影响宿主机访问。比如
- "8080:80"表示把宿主机 8080 映射到容器 80,但不影响容器间通信 - network_mode: host:让某个服务直接用宿主机网络,适合需要高性能或绑定特权端口(如 80/443)的反向代理,但会失去隔离性
- internal: true:在自定义网络里设这个属性,该网络就完全不能出外网,也不能被宿主机访问,只用于内部服务互通(比如 DB 网络)
跨项目或复用网络的连接方式
当多个 Compose 项目需要互通(比如共用一个 Redis),或者已有网络想复用,就用 external。
- 先用命令创建网络:
docker network create my-shared-net - 在任一
docker-compose.yml中引用:networks: { shared: { external: true, name: my-shared-net } } - 然后把需要互通的服务都加进这个
shared网络,它们就能通过服务名通信,不管属于哪个项目 - 注意:external 网络不会被
docker-compose down删除,得手动清理











