首页/云/Docker 容器速查/容器内域名解析失败排查
容器排障52 条

容器内域名解析失败排查

Temporary failure in name resolution 类报错的排查链:容器 resolv.conf → --dns 显式指定 → daemon 级 DNS 配置 → 自定义网络的内嵌 DNS(127.0.0.11)。

Docker 容器速查云更新于 2026-10-13

解析失败从哪里查起

容器里出现 Temporary failure in name resolution 或 connect: no such host,通常不是网络断了,而是 DNS 配置不对。容器启动时由守护进程生成 /etc/resolv.conf,默认沿用宿主的上游 DNS;在用户自定义网络里,Docker 还会插入内嵌 DNS(监听 127.0.0.11)来解析容器名与网络别名。排查顺序是:先看容器实际用的解析配置,再显式指定上游复测,最后才怀疑网络层。

基本信息

第一步docker exec 容器 cat /etc/resolv.conf
第二步用 --dns 显式指定上游 DNS 复测
背景自定义网络由内嵌 DNS(127.0.0.11)解析服务名
持久化daemon.json 的 dns 字段作为全局默认

典型使用场景

  • 迁移到新环境后解析异常:宿主改过 DNS 或用了容器优化过的 resolv.conf
  • 内网域名解析不了:公共 DNS 查不到内部域名,需要显式指向内网 DNS
  • 容器间按名互访失败:不在同一自定义网络,或名字写错
  • 解析偶发超时:上游抖动,需要调整超时与重试次数
  • 带 VPN 或隧道环境:解析链路与宿主不一致,需要固定上游

排查与修复

排查与修复
# 看容器实际使用的解析配置
docker exec web cat /etc/resolv.conf

# 用内网/公共 DNS 显式指定,复测同一次解析
docker run --rm --dns 10.0.0.53 alpine nslookup internal.example.com

# 容器名解析要用 getent,避免 nslookup 的旁路行为
docker run --rm --network app-net alpine getent hosts db

# 带搜索域与超时选项启动
docker run -d --dns-search internal.example.com --dns-opt timeout:2 app/api:1.4.2

现象与对策对照

现象可能原因下一步
内网域名失败、公网域名正常上游指向了公共 DNS把内网 DNS 加进 --dns 或 daemon 全局配置
容器名也解析不了双方不在同一自定义网络network connect 到同一网络后复测
解析偶发超时上游抖动或超时过短加 --dns-opt timeout:2 attempts:3
重启后配置又变了容器内手改没有持久化改回 run 参数或守护进程级配置
宿主修改 resolv.conf 后已创建的容器不会自动跟随,需要重建容器或改守护进程配置才能生效。
在自定义网络里,--dns 影响的是外部域名向谁转发,容器名与网络别名仍由内嵌 DNS 解析,两者并不冲突。

易错点

  • 在容器里手改 /etc/resolv.conf:容器重建即失效,正确做法是 run 参数或守护进程级配置
  • 混用内网与公共 DNS:解析结果随上游变化,内部域名可能出现时通时不通
  • 用 nslookup 判定「DNS 坏了」:它有自己的查询路径,验证解析优先用 getent hosts
  • 忽略搜索域影响:短名解析依赖 search 域的拼装顺序,域名变短可能解析到意外主机

数据来源与参考

  • Docker 官方文档:Container DNS 与自定义网络(docs.docker.com/network)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌