网络别名是什么、在哪个范围生效?多个容器共用一个别名会怎样?这篇用 docker inspect 的 Aliases 和 nslookup 逐项验证,包括别名跨网络时的表现。
--network-alias web --network-alias www 的容器,Aliases = ["web","www"](容器 ID 前 12 位是 cea6dc9d674f) 不带 --network-alias 的容器 Aliases = null 默认 bridge 上的容器 Aliases = null
每个网络下,容器有自己的 Aliases 列表,只包含显式设置的别名,默认 bridge 上没有。
docker network connect --alias api bwlab-c50n2:n1 里的 Aliases = ["web","www"];n2 里的 Aliases = ["api"] plain(在 n1)解析 web:['172.19.0.2'] plain(在 n1)解析 api:解析失败 b(在 n2)解析 api:['172.20.0.2'] b(在 n2)解析 web:['127.0.53.53']
docker network connect --alias 给容器在第二个网络里设置不同的别名。在 n1 里只能解析 n1 的别名,n2 里的 api 在 n1 解析失败。n2 里解析 n1 的别名 web 得到的是 127.0.53.53,那是上游 DNS 对未知短名字的回答(我没有查它的来源,只确认了它不是容器 IP),所以按名字访问之前应当检查地址是否合理。
3 个容器的 IP:['172.19.0.4', '172.19.0.5', '172.19.0.6'];解析别名 db 得到:['172.19.0.4', '172.19.0.5', '172.19.0.6'] 连续 6 次解析,返回的第一个地址:['172.19.0.6', '172.19.0.6', '172.19.0.5', '172.19.0.6', '172.19.0.5', '172.19.0.4']
多个容器用同一个别名,解析一次得到全部地址,返回顺序会变化(6 次采样里第一个地址出现了 3 种不同的值),取第一个地址的客户端会因此分散到不同的容器(详见后面的 DNS 轮询一篇)。
docker network disconnect 后,n2 里解析 api:解析失败 删掉 s2 之后,解析 db 得到:['172.19.0.4', '172.19.0.6']
断开网络或删除容器后,别名和对应的地址立即消失。