首页/云/Docker 容器速查/compose 网络的 internal 与 external
Compose 编排55 条

compose 网络的 internal 与 external

网络声明上的两个特殊开关:internal 让该网络无外网出口;external 复用项目外已存在的网络,不进项目生命周期管理。

Docker 容器速查云更新于 2026-10-13

两个开关的差别

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        # 引用项目外已存在的网络

网络声明对照

声明方式谁来创建何时删除
普通 networkcompose 创建down 时随项目删除
internal: truecompose 创建,无外网出口down 时随项目删除
external: true项目外已存在,引用即可不随项目删除
external 加 name按指定名字引用同样不随项目删除
external 网络要先建好再启动项目,顺序反了会直接失败;这类共享网络的命名与规划最好写进文档,避免多个项目各建一张同名网络。
只接了 internal 网络的服务无法拉依赖或访问外部接口,需要外联的服务要同时接入第二张有出口的网络。

易错点

  • external 网络不存在就启动:项目直接报错退出,先按 name 建好网络再 up
  • 漏配第二张网络:服务表现为外联全部超时,报错指向网络而不是权限,网络字段要整体检查
  • 以为 external 会被 down 清理:它不进项目生命周期,需要单独维护与删除
  • 把 internal 当安全边界:它只去掉外网出口,容器之间仍然互通,认证与最小权限不能省

数据来源与参考

  • Docker 官方文档:Compose networks 的 internal/external(docs.docker.com)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌