docker容器dns解析由三层配置动态决定:1.启动时--dns参数(最高优先级,覆盖其他);2.daemon.json全局配置(影响所有新建容器);3.自定义网络绑定上游dns(兼顾服务发现与外网解析)。

Docker 容器内部的 DNS 解析服务器不是固定写死的,而是由多层配置动态决定的。修改的关键在于控制哪一层生效,而不是手动改 /etc/resolv.conf(它会被 Docker 覆盖或重写)。
以下三种方式覆盖绝大多数使用场景,按优先级从高到低排列:
启动单个容器时强制指定 DNS(最直接、最高优先级)
适用于调试、CI/CD、临时服务或需要强隔离的场景。Docker 会完全忽略其他 DNS 来源,只把 --dns 提供的地址写入容器 /etc/resolv.conf。
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
- 支持多个 DNS 地址,按顺序尝试
docker run --dns 114.114.114.114 --dns 8.8.8.8 -it alpine nslookup baidu.com
- 只接受 IP 地址(不支持域名),例如
--dns 192.168.10.50或--dns 2001:4860:4860::8888 - 可搭配
--dns-search(设置搜索域)和--dns-opt(如timeout:2)增强解析行为 - 注意:对已运行容器无效;即使容器加入已有 DNS 设置的自定义网络,
--dns仍会覆盖
全局统一配置所有新容器的默认 DNS(适合标准化环境)
适用于开发机、CI 环境或企业内网,让所有新建容器默认走指定 DNS。
- 编辑
/etc/docker/daemon.json(不存在则新建):{ "dns": ["192.168.10.50", "114.114.114.114"], "dns-search": ["corp.local", "svc.cluster.local"], "dns-opts": ["ndots:5", "timeout:2"] } - 保存后重启 Docker 守护进程:
sudo systemctl restart docker
- 验证是否生效:
docker run --rm alpine cat /etc/resolv.conf
- 已运行容器不受影响;单个容器仍可用
--dns覆盖此设置
使用自定义网络绑定上游 DNS(兼顾服务发现与外网解析)
当你既要通过名字访问同网络容器(如 db、redis),又要解析公网或私有域名时,这是推荐方案。
- 创建网络时指定上游 DNS:
docker network create --dns 114.114.114.114 mynet
- 启动容器并加入该网络:
docker run --network mynet --name web -d nginx
- 此时容器
/etc/resolv.conf写入的是nameserver 127.0.0.11(Docker 内嵌 DNS),它会把非本网络的查询(如github.com)递归转发给114.114.114.114,同时保留对web、db等服务名的本地解析能力
无论采用哪种方式,请确保你指定的 DNS 服务器(如 114.114.114.114 或内网 CoreDNS)本身支持递归查询——仅做缓存或转发代理的 DNS 会导致公网域名无法解析。










