bigywater.tech
Docker · 67

Compose 网络:默认网络和多网络隔离

compose 默认是怎么给服务建网络的?怎么把数据库藏在后端网络里?internal 网络到底隔离到什么程度?这篇用 ping 和路由表逐项验证。

bad address
不在同一个网络里的服务,名字解析就失败(proxy ping db)
没有默认路由
internal: true 的网络里容器的路由表只有本网段
10.62.0.10
用 ipv4_address 给服务 a 固定的 IP,别名 alpha / first / a 都解析到它

默认网络

实测 · 本机执行输出
  项目的网络:bwlab-c62_default/bridge
  web 的 Networks / 别名:bwlab-c62_default aliases=[bwlab-c62-web-1 web]
  web ping api(服务名):通;ping bwlab-c62-api-1(容器名):通
  down 之后网络还在吗?已删除

不写 networks,所有服务共享一个 <项目名>_default bridge 网络,服务名和容器名都是别名。docker compose down 会把它删掉。

分网

实测 · 本机执行输出
  proxy ping app:通;proxy ping db:不通(ping: bad address 'db');app ping db:通;db ping proxy:不通(ping: bad address 'proxy')
  项目的网络名:bwlab-c62_back bwlab-c62_front

服务只加入声明的网络。proxy 在 front、db 在 back,二者之间连名字都解析不了,只有同时在两个网络里的 app 能连两边。想隐藏数据库,就别让它进前端网络。

internal

实测 · 本机执行输出
  网络 priv 的 Internal = true;网络 pub 的 Internal = false
  inside ping 1.1.1.1:不通(0.1 秒);PING 1.1.1.1 (1.1.1.1): 56 data bytes;nslookup github.com:失败
  outside ping 1.1.1.1:通(0.3 秒);;nslookup github.com:成功
  路由:inside → 172.20.0.0/16 dev eth0 scope link  src 172.20.0.2 | outside → default via 172.19.0.1 dev eth0 ; 172.19.0.0/16 dev eth0 scope link  src 172.19.

internal: true 的网络里没有默认路由,容器 ping 外网立刻失败,也解析不了外部域名;同一网络里的容器之间仍然互通(本文只验证了出网这一面)。

别名与固定 IP

实测 · 本机执行输出
  docker compose up -d:退出码 0
  a 的地址:10.62.0.10 aliases=[bwlab-c62-a-1 a alpha first]
  b 解析 alpha / first / a:alpha→127.0.0.11:53 10.62.0.10 ; first→127.0.0.11:53 10.62.0.10 ; a→127.0.0.11:53 10.62.0.10
  网络子网:10.62.0.0/24

在服务的 networks 下可以写 aliases 和 ipv4_address;固定 IP 要求网络自己声明 ipam 子网。

分步演示

compose 网络
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / Docker Desktop(Engine 29.8.2,容器跑在 Docker Desktop 自带的 Linux 虚拟机里,内核与宿主机的 macOS 不同);镜像为 linux/arm64;需要看虚拟机内部时用特权容器 + nsenter;计时用 time / date +%s%N,数字每次运行会有小幅抖动。Docker Compose v5.5.1;连通性用 busybox ping(-c 1 -W 2/3)和 nslookup;出网测试的 1.1.1.1 是 ICMP,github.com 是 DNS 解析;每个场景一个 compose 项目 bwlab-c62,实验后已 down -v;固定网段 10.62.0.0/24 是我选的私有网段
    • 没有验证:internal 网络里容器之间的互通与 DNS(只验证了出网被阻断)、ipv6 网络、external: true 引用已有网络、driver_opts(如 MTU)、网络的 labels、跨项目通信
    京ICP备2026067502号-1京公网安备11010502063487号