Docker容器自定义DNS的核心是控制/etc/resolv.conf的nameserver条目并确保上游DNS支持递归查询;四种方式:1.--dns启动时指定(优先级最高);2.daemon.json全局配置;3.自定义网络中让内嵌DNS(127.0.0.11)转发至递归DNS;4.Compose中通过dns键声明。

Docker 容器自定义 DNS 的核心,是控制容器内 /etc/resolv.conf 中的 nameserver 条目,并确保该 DNS 服务器本身支持递归查询(能真正解析域名,不只是转发或查缓存)。默认情况下,容器不会直接继承宿主机的 DNS 配置,尤其在自定义网络中,它会优先走 Docker 内嵌 DNS(127.0.0.11),而这个内嵌 DNS 本身不对外递归——所以必须显式配置上游递归 DNS。
下面按使用场景分四类,讲清楚怎么配、为什么这么配、关键注意点:
启动单个容器时用 --dns(最直接,优先级最高)
适合调试、CI/CD 或临时运行。
- 命令示例:
docker run --dns 192.168.10.50 --dns 114.114.114.114 -it alpine nslookup example.com
- 容器
/etc/resolv.conf会严格写入这两个地址,系统按顺序尝试 - 必须确认
192.168.10.50是一台能递归查询的 DNS(如 CoreDNS、dnsmasq、Bind),否则查example.com会直接失败或超时 - ⚠️ 此方式会完全覆盖 daemon.json 和自定义网络的 DNS 设置
全局统一配:修改 /etc/docker/daemon.json
适合企业环境,所有新容器默认走指定 DNS(比如内网 DNS + 公共备用)。
- 编辑配置文件:
{ "dns": ["192.168.10.50", "8.8.8.8"], "dns-search": ["corp.local"], "dns-opts": ["timeout:2", "attempts:3"] } - 保存后执行
sudo systemctl restart docker - 新建容器自动生效;已运行容器不受影响
- 单个容器仍可用
--dns覆盖此设置
自定义网络中让内嵌 DNS 转发(推荐用于服务发现+公网解析混合场景)
既要解析 db、cache 这类容器名,又要解析 baidu.com 这类外部域名。
- 创建网络时指定上游 DNS:
docker network create --dns 192.168.10.50 mynet
- 启动容器加入该网络:
docker run --network mynet --name web -d nginx
- 此时容器
/etc/resolv.conf写的是127.0.0.11,而 Docker 内嵌 DNS 会把非本网络的查询(如baidu.com)转发给192.168.10.50 - ✅ 容器名解析(
nslookup web)和公网域名解析(nslookup baidu.com)同时生效 - ❌ 不要对自定义网络容器再加
--dns,Docker 会忽略它
Docker Compose 中声明 DNS(适合编排项目)
在 docker-compose.yml 里为服务单独配 DNS,行为与 docker run --dns 一致。
- 示例:
services: app: image: ubuntu dns: - 192.168.10.50 - 8.8.8.8 dns_search: - internal.example.com dns_opt: - timeout:2 - 启动后容器
/etc/resolv.conf会准确写入对应配置 - 支持 IPv6(如
dns: ["2001:4860:4860::8888"])
验证是否生效,最简单方法:
docker run --rm alpine cat /etc/resolv.conf
看到你配的 nameserver 行,就说明配置已落地。
不复杂但容易忽略


















