可通过修改 daemon.json 设置容器默认 dns,如{"dns":["114.114.114.114","8.8.8.8"]},linux 位于 /etc/docker/daemon.json,需重启 docker 服务并验证生效。
可以通过修改 docker 的 daemon.json 文件来设置容器默认使用的 dns 服务器,这样所有新启动的容器(除非显式覆盖)都会使用你指定的 dns。
确认 daemon.json 文件位置
Docker 的配置文件通常位于:
-
Linux:
/etc/docker/daemon.json - Windows/macOS(Docker Desktop): 需通过图形界面进入 Settings → Docker Engine 编辑,实际不直接暴露该路径,但效果等同于修改 daemon.json
编辑 daemon.json 添加 DNS 配置
在文件中添加 dns 字段,值为一个字符串数组,填写你希望使用的 DNS 地址。例如:
{
"dns": ["114.114.114.114", "8.8.8.8"]
}
注意:
使用 JSON Schema 验证 JSON 数据,从示例 JSON 生成 schema,并将其转换为 TypeScript 接口、Python 数据类或 Markdown 文档。
- IP 必须是可路由的 DNS 服务器地址,不能写域名(如
dns.google) - 顺序代表优先级,Docker 会按数组顺序尝试解析
- 若宿主机使用 systemd-resolved 或 NetworkManager,可能需额外处理冲突(见下一条)
重启 Docker 并验证生效
保存后,必须重启 Docker 守护进程才能使配置生效:
-
Linux(systemd):
sudo systemctl restart docker -
验证是否加载成功: 运行
docker info | grep -i dns,应看到类似DNS Servers: 114.114.114.114, 8.8.8.8 -
测试容器内 DNS: 启动一个容器,检查
/etc/resolv.conf:docker run --rm alpine cat /etc/resolv.conf,输出应包含你设定的 DNS
常见问题与注意事项
某些 Linux 发行版(如 Ubuntu 20.04+)默认启用 systemd-resolved,它会将 /etc/resolv.conf 指向 127.0.0.53,这可能导致 Docker 忽略 daemon.json 中的 DNS 设置。
解决方法:
- 临时禁用:
sudo systemctl stop systemd-resolved && sudo systemctl disable systemd-resolved - 或保留 resolved,但让 Docker 绕过它:在
daemon.json中同时加"dns": [...], "dns-search": [],并确保宿主机/etc/resolv.conf不是 symlink 到127.0.0.53 - 更稳妥做法是将宿主机的
/etc/resolv.conf改为静态配置(如直接写入nameserver 114.114.114.114),再配置 daemon.json










