在 Docker Compose 中为服务指定自定义 DNS,最直接的方式是在 docker-compose.yml 的服务配置下添加 dns 字段,适用于需要解析内网域名或使用特定公共 DNS 的场景。
先说结论:多数场景直接在服务层级配置 dns 字段即可,复杂内网解析建议搭配 dns_search 使用。
- 适合:需要指定公共 DNS、解决容器内网域名解析、调试 DNS 问题时
- 先准备:确认目标 DNS 服务器 IP 可达,规划好 docker-compose.yml 结构
- 验收:进入容器检查/etc/resolv.conf 并使用 nslookup 验证解析结果
服务级配置(推荐)
在 docker-compose.yml 中为特定服务添加 dns 配置,示例如下(无需声明 version 字段):
services:
myapp:
image: myapp:latest
dns:
- 8.8.8.8
- 8.8.4.4
dns_search:
- example.com
dns_search 可用于补充搜索域,方便解析短域名。
全局配置(需谨慎)
若需全局生效,可修改 Docker 守护进程配置,但修改后需重启 Docker 服务:
sudo nano /etc/docker/daemon.json
# 添加内容
{
"dns": ["8.8.8.8", "8.8.4.4"]
}sudo systemctl restart docker验证步骤
进入容器内部查看 resolv.conf 文件:
docker compose exec myapp cat /etc/resolv.conf确认 nameserver 是否为你配置的 IP。随后尝试解析域名:
docker compose exec myapp nslookup www.example.com若能看到正确的解析 IP,说明配置生效。
常见坑与排查
- network_mode: host 模式:如果容器使用 host 网络模式,DNS 配置通常会被忽略,直接使用宿主机配置。
- 嵌入式 DNS 冲突:Docker 默认使用 127.0.0.11 作为容器 DNS,自定义 DNS 会覆盖此行为,可能导致容器间服务发现失效,需确保自定义 DNS 能解析内部服务名。
- Networks 层级配置无效:标准 Docker Compose 不支持在 networks 层级直接配置 dns 字段,请勿使用该语法,统一使用服务级配置。
- 守护进程优先级:daemon.json 中的全局配置优先级低于 compose 文件中的服务级配置,但高于默认宿主机配置。