docker容器需显式配置递归dns服务器才能真正解析域名,四种方式:1. 启动时用--dns指定;2. 全局配置daemon.json的dns字段;3. 自定义网络中让内嵌dns(127.0.0.11)转发至递归dns;4. docker compose中通过dns键声明。

Docker 容器默认不直接继承宿主机的 DNS 设置,要让它使用指定的域名解析服务器(如内网 DNS 或可信公共 DNS)进行递归查询,关键在于控制容器 /etc/resolv.conf 中的 nameserver 条目,并确保该 DNS 服务器本身支持递归查询——这是实现“真正解析域名”而非仅查缓存或转发的前提。
下面分四种常用场景,讲清楚怎么配、为什么这么配、以及容易踩的坑:
启动单个容器时用 --dns 指定递归 DNS
这是最直接、优先级最高的方式,适用于调试、CI/CD 或临时服务。
- 命令示例:
docker run --dns 192.168.10.50 --dns 114.114.114.114 -it alpine nslookup example.com - Docker 会按顺序把这两个地址写入容器的
/etc/resolv.conf,系统调用(如getaddrinfo())会依次尝试 - 必须确保
192.168.10.50是一台能对外递归查询的 DNS 服务器(比如 CoreDNS、dnsmasq 或 Bind),否则它只返回 NXDOMAIN 或拒绝响应 - 注意:该方式会完全覆盖其他 DNS 来源(包括自定义网络的内嵌 DNS 和 daemon.json 配置)
全局配置所有容器默认走指定递归 DNS
适合统一运维策略,比如公司所有容器必须走内网 DNS 服务器做安全审计和私有域名解析。
MiniMax 图片理解 + 网络搜索 MCP 工具。适配 Docker 环境(极空间等),支持图片 OCR 识别、图像内容理解、网络搜索。API Key 安全存储在本地 credentials 文件,不暴露在代码中。
- 编辑
/etc/docker/daemon.json,加入:{ "dns": ["192.168.10.50", "8.8.8.8"], "dns-search": ["corp.local"] } - 保存后执行
sudo systemctl restart docker,新创建的容器自动生效 - 验证方法:
docker run --rm alpine cat /etc/resolv.conf,确认内容含你写的 nameserver - 注意:已运行的容器不受影响;个别容器仍可用
--dns覆盖此设置
在自定义网络中配合内嵌 DNS 实现混合解析
当既要解析容器名(如 db、cache),又要解析公网或内网域名时,需让 Docker 内嵌 DNS(127.0.0.11)转发到你的递归 DNS。
- 先创建带 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 - 验证:
docker run --network mynet -it alpine nslookup baidu.com应成功;nslookup web也应返回容器 IP
Docker Compose 中声明 DNS 实现编排级控制
适合微服务项目,让每个服务明确知道自己该用哪套 DNS 解析路径。
- 在
docker-compose.yml中写:services:<br> app:<br> image: ubuntu<br> dns:<br> - 192.168.10.50<br> - 8.8.8.8<br> dns_search: ["corp.local"]
- 启动后进入容器检查:
docker-compose exec app cat /etc/resolv.conf - 支持环境变量替换,例如:
- ${INTERNAL_DNS},配合.env文件灵活切换 dev/staging 环境
不复杂但容易忽略










