目录标题
如果你的宿主机无法访问 Google 公共 DNS(如 8.8.8.8
和 8.8.4.4
),但 Docker 自动回退使用了这些 DNS,那 容器内的网络请求中涉及域名解析时会失败,导致如下问题:
❗ 具体会出现的问题:
1. 容器内无法访问任何域名
例如:
curl http://www.baidu.com
# 返回 curl: (6) Could not resolve host: www.baidu.com
2. 镜像拉取失败(来自 Dockerfile 或 docker-compose)
当构建镜像或启动服务时需要拉取基础镜像,例如:
docker build .
# 或
docker-compose up
可能报错:
Error response from daemon: Get https://registry-1.docker.io/v2/: dial tcp: lookup registry-1.docker.io: no such host
3. 依赖远程服务的容器启动失败
如需要连接远程数据库、API、认证服务器等时会失败。
✅ 解决方案:
✅ 方案一:手动配置宿主机可用的 DNS
修改 Docker 的 daemon.json
配置文件,显式指定可靠的 DNS,如公司内网 DNS 或国内公共 DNS:
文件路径:
/etc/docker/daemon.json
示例内容:
{
"dns": ["114.114.114.114", "223.5.5.5"]
}
(114 是中国电信,223 是阿里公共 DNS)
然后重启 Docker:
systemctl restart docker
✅ 方案二:让宿主机 /etc/resolv.conf
包含非本地 DNS
如果 Docker 没有配置 daemon.json
中的 dns
,它会根据宿主机的 /etc/resolv.conf
自动推导。
你可以修改宿主机的 /etc/resolv.conf
,添加可用的外部 DNS,如:
nameserver 114.114.114.114
nameserver 223.5.5.5
⚠️ 注意:某些系统(如使用 NetworkManager)会自动重写该文件,可通过
/etc/NetworkManager/conf.d/
固化配置。
✅ 方案三:使用 DNS 转发服务(如 Dnsmasq)
如果公司网络要求 DNS 请求必须走代理或跳板服务器,你可以:
- 在宿主机或代理机部署
dnsmasq
- 将容器的 DNS 指向这个本地转发器
🔍 验证配置是否生效:
容器内测试 DNS:
docker run --rm busybox nslookup www.baidu.com
查看容器实际 DNS 配置:
docker run --rm busybox cat /etc/resolv.conf