Docker DNS解析不依赖独立DNS服务,而是通过四种机制配置:1. --dns参数(优先级最高);2. daemon.json全局配置;3. 自定义网络内嵌127.0.0.11实现服务发现;4. docker-compose.yml中声明DNS字段。安装 Docker Engine 后,DNS 解析服务**不是自动配置的独立服务**,而是由 Docker 自身在容器运行时动态提供或依赖宿主机/用户显式配置。Docker Engine 本身不内置 DNS 服务器(如 BIND 或 CoreDNS),但它通过四种机制支持容器内的域名解析——关键在于让容器的 `/etc/resolv.conf` 正确指向可用的 nameserver,并在需要时启用内嵌服务发现。 下面分场景说明如何配置:
启动单个容器时指定 DNS(最直接、优先级最高)
适用于调试、ci/cd 或临时运行容器。使用 --dns 参数传入一个或多个 dns 地址,它们会直接写入容器的 /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-search corp.local --dns-opt timeout:2
为所有容器统一配置默认 DNS(推荐用于企业内网)
修改 Docker 守护进程全局配置文件 /etc/docker/daemon.json(Linux/macOS)或 %ProgramData%\Docker\config\daemon.json(Windows WSL2):
- 添加
"dns"数组,例如:"dns": ["192.168.1.1", "114.114.114.114"] - 可选配
"dns-search"和"dns-opts",如:"dns-search": ["dev.example.com"] - 保存后重启守护进程:
sudo systemctl restart docker(Linux)
此后新建容器默认继承该配置,但仍可被 --dns 覆盖。
用自定义网络启用 Docker 内嵌 DNS(服务发现核心)
Docker 在用户创建的网络中自动启用内嵌 DNS 服务(固定地址 127.0.0.11),专用于同网络容器间按名称通信:
docker network create mynetdocker run -d --name db --network mynet postgres-
docker run -it --network mynet --rm alpine nslookup db→ 返回db的 IP
注意:该内嵌 DNS 不解析公网域名,需配合 --dns 或 daemon.json 中的上游 DNS 才能访问外网。
在 docker-compose.yml 中声明 DNS(适合编排环境)
对 Compose 编排的服务,直接在服务定义下添加字段即可:
dns: ["192.168.10.50", "8.8.8.8"]dns_search: ["internal.example.com"]dns_opt: ["timeout:2", "ndots:3"]
该方式行为与 docker run --dns 一致,启动即生效,无需改镜像或手动进容器。











