在 Docker 容器化环境中,网络连接是至关重要的,而 DNS(Domain Name System,域名系统)解析则是网络通信的基础。容器需要能够解析内部服务名称以及外部域名,以便与其他容器或外部世界进行交互。理解 Docker 如何处理 DNS 请求,可以帮助我们更好地配置和排查网络问题。
Docker 的默认 DNS 配置
默认情况下,当 Docker 启动一个容器时,它会从宿主机复制 /etc/resolv.conf
文件,并对其进行一些修改。这个文件通常包含了宿主机配置的 DNS 服务器地址。
这意味着,在默认的 bridge
网络模式下,容器会使用宿主机 /etc/resolv.conf
文件中定义的 DNS 服务器来进行域名解析。例如,如果你的宿主机配置了 8.8.8.8
(Google Public DNS) 和 114.114.114.114
(国内知名 DNS),那么容器也会默认使用这两个 DNS 服务器。
Docker 会过滤掉宿主机 /etc/resolv.conf
文件中任何指向本地回环地址(如 127.0.0.1
或 127.0.0.53
)的 nameserver
条目。这是因为容器有自己独立的网络命名空间,无法直接访问宿主机的本地回环地址上运行的 DNS 服务。如果 Docker 守护进程的 --dns
选项没有设置,并且宿主机的 /etc/resolv.conf
中只有本地回环地址的 DNS 服务器,Docker 会使用 Google Public DNS (8.8.8.8
和 8.8.4.4
) 作为容器的默认 DNS 服务器。
你可以在容器内部查看 /etc/resolv.conf
文件来确认其 DNS 配置:
docker run -it --rm alpine cat /etc/resolv.conf
自定义网络中的 DNS
当你创建并使用自定义网络(例如,使用 docker network create my-custom-network
创建的网络)时,Docker 的行为会有所不同。对于连接到用户自定义桥接网络或覆盖网络(overlay network)的容器,Docker 提供了一个内置的 DNS 服务器。
这个内置的 DN