Compose 网络与服务发现是什么
Compose 默认会为项目创建一个名为 <项目名>_default 的网络,所有服务接入其中,并以服务名作为 DNS 主机名互相访问。需要隔离或接入已有网络(例如统一的入口反向代理)时,在顶层 networks 段自定义网络再在服务下引用:internal: true 可以切断外部出口只保留内部互访,external: true 用于接入已经存在的网络。理清默认网络与服务名解析,能避开大量『容器之间连不上』的问题。
基本信息
| 默认网络 | 未声明时自动创建 <项目>_default,服务名可直接互访 |
|---|---|
| 自定义网络 | 顶层 networks 段声明,服务下用 networks: [backend] 引用 |
| internal | internal: true 切断外网出口,仅保留内部互访 |
| aliases | 为服务在指定网络上追加额外的 DNS 名 |
| external | external: true 接入已有网络,用于多个部署栈互联 |
典型使用场景
- 按层级拆网:前端接对外网络,数据库只接后端网络,减少暴露面
- 接入统一入口网络,让多个项目的服务共用一个反向代理
- 多个 Compose 项目之间互访,通过共享的外部网络实现
- 数据库置于内部网络并切断外网出口,提升安全性同时不影响应用访问
- 用别名固定访问域名,服务改名时调用方配置不受影响
示例
示例
services:
web:
networks: [frontend, backend]
db:
networks: [backend]
networks:
frontend:
backend:
internal: true
验证网络与解析
验证网络与解析
docker compose exec web getent hosts db # 容器内验证服务名能否解析
docker network ls # 查看项目创建了哪些网络
docker network inspect <项目名>_backend # 确认哪些容器接入了该网络网络配置与效果
| 配置 | 效果 | 注意 |
|---|---|---|
| 未声明 networks | 自动创建默认网络,服务名互访 | 所有服务同处一张网,缺少隔离 |
| internal: true | 无外网出口 | 宿主与外部客户端无法直连 |
| external: true | 接入已存在网络 | 网络需预先创建,名称必须完全一致 |
| aliases | 追加 DNS 名 | 与容器名重复时解析优先级需实测确认 |
同一服务接入多个网络时容器会有多张网卡:应用需要绑定到所有地址(如 0.0.0.0)才能在所有网络上都被访问到,只监听某一个网卡地址时另一张网卡上不可达。
把数据库只放在 internal 网络后就无法从宿主直接连接:本地客户端连不上并不代表服务故障,需要经跳板容器或临时接入同一网络排查。