bigywater.tech
Docker · 55

网络别名:同一个名字解析到多个容器

网络别名是什么、在哪个范围生效?多个容器共用一个别名会怎样?这篇用 docker inspect 的 Aliases 和 nslookup 逐项验证,包括别名跨网络时的表现。

3 个地址
3 个容器共用别名 db 时,一次解析返回的地址数
Aliases = null
没有设置 --network-alias 的容器和默认 bridge 上的容器
127.0.53.53
在不认识别名的网络里解析 web 得到的保留地址,不是任何容器

Aliases

实测 · 本机执行输出
  --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']

断开网络或删除容器后,别名和对应的地址立即消失。

分步演示

网络别名
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / Docker Desktop(Engine 29.8.2,容器跑在 Docker Desktop 自带的 Linux 虚拟机里,内核与宿主机的 macOS 不同);镜像为 linux/arm64;需要看虚拟机内部时用特权容器 + nsenter;计时用 time / date +%s%N,数字每次运行会有小幅抖动。解析用 busybox 的 nslookup(取返回的地址);别名取自 docker inspect 的 NetworkSettings.Networks.*.Aliases;两个自定义网络 172.19.0.0/16 和 172.20.0.0/16;实验后已删除容器和网络
    • 没有验证:--link 旧参数、Compose 服务名别名、IPv6、别名与容器名冲突、127.0.53.53 的来源、DNS 缓存对别名变化的延迟
    京ICP备2026067502号-1京公网安备11010502063487号