
类型:虚拟化技术
简介:基于操作系统层级的虚拟化技术,将软件与其依赖项打包为容器。
在使用 Docker 容器时,经常会遇到一种典型问题:容器内部无法解析内网域名,但宿主机却可以正常访问。这类问题在微服务架构和内网服务调用中非常常见。
一、故障现象
常见表现如下:
- 宿主机可以 ping 通 redis-master,但容器内无法解析该域名
- 宿主机可以正常访问 nginx(curl 正常),容器内访问失败
- 容器可以解析公网域名(如 baidu.com),但无法解析内网域名(如 redis-master.internal)
- 跨容器通信时报错:could not resolve host
二、故障原因分析
Docker 默认使用内置 DNS 服务(127.0.0.11),该服务仅用于解析 Docker 网络内部服务名称。
其特点如下:
- 仅支持 Docker network 内部服务发现
- 依赖 –link 或自定义 Docker network 的容器名称解析
- 无法识别宿主机或企业内网 DNS 记录
因此,当访问类似 redis-master.internal 这类企业内网域名时,就会出现解析失败问题。
三、解决方案
方案1:容器启动时指定 DNS
docker run --dns 192.168.1.53 nginx
通过指定企业内网 DNS 服务器解决解析问题。
方案2:Docker Compose 配置 DNS
services:
app:
image: my-app:latest
dns:
- 192.168.1.53
- 8.8.8.8
networks:
- my-net
说明:
- 第一 DNS:企业内网 DNS
- 第二 DNS:公网 DNS 备用
方案3:Docker 全局 DNS 配置
修改 daemon.json:
{
"dns": ["192.168.1.53", "8.8.8.8"]
}
修改后需要重启 Docker:
systemctl restart docker
四、排查与验证命令
1. 查看容器 DNS 配置
docker exec <container-id> cat /etc/resolv.conf
2. 检查容器网络信息
docker inspect <container-id> | grep -A 10 "NetworkSettings"
3. 测试 DNS 解析
docker exec <container-id> nslookup nginx docker exec <container-id> dig nginx
4. 检查宿主机 DNS 配置
cat /etc/resolv.conf
五、总结
Docker DNS 解析问题的核心原因在于:
- Docker 内置 DNS 仅负责容器内部服务发现
- 无法直接使用宿主机或企业内网 DNS
解决思路主要有三种:
- 单容器级 DNS 指定(docker run –dns)
- Compose 级 DNS 配置
- 全局 Docker daemon DNS 配置
在企业内网环境中,推荐优先使用 Compose 或全局 DNS 配置,以保证所有容器一致性解析能力。

