Docker容器DNS配置核心是指定可靠递归DNS作为上游,而非双向转发:1.单容器用--dns直接写入/etc/resolv.conf;2.自定义网络通过--dns预设上游供内嵌DNS转发;3.全局配置在daemon.json中设置dns字段统一管理。

容器创建时设置宿主机与容器的 DNS 转发规则,核心是明确谁负责解析、往哪转、是否支持递归。Docker 本身不直接做“宿主机 ↔ 容器”的双向 DNS 转发,而是通过分层配置控制容器内 /etc/resolv.conf 的内容,并依赖上游 DNS 服务器完成实际解析。关键不在“转发规则”本身,而在指定可靠的递归 DNS 作为上游。
下面分三种常用场景说明怎么配:
启动单个容器时强制指定 DNS(最直接)
适合临时调试、CI 构建或对 DNS 稳定性要求高的服务。
- Docker 会把
--dns指定的 IP 直接写进容器的/etc/resolv.conf,完全跳过内嵌 DNS(127.0.0.11) - 支持多个 DNS,按顺序尝试,例如优先用内网 DNS,失败再切公网
docker run --dns 192.168.1.100 --dns 114.114.114.114 -it alpine nslookup example.corp
- 注意:DNS 地址必须是可达的 IPv4/IPv6 地址,不能是域名
- 若宿主机启用了
systemd-resolved或 NetworkManager,可能干扰该配置,建议验证容器内cat /etc/resolv.conf是否生效
创建自定义网络时预设上游 DNS(推荐用于多容器协作)
适合微服务架构,既保留容器名自动解析(如 db、cache),又能访问外网或内网私有域名。
- Docker 内嵌 DNS(127.0.0.11)只负责本网络服务发现,对外查询需转发
- 必须指定一个支持递归查询的 DNS 服务器(如 CoreDNS、dnsmasq、114.114.114.114),否则
baidu.com这类域名会查不到
docker network create --dns 192.168.10.50 mynet docker run --network mynet --name web nginx
- 容器内
/etc/resolv.conf显示nameserver 127.0.0.11,但所有非本网络域名(如github.com)由 Docker 内嵌 DNS 自动转发给192.168.10.50 - 同一网络中
ping db仍可用,无需额外配置
全局配置 daemon.json(统一管理所有新容器)
适合企业环境,让所有新建容器默认使用公司内网 DNS。
- 修改
/etc/docker/daemon.json,添加dns字段:
{
"dns": ["192.168.1.1", "114.114.114.114"],
"dns-search": ["corp.local"],
"dns-opts": ["ndots:2"]
}-
保存后执行:
sudo systemctl daemon-reload sudo systemctl restart docker
此后所有新创建的容器(除非显式用
--dns覆盖)都会继承该配置旧容器不受影响,需重建才生效
不复杂但容易忽略


















