首页/云/云与容器速查/Compose 网络与服务发现
容器与 Docker106 条

Compose 网络与服务发现

默认自动创建 <项目>_default 网络,服务名即 DNS 主机名;需要隔离或接入既有网络(如统一反向代理)时,在顶层声明自定义网络并用 external 接入。

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

Compose 网络与服务发现是什么

Compose 默认会为项目创建一个名为 <项目名>_default 的网络,所有服务接入其中,并以服务名作为 DNS 主机名互相访问。需要隔离或接入已有网络(例如统一的入口反向代理)时,在顶层 networks 段自定义网络再在服务下引用:internal: true 可以切断外部出口只保留内部互访,external: true 用于接入已经存在的网络。理清默认网络与服务名解析,能避开大量『容器之间连不上』的问题。

基本信息

默认网络未声明时自动创建 <项目>_default,服务名可直接互访
自定义网络顶层 networks 段声明,服务下用 networks: [backend] 引用
internalinternal: true 切断外网出口,仅保留内部互访
aliases为服务在指定网络上追加额外的 DNS 名
externalexternal: 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 网络后就无法从宿主直接连接:本地客户端连不上并不代表服务故障,需要经跳板容器或临时接入同一网络排查。

易错点

  • 两个服务不在同一网络列表里却按服务名互连,解析失败报主机不存在,浪费大量排查时间
  • 只把服务接到内部网络,宿主与其他项目的访问全部失败,误判为端口问题
  • 服务接了多个网络但应用只监听单一地址,部分网络上的调用无法连通
  • external 网络名称写错或尚未创建,启动时直接报错,容器根本没起来

数据来源与参考

  • Docker Docs:Compose networks

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌