宿主机有网、Docker 容器不能解析域名?用 daemon.json 一键配置永久 DNS

摘要

本文说明一种常见现象:宿主机可以上网,但进入 Docker 容器后 ping 域名出现 Temporary failure in name resolution。原因多与容器内 DNS 配置有关。通过在宿主机 修改 Docker 的 daemon.json 指定公共 DNS,并重启 Docker 服务,可使新建容器长期获得可用的域名解析能力。

关键词: Docker、DNS、daemon.json、Temporary failure in name resolution、Linux


一、现象描述

在容器内执行:

bash 复制代码
ping www.baidu.com

报错:

text 复制代码
ping: www.baidu.com: Temporary failure in name resolution

而宿主机上同样的命令正常;有时在容器里 ping 公网 IP (如 223.5.5.5)却是通的。

这说明:网络路由大致正常,问题集中在 DNS 解析


二、原因简述

  1. 容器内的 /etc/resolv.conf 往往由 Docker 根据宿主机环境生成。若宿主机使用 127.0.0.53 (systemd-resolved)等仅本机有效 的地址,在容器里 127.0.0.53 指向容器自身,导致解析失败。
  2. 部分环境下路由器或内网 DNS 对容器网段不友好,也会出现类似现象。
  3. 在容器里临时resolv.conf 可能立刻生效,但容器重建或重启后易被覆盖,不适合作为长期方案。

因此更稳妥的做法是:在 Docker 守护进程层面为容器指定可靠的公共 DNS。


三、解决办法:修改宿主机 /etc/docker/daemon.json

适用场景: 希望默认所有新建容器都使用固定、可用的 DNS,且由运维在宿主机统一配置。

3.1 编辑配置文件

宿主机(不是容器内)使用 root 权限编辑或创建:

/etc/docker/daemon.json

若文件已存在其他配置,需合并为合法 JSON(注意逗号),示例:

json 复制代码
{
  "dns": ["223.5.5.5", "114.114.114.114"]
}

说明:

  • 223.5.5.5114.114.114.114 为国内常用的公共 DNS,可按需换成 8.8.8.8 等。
  • 若原文件已有键(如 registry-mirrors),应写成一个对象,例如:
json 复制代码
{
  "registry-mirrors": ["https://你的镜像地址"],
  "dns": ["223.5.5.5", "114.114.114.114"]
}

3.2 重启 Docker

bash 复制代码
sudo systemctl restart docker

四、验证步骤

  1. 新建或重建一个测试容器进入 shell。
  2. 执行:
bash 复制代码
cat /etc/resolv.conf
ping -c 2 www.baidu.com

应能看到配置的 nameserver,且域名解析与 ping 正常。


五、注意事项与排错

  1. JSON 语法daemon.json 格式错误会导致 Docker 启动失败,修改后可用 sudo docker infosystemctl status docker 确认服务正常。
  2. 仅改容器内 resolv.conf :适合临时排障;永久方案 仍建议本文的 daemon.jsondocker run --dns
  3. ping IP 通、域名不通 :基本可断定是 DNS;若 IP 也不通,需再查路由、防火墙、VPN 等。
  4. IPv6 :部分环境解析到 AAAA 后走 IPv6,若仅 IPv4 异常可能表现复杂,可结合 ping -4 / dig 进一步排查。

六、小结

项目 说明
修改位置 宿主机 /etc/docker/daemon.json
核心配置 "dns": ["223.5.5.5", "114.114.114.114"]
必做操作 sudo systemctl restart docker
旧容器 重建后新 DNS 才稳定生效
典型现象 宿主机有网,容器内 Temporary failure in name resolution

可在不进入每个容器改文件的前提下,统一解决 Docker 环境的 DNS 问题,适合个人开发机与内网服务器长期使用。

相关推荐
乘云数字DATABUFF2 天前
5分钟部署开源APM Databuff:OpenTelemetry全链路追踪入门实战
运维·后端
Patrick_Wilson2 天前
从「改个端口」到 502:Next.js on k8s 的容器端口、Service 映射与 env 覆盖
docker·kubernetes·next.js
Suroy3 天前
DockerView-Go:用 Go 写一个终端 Docker 监控工具,顺便做了个 Web 仪表盘
docker
云恒要逆袭3 天前
运行你的第一个Docker容器
后端·docker·容器
荣--3 天前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森4 天前
动手实战学 Docker — 从零到集群编排完全指南
运维
宋均浩4 天前
# Docker 镜像瘦身实战:从 1.2G 到 80MB 的五个优化步骤
ci/cd·docker
Avan_菜菜4 天前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
程序员老赵4 天前
10 分钟部署 OpenCode:Docker 一键安装,浏览器打开就能用 AI 写代码(附完整命令与排错)
docker·容器·ai编程
WangMingHua1114 天前
LM Studio Docker 部署——本地大模型一键启动
docker