docker内置dns(127.0.0.11)支持容器名自动解析,需使用用户定义网络、禁用--dns参数、确保resolv.conf首行为nameserver 127.0.0.11,并合理配置search域与可信上游dns。

直接用 Docker 自带的 127.0.0.11 DNS 解析器,就能让微服务用短名称(比如 db、cache)互相访问,无需改代码、不装额外组件,启动即生效。
确保容器走内置 DNS(127.0.0.11)
这是整个机制的前提:容器必须使用 Docker 内置 DNS,而不是被覆盖成宿主机或公网 DNS。
- 启动容器时不要加
--dns或--dns-search参数,让它自动继承默认配置 - 进容器执行
cat /etc/resolv.conf,第一行必须是nameserver 127.0.0.11 - 如果看到
127.0.0.1或8.8.8.8,说明被手动覆盖了,要删掉相关配置
用用户定义网络替代默认 bridge
默认 bridge 网络不支持容器名自动注册,必须用自定义桥接网络才能启用 DNS 发现。
- 创建网络:
docker network create app-net - 启动服务时指定该网络:
docker run -d --name db --network app-net postgres - 另一容器同样加入
app-net,就能直接ping db或curl http://db:5432
控制 search 域,避免无效重试
search 域决定短名补全顺序。设多了会逐个尝试,每次失败都卡 1–3 秒,拖慢整体响应。
- 只配一个最常用内网域,例如
dev.local;多写几个反而更慢 - 在
docker-compose.yml中写死:dns_search: ["dev.local"] - 跨网络访问时,直接用 FQDN,比如
db.app-net,跳过 search 补全
上游 DNS 只配可信内网地址
当内置 DNS 查不到容器名时,会转发给上游 DNS。若上游是 8.8.8.8,查 api.dev.local 就会超时卡住。
- 上游 DNS 必须是能解析内部域名的内网服务器,例如
192.168.10.5 - 团队统一配置可改
/etc/docker/daemon.json,加"dns": ["192.168.10.5"],然后重启 Docker - 严禁混搭公网+内网 DNS,第二个永远等超时才轮到,实际等于没用
验证是否真正生效:进容器运行 time getent hosts db,稳定在 5ms 内才算达标;如果 nslookup db 要 800ms,但 nslookup db.dev.local 只要 5ms,说明 search 域配置错了。











