如何在 Docker Compose 中为服务指定自定义 DNS 服务器?

文章导读
在 Docker Compose 中为服务指定自定义 DNS,最直接的方式是在 docker-compose.yml 的服务配置下添加 dns 字段,适用于需要解析内网域名或使用特定公共 DNS 的场景。
📋 目录
  1. 服务级配置(推荐)
  2. 全局配置(需谨慎)
  3. 验证步骤
  4. 常见坑与排查
  5. 参考文档
A A

在 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 字段):

如何在 Docker Compose 中为服务指定自定义 DNS 服务器?
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 中为服务指定自定义 DNS 服务器?
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 文件中的服务级配置,但高于默认宿主机配置。

参考文档