Ubuntu Overlay 场景下的 DNS 配置指南
先明确你的 Overlay 类型
- 若指的是 Docker Swarm 的 Overlay 网络(跨主机容器通信),容器内的 DNS 由 Docker 的内置 DNS 服务(通常为 127.0.0.11)自动提供,服务发现通过服务名解析;你只需保证宿主机网络与 Docker 守护进程正确即可。
- 若指的是 OverlayFS(联合文件系统,用于分层存储),它不处理网络与 DNS;DNS 仍应在宿主机或容器内部按常规方式配置。
Docker Swarm Overlay 的 DNS 配置
- 基本思路:让容器通过 Docker 的内置 DNS 解析服务名,必要时为容器指定自定义 DNS 服务器或搜索域。
- 操作步骤:
- 创建或加入 Swarm 后,创建 Overlay 网络:
docker network create --driver overlay my_overlay
- 部署服务时显式指定 DNS(可选,默认使用 Docker 内置 DNS 127.0.0.11):
docker service create
–name web
–network my_overlay
–dns 8.8.8.8 --dns 1.1.1.1
–dns-search cluster.local
nginx:latest
- 进入容器验证解析是否走 127.0.0.11:
docker exec -it <容器ID> sh
cat /etc/resolv.conf
nslookup tasks.web
- 常见要点:
- 服务名解析依赖 Docker 的内置 DNS;自定义 --dns 仅影响容器内对“外部域名”的解析。
- 跨主机通信需确保节点间网络可达(如 VXLAN 端口 4789/UDP 未被防火墙拦截)。
宿主机或容器使用 systemd-resolved 的持久化 DNS 配置
- 适用于需要在宿主机或容器里自定义 DNS 的场景(如内网域名、DoT/DoH)。
- 宿主机配置(推荐):
- 编辑 /etc/systemd/resolved.conf:
sudo cp /etc/systemd/resolved.conf /etc/systemd/resolved.conf.bak
sudo nano /etc/systemd/resolved.conf
写入示例:
[Resolve]
DNS=192.168.10.10 8.8.8.8
FallbackDNS=1.1.1.1
Domains=~corp.local
DNSOverTLS=yes
- 启用并重启服务:
sudo systemctl enable --now systemd-resolved
sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
sudo systemctl restart systemd-resolved
- 验证:
resolvectl status
- 容器配置(需要时):
- 运行容器时注入自定义 DNS 与搜索域(示例):
docker run -it --rm --dns 192.168.10.10 --dns-search corp.local ubuntu:24.04 cat /etc/resolv.conf
- 若容器使用 systemd-resolved(如基于 systemd 的镜像),可在容器内同样编辑 /etc/systemd/resolved.conf 并重启服务。
使用 Netplan 配置宿主机网络与 DNS(Ubuntu 18.04+ 常见)
- 编辑 /etc/netplan/*.yaml(如 00-installer-config.yaml),在对应网卡下添加 nameservers:
network:
ethernets:
eth0:
addresses: [192.168.1.100/24]
routes:
- to: default
via: 192.168.1.1
nameservers:
addresses: [192.168.10.10, 8.8.8.8]
search: [corp.local]
version: 2
- 应用配置并验证:
sudo netplan apply
resolvectl status
- 提示:
- 将内网 DNS 放在列表首位,确保内网域名优先解析。
- 修改前先备份原文件,避免语法缩进错误导致网络中断。
快速排查清单
- 查看当前生效的 DNS 配置:resolvectl status;容器内可 cat /etc/resolv.conf 确认是否为 127.0.0.11(Docker 内置 DNS)。
- 解析测试:nslookup 或 dig 目标域名;若期望走内网 DNS,确认首跳是否为内网 DNS 服务器。
- Swarm 场景:确认服务已连接到正确的 Overlay 网络,节点间 4789/UDP 未被拦截,服务名拼写正确。
- 变更后未生效:重启 systemd-resolved(sudo systemctl restart systemd-resolved)或重新部署服务(docker service update --force )。