©
本文档使用
php.cn手册 发布
本节中的信息说明在 Docker 默认网桥中配置容器 DNS。这是一个在安装 Docker 时自动创建名为bridge
的bridge
网络。
注意:通过 Docker 网络功能,您可以创建除默认网桥以外的用户定义网络。有关用户定义网络中 DNS 配置的更多信息,请参阅 Docker Embedded DNS 部分。
Docker 如何为每个容器提供主机名和 DNS 配置,而不必使用内部写入的主机名来构建自定义映像?它的诀窍是/etc
用虚拟文件覆盖容器内的三个关键文件,以便在其中写入新的信息。您可以通过mount
在容器中运行来看到这一点:
root@f38c87f2a42d:/# mount... /dev/disk/by-uuid/1fec...ebdf on /etc/hostname type ext4 ... /dev/disk/by-uuid/1fec...ebdf on /etc/hosts type ext4 ... /dev/disk/by-uuid/1fec...ebdf on /etc/resolv.conf type ext4 ......
这种安排允许 Docker 做一些聪明的事情,例如resolv.conf
当主机在稍后通过
DHCP 接收新的配置时,在所有容器中保持最新状态。Docker 如何在容器中维护这些文件的确切细节可以从一个 Docker 版本更改为下一个,因此您应该保留文件本身,并改为使用以下 Docker 选项。
四个不同的选项影响容器域名服务。
-h HOSTNAME或--hostname = HOSTNAME | 设置容器知道自己的主机名。这写入/ etc / hostname,写入/ etc / hosts 作为容器的面向主机的IP地址的名称,并且是容器内部的/ bin / bash 将在其提示符内显示的名称。但主机名不容易从容器外看到。它不会出现在 docker ps 中,也不会出现在任何其他容器的/ etc / hosts 文件中。 |
---|---|
--link = CONTAINER_NAME或 ID:ALIAS | 在运行容器时使用此选项会为新容器的/ etc / hosts 添加一个名为 ALIAS 的额外条目,该条目指向由 C ONTAINER_NAME_or_ID 标识的容器的 IP 地址。这使新容器内的进程连接到主机名称 ALIAS,而无需知道其 IP。下面将更详细地讨论--link =选项。由于 Docker 可能会在重新启动时为链接的容器分配不同的IP地址,因此 Docker 会更新收件人容器的/ etc / hosts 文件中的 ALIAS 条目。 |
--dns = IP_ADDRESS ... | 将作为域名服务器行添加的IP地址设置为容器的/etc/resolv.conf 文件。容器中的进程在遇到不在/ etc / hosts中的主机名时,将连接到端口53上的这些 IP 地址,以查找名称解析服务。 |
--dns-search=DOMAIN... | 通过在容器的/etc/resolv.conf 中写入搜索行来设置在容器内部使用裸露的不合格主机名时搜索的域名。例如,当容器进程尝试访问主机并设置搜索域 example.com 时,DNS 逻辑不仅会查找主机,还会查找 host.example.com。使用--dns-search =。如果你不想设置搜索域。 |
--dns-opt=OPTION... | 通过将选项行写入容器的/etc/resolv.conf 来设置 DNS 解析器使用的选项。有关有效选项的列表,请参阅 resolv.conf 的文档 |
关于 DNS 设置,在没有的--dns=IP_ADDRESS...
,--dns-search=DOMAIN...
或--dns-opt=OPTION...
选项,Docker 每个容器的/etc/resolv.conf
模样/etc/resolv.conf
主机(其中的docker
守护进程(daemon)运行)。在创建容器时/etc/resolv.conf
,守护进程(daemon)从主机的原始文件中过滤掉所有本地主机 IP 地址nameserver
条目。
过滤是必要的,因为主机上的所有本地主机地址都无法从容器的网络访问。在过滤之后,如果nameserver
容器/etc/resolv.conf
文件中没有剩余条目,守护进程将公共 Google DNS 名称服务器(8.8.8.8和8.8.4.4)添加到容器的 DNS 配置中。如果守护程序启用了 IPv6,则还将添加公共 IPv6 Google DNS 名称服务器(2001:4860:4860 :: 8888和2001:4860:4860 :: 8844)。
注意:如果您需要访问主机的本地主机解析程序,则必须修改主机上的 DNS 服务以侦听可从容器内访问的非本地主机地址。
您可能想知道主机/etc/resolv.conf
文件更改时会发生什么。docker
守护进程(daemon)有一个文件改变通知活跃,将监视更改到主机的 DNS 配置。
注意:文件更改通知程序依赖于 Linux 内核的 inotify 功能。由于此功能当前与覆盖文件系统驱动程序不兼容,因此使用“覆盖”的 Docker 守护程序将无法利用
/etc/resolv.conf
自动更新功能。
当主机文件更改时,resolv.conf
与主机匹配的所有停止的容器将立即更新为此最新的主机配置。在主机配置发生变化时运行的容器需要停下来,并且由于缺乏设施而开始采用主机更改,以确保resolv.conf
在容器运行时对文件进行原子写入。如果容器resolv.conf
从缺省配置启动后已经被编辑,则不会尝试替换,因为它会覆盖容器执行的更改。如果选项(--dns
,,--dns-search
或--dns-opt
)已用于修改默认主机配置,则更新主机的更换/etc/resolv.conf
也不会发生。
注意:对于
/etc/resolv.conf
在 Docker 1.5.0中实现更新功能之前创建的容器:当主机文件发生更改时,这些容器将不会收到更新resolv.conf
。只有使用 Docker 1.5.0或更高版本创建的容器才会使用此自动更新功能。