compose networks 是什么
Compose 文件里的 networks 用来划分服务之间的网络边界。同一项目里没有显式指定网络的服务,会被放进名为「项目名_default」的自定义网络,在这张网里可以直接用服务名互相解析。服务级 networks 决定某个服务接入哪几张网,顶层 networks 则定义这些网络本身的驱动与选项。自定义网络自带内嵌 DNS,这是默认 bridge 网络不具备的能力,也是编排里靠服务名通信的基础。
基本信息
| 服务级字段 | networks: [网络名] 或网络名: {aliases: [...], ipv4_address: …} |
|---|---|
| 顶层字段 | networks: 网络名: {driver, driver_opts, internal, attachable, name, external, ipam} |
| 默认网络 | <项目名>_default,由 Compose 自动创建与删除 |
| 网络别名 | aliases 追加解析名,一个服务可有多个名字 |
| 跨项目共享 | 网络标 external: true 并给出已有网络名 |
| 解析机制 | 容器内 DNS 127.0.0.11,按服务名/别名/容器名解析 |
典型使用场景
- 前后端分层:前端只进边缘网络,数据库只进后端网络,减少横向可达面
- 把数据库网络标记 internal 禁止出网,降低数据外泄风险
- 多个 Compose 项目共用一张已存在的网络,实现跨项目服务互访
- 给服务起稳定别名,避免因服务改名导致连接串集体失效
- 按环境划分网络,让测试与开发的服务即使同名也互不干扰
- 做流量治理演练:把某个服务从网络里摘掉,观察上游的失败与重试行为
服务级与顶层写法
服务级与顶层写法
services:
api:
image: app/api:1.4.2
networks:
edge: {}
backend:
aliases:
- api.internal # 连接串里可用这个名字
db:
image: postgres:16-alpine
networks:
- backend # 只进后端网,前端访问不到
networks:
edge:
driver: bridge
backend:
driver: bridge
internal: true # 只有容器之间互通,不出外网接入共享网络(跨项目)
接入共享网络(跨项目)
services:
worker:
image: app/worker:1.4.2
networks:
- shared
networks:
shared:
external: true
name: platform-shared # 已存在的网络,Compose 只接入不创建顶层选项怎么读
| 选项 | 作用 | 注意事项 |
|---|---|---|
| driver | 网络驱动,常用 bridge | swarm 覆盖网络才用 overlay |
| internal | 禁止该网络访问外网 | 镜像拉取发生在构建阶段,不受影响 |
| external | 引用已存在网络不经手创建 | 缺 name 时会按项目名推断,容易接错 |
| name | 指定实际网络名 | 跨项目共享时必写 |
| attachable | 允许独立容器接入 | 排查时临时挂调试容器用 |
| ipam | 自定义子网与网关 | 只有与既有网段冲突时才需要 |
验证方式:docker network inspect <项目名>_<网络名> 看 Containers 列表与别名是否符合预期;容器内用 getent hosts 服务名 确认解析。
接入网络属于容器创建时的属性,改网络归属必须重建容器。多文件合并或多项目拼接时最容易漏网络,改完先跑 docker compose config 核对渲染结果。