Docker容器间通过内置DNS服务实现域名解析通信,需使用用户定义网络并以合法名称启动容器;DNS运行在127.0.0.11,自动解析容器名、别名及短主机名,支持db.mynet等FQDN形式,但仅限同一网络内生效。

Docker 容器间通过内置 DNS 服务发现实现域名解析通信,关键在于使用默认桥接网络(bridge)或自定义用户定义网络(user-defined network),并确保容器以合法名称启动。Docker 内置的 DNS 服务运行在每个容器的 127.0.0.11(仅限内部 UDP/TCP 53 端口),自动为同一网络内的容器提供基于容器名或别名的 DNS 解析。
使用用户定义网络(推荐)
默认 bridge 网络不支持容器名自动解析(除非用 --link,已过时且功能受限),而用户定义网络原生支持 DNS 发现:
- 创建自定义网络:
docker network create mynet - 启动容器并指定网络和名称:
docker run -d --name db --network mynet postgres:15 - 另一容器中即可直接解析:
ping db或curl http://db:5432(PostgreSQL 默认端口) - 支持添加别名:
docker run --name app --network mynet --network-alias backend nginx,此时backend和app均可被同网其他容器解析
容器名与 DNS 解析规则
在用户定义网络中,Docker DNS 自动注册以下记录:
-
容器名 → 对应容器 IPv4 地址(如
db→172.18.0.2) -
短主机名(
hostname) → 若启动时指定--hostname web1,则web1可被解析 -
别名(
--network-alias) → 多个服务共用逻辑名,如负载场景下多个实例都注册为cache -
FQDN 形式 →
容器名.网络名,例如db.mynet,跨网络不可达,但同一网络内等效于db
验证与调试 DNS 解析
进入容器后可快速确认 DNS 是否生效:
- 查看 DNS 配置:
cat /etc/resolv.conf→ 应含nameserver 127.0.0.11 - 测试解析:
nslookup db或dig db +short(需安装dnsutils) - 检查容器网络信息:
docker network inspect mynet,确认目标容器出现在Containers列表中且有IPv4Address - 若解析失败,优先检查是否在同一用户定义网络;不同网络间需显式连接或使用外部 DNS+固定 IP
注意事项与常见问题
避免踩坑的关键点:
- 不要依赖默认
bridge网络做服务发现 —— 它不自动注册容器名,仅支持--link(已弃用) - 容器重启后 IP 变更不影响解析 —— DNS 是动态更新的,无需手动刷新
- 若应用启动早于依赖服务,需实现重试逻辑(DNS 解析成功 ≠ 服务已就绪)
- 多网络容器会为每个网络分配独立 DNS 记录,但只在对应网络内可见;跨网络通信需额外配置(如加入多个网络或使用 overlay)

















