解析失败从哪里查起
容器里出现 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 解析,两者并不冲突。