镜像(Image)是只读模板,包含应用所需文件、依赖和配置;容器(Container)是其运行实例,具备独立文件系统、网络栈和进程空间。DNS配置本质是向/etc/resolv.conf写入nameserver,--dns优先级最高,全局配置需重启Docker,自定义网络启用内嵌DNS(127.0.0.11)支持服务发现,Compose中声明更利于编排。
镜像(image)是只读的模板,包含运行应用所需的所有文件、依赖和配置;容器(container)是镜像的运行实例,具备独立的文件系统、网络栈和进程空间。配置容器 dns 服务地址,本质是让容器内的 /etc/resolv.conf 正确写入你指定的 nameserver 条目,从而实现域名解析。
启动时用 --dns 参数(最常用、最直接)
适用于单次运行、调试或 CI/CD 场景,优先级最高,会完全覆盖其他 DNS 来源。
- 指定一个 DNS:
docker run --dns 114.114.114.114 nginx - 指定多个(按顺序生效,前高后低):
docker run --dns 192.168.1.1 --dns 8.8.8.8 alpine nslookup example.com - DNS 必须是可达的 IP 地址,不支持域名;推荐优先使用内网 DNS(如 CoreDNS、dnsmasq),保障私有域名解析和响应速度
修改 daemon.json 全局配置(适合统一管理)
影响所有新建容器,默认继承该设置,但仍可被 --dns 覆盖。
- 编辑
/etc/docker/daemon.json(Linux/macOS)或 Docker Desktop 设置(Windows/macOS):
- 保存后执行:
sudo systemctl daemon-reload && sudo systemctl restart docker(Linux) - 注意:Docker Desktop 用户需在 GUI 中点击 “Apply & Restart” 或重启应用
在自定义网络中启用内嵌 DNS(推荐用于服务发现)
当你创建用户网络(非默认 bridge),Docker 自动启用内嵌 DNS 服务器 127.0.0.11,支持同网络容器名解析。
- 创建网络:
docker network create mynet - 启动容器并加入该网络:
docker run -d --name db --network mynet postgres - 另一容器可直接解析:
docker run --network mynet --rm alpine nslookup db - 注意:内嵌 DNS 不递归查询公网域名,如需解析外部域名,仍需配合
--dns或全局配置
Docker Compose 中声明 DNS(适合编排环境)
在 docker-compose.yml 的服务层级配置,行为与 docker run --dns 一致。
- 示例配置:
- 启动后,容器
/etc/resolv.conf会自动包含对应内容 - 该方式对多服务协同部署更清晰、可复现,避免命令行参数冗长


















