docker容器dns解析优先级由/etc/resolv.conf中search域从左到右顺序及nameserver列表顺序共同决定:search首项最常用内网域(如dev.company.local)确保短名如mysql优先匹配对应fqdn;nameserver首选内网dns(如192.168.10.5)保障私有记录快速响应,禁用公网dns作首选项;配置方式按需选——单次调试用--dns/--dns-search,项目级用docker-compose.yml的dns_search/dns字段,全局统一配daemon.json的dns和dns-search字段;验证须进容器检查resolv.conf并实测nslookup mysql是否命中预期fqdn。

核心是控制 /etc/resolv.conf 中的 search 域顺序和 nameserver 优先级,让内部服务域名(如 mysql、redis)能最快匹配到正确全限定名(FQDN),避免多余查询。
明确搜索域顺序,把最常用内网域名放最前
Docker 按 search 行中从左到右的顺序依次补全短域名。例如配置了 search dev.company.local company.local,查 mysql 会先试 mysql.dev.company.local,再试 mysql.company.local。
- 高频访问的服务域名(如
auth、db)所属的域必须排在第一位 - 避免把泛用域(如
company.local)放在首位,否则每次查公网域名(如google.com)都会先尝试google.com.company.local,造成延迟和失败日志 - 搜索域总数建议不超过 4 个,过多会拖慢解析流程
指定内网 DNS 服务器为首选
内部服务通常由公司 CoreDNS、dnsmasq 或 Active Directory DNS 托管,它们响应快、支持私有记录,且不对外转发。
- 启动容器时用
--dns显式指定内网 DNS IP,例如:docker run --dns 192.168.10.5 --dns-search dev.company.local nginx - 确保该 DNS 地址是直连可达的(不能是容器内无法路由的地址,比如宿主机上的
127.0.0.1) - 不要混用公有 DNS(如
8.8.8.8)作第一选项——它无法解析service.dev.company.local,只会增加超时等待
按场景选择配置方式
不同使用方式对应不同生效范围和维护成本:
-
单次调试:用
docker run --dns-search dev.company.local --dns 192.168.10.5快速验证 -
项目级统一:在
docker-compose.yml中写入dns_search和dns字段,随代码一起版本化 -
团队/集群级统一:修改
/etc/docker/daemon.json,添加"dns": ["192.168.10.5"]和"dns-search": ["dev.company.local"],重启 Docker 生效
验证是否真正生效
别只看配置写了没,要进容器里确认实际行为:
- 运行
docker exec -it 容器名 cat /etc/resolv.conf,检查nameserver和search是否符合预期 - 执行
nslookup mysql,观察返回的是不是mysql.dev.company.local的 IP,而不是超时或错误 - 用
dig +short mysql查看完整解析链,确认没有冗余查询阶段











