使用自定义bridge网络可实现容器名自动dns解析,需创建用户定义网络(如mynet)并为容器指定合法名称(如--name web),同一网络内容器可通过名称直接通信。

直接用自定义 bridge 网络就能让容器名自动变成可解析的域名,不需要额外装 DNS 服务或改配置。核心就两点:必须用 用户定义的 bridge 网络,容器启动时必须指定 合法名称(比如 --name web)。
创建并使用自定义 bridge 网络
Docker 默认的 bridge 网络(也就是 docker0)不支持容器名解析,这是硬限制。要启用原生 DNS 发现,得自己建一个:
- 运行
docker network create mynet创建网络,Docker 会自动启用内置 DNS 服务(地址固定为127.0.0.11) - 该 DNS 只监听容器内部,不对外暴露,也不需要你手动启动或配置
- 同一网络下的容器,只要起了名字,就能被其他容器直接用名字访问,比如
ping db或curl http://api:3000
容器必须带合法名称或别名才能被解析
光有网络还不够,容器得“有身份”才行:
- 启动时必须用
--name指定名称,例如docker run -d --name redis --network mynet redis - 也可以加
--network-alias给额外别名,比如--network-alias cache,这样nslookup cache和nslookup redis都能成功 - 名称必须符合 DNS 标准:小写字母、数字、中划线,不能以中划线开头或结尾,长度不超过 63 字符
解析行为和范围说明
这个内置 DNS 的能力是有限但精准的:
- 只解析同网络内的容器名和别名,跨网络或默认
bridge网络的容器无法被识别 - 支持短名(
db)、FQDN 形式(db.mynet),后者在多网络场景下可避免歧义 - 它本身不递归查询公网域名(比如
baidu.com),如需访问外网,得配合--dns或守护进程级 DNS 设置 - 容器内
/etc/resolv.conf会自动写入nameserver 127.0.0.11,无需手动干预
验证是否生效的小技巧
进到一个已连入自定义网络的容器里,快速确认 DNS 是否工作:
- 运行
cat /etc/resolv.conf,看到第一行是nameserver 127.0.0.11就对了 - 用
nslookup 容器名或ping -c 2 容器名测试连通性 - 如果失败,先检查两个容器是否真的在同一个网络(
docker inspect 容器名 | grep NetworkMode)











