Docker容器指定公共DNS有四种方式:1.启动时用--dns参数(优先级最高);2.全局配置daemon.json的dns字段;3.自定义网络中让内嵌DNS(127.0.0.11)转发至公共DNS;4.Compose中通过dns键声明。核心是确保/etc/resolv.conf写入可信递归DNS地址并支持对外查询。

为 Docker 容器指定公共 DNS 解析服务器,核心是让容器的 /etc/resolv.conf 中写入你信任的递归 DNS 地址(如 114.114.114.114 或 8.8.8.8),并确保该服务器支持对外递归查询。配置方式取决于使用范围和持久性需求,不推荐依赖宿主机默认 DNS——它可能被 systemd-resolved、NetworkManager 或防火墙干扰,导致容器解析失败。
启动单个容器时直接指定公共 DNS
这是最灵活、优先级最高的方式,适合测试、CI/CD 或临时服务。
- 用 --dns 参数传入一个或多个公网 DNS 地址,Docker 会按顺序写入容器的
/etc/resolv.conf - 示例命令:
docker run --dns 114.114.114.114 --dns 8.8.8.8 -it alpine nslookup baidu.com - 支持 IPv6,例如:
--dns 2001:4860:4860::8888 - 注意:该方式会完全覆盖其他 DNS 来源(包括 daemon.json 和自定义网络设置)
全局配置所有新容器默认走公共 DNS
适用于统一运维策略,比如开发环境统一使用稳定可靠的公共 DNS。
- 编辑
/etc/docker/daemon.json,加入"dns"字段: {"dns": ["114.114.114.114", "8.8.8.8"], "dns-search": ["local"]}- 保存后执行
sudo systemctl restart docker生效 - 验证:运行
docker run --rm alpine cat /etc/resolv.conf,确认输出含你配置的 nameserver - 注意:已运行的容器不受影响;个别容器仍可用
--dns覆盖此设置
在自定义网络中让内嵌 DNS 转发到公共服务器
当既要解析容器名(如 db、redis),又要解析公网域名时,推荐这种方式。
- 创建网络时指定转发目标:
docker network create --dns 114.114.114.114 mynet - 启动容器加入该网络:
docker run --network mynet --name web -d nginx - 此时容器
/etc/resolv.conf写的是127.0.0.11(Docker 内嵌 DNS),它会把非本网络的查询(如github.com)递归转发给114.114.114.114 - 优势:保留 Docker 内置服务发现能力,同时获得公网解析能力
Docker Compose 中声明公共 DNS
适合编排场景,配置集中、可版本化管理。
- 在
docker-compose.yml的 service 级别或 network 级别添加dns字段: services:<br> app:<br> image: nginx<br> dns: ["114.114.114.114", "8.8.8.8"]
- 也可在
networks下为整个网络指定:networks:<br> mynet:<br> driver: bridge<br> ipam:<br> config:<br> - subnet: 172.20.0.0/16<br> dns: ["114.114.114.114"]
- 注意:Compose 文件中的
dns会覆盖 daemon.json 全局配置,但会被docker run --dns覆盖


















