两个开关的差别
compose 的网络声明上有两个常被忽略的开关。internal: true 让这张网络没有到外网的出口,接进来的服务彼此互通但出不去;external: true 表示这张网络在项目之外已经存在,compose 只引用不改管——创建时不会替你建,删除项目时也不会替你删。两者可以组合:数据库放在 internal 网络上,再用一张 external 共享网络把别的项目连进来。
基本信息
| internal: true | 该网络无外网出口,仅网络内互通 |
|---|---|
| external: true | 引用项目外已有网络,可再写 name 指定具体名字 |
| 默认行为 | 不加开关时由 compose 创建并随项目删除 |
| 失败情形 | external 指定的网络不存在时,启动直接报错 |
典型使用场景
- 数据库隔离:只接 internal 网络,不给出网能力
- 跨项目共享网络:多个 compose 项目通过 external 引用同一张网络互通
- 减少自动创建的分散网络:把常用网络集中管理,避免项目各建一张
- 发布核对:确认哪些网络随项目删、哪些需要单独维护
- 排障定位:服务连不上外网时先看它接的网络有没有 external 与 internal 混用
声明与使用
声明与使用
services:
db:
image: postgres:16-alpine
networks: [backend] # 只接内部网络
api:
image: app/api:1.4.2
networks: [backend, shared] # 同时接内部与共享网络
networks:
backend:
internal: true # 无外网出口
shared:
external: true
name: team-shared-net # 引用项目外已存在的网络网络声明对照
| 声明方式 | 谁来创建 | 何时删除 |
|---|---|---|
| 普通 network | compose 创建 | down 时随项目删除 |
| internal: true | compose 创建,无外网出口 | down 时随项目删除 |
| external: true | 项目外已存在,引用即可 | 不随项目删除 |
| external 加 name | 按指定名字引用 | 同样不随项目删除 |
external 网络要先建好再启动项目,顺序反了会直接失败;这类共享网络的命名与规划最好写进文档,避免多个项目各建一张同名网络。
只接了 internal 网络的服务无法拉依赖或访问外部接口,需要外联的服务要同时接入第二张有出口的网络。