compose 默认是怎么给服务建网络的?怎么把数据库藏在后端网络里?internal 网络到底隔离到什么程度?这篇用 ping 和路由表逐项验证。
项目的网络: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 能连两边。想隐藏数据库,就别让它进前端网络。
网络 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 外网立刻失败,也解析不了外部域名;同一网络里的容器之间仍然互通(本文只验证了出网这一面)。
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 子网。