本文主要介绍了docker容器的DNS配置及其注意点,重点对docker 1.10发布的embedded DNS server进行了源码分析,看看embedded DNS server到底是个啥,它是如何工作的。
Configure container DNS
DNS in default bridge network
Options | Description |
---|---|
-h HOSTNAME or –hostname=HOSTNAME | 在该容器启动时,将HOSTNAME设置到容器内的/etc/hosts, /etc/hostname, /bin/bash提示中。 |
–link=CONTAINER_NAME or ID:ALIAS | 在该容器启动时,将ALIAS和CONTAINER_NAME/ID对应的容器IP添加到/etc/hosts. 如果 CONTAINER_NAME/ID有多个IP地址 ? |
–dns=IP_ADDRESS… | 在该容器启动时,将nameserver IP_ADDRESS 添加到容器内的/etc/resolv.conf中。可以配置多个。 |
–dns-search=DOMAIN… | 在该容器启动时,将DOMAIN添加到容器内/etc/resolv.conf的dns search列表中。可以配置多个。 |
–dns-opt=OPTION… | 在该容器启动时,将OPTION添加到容器内/etc/resolv.conf中的options选项中,可以配置多个。 |
说明:
如果docker run时不含
--dns=IP_ADDRESS..., --dns-search=DOMAIN..., or --dns-opt=OPTION...
参数,docker daemon会将copy本主机的/etc/resolv.conf,然后对该copy进行处理(将那些/etc/resolv.conf中ping不通的nameserver项给抛弃),处理完成后留下的部分就作为该容器内部的/etc/resolv.conf。因此,如果你想利用宿主机中的/etc/resolv.conf配置的nameserver进行域名解析,那么你需要宿主机中该dns service配置一个宿主机内容器能ping通的IP。如果宿主机的/etc/resolv.conf内容发生改变,docker daemon有一个对应的file change notifier会watch到这一变化,然后根据容器状态采取对应的措施:
- 如果容器状态为stopped,则立刻根据宿主机的/etc/resolv.conf内容更新容器内的/etc/resolv.conf.
- 如果容器状态为running,则容器内的/etc/resolv.conf将不会改变,直到该容器状态变为stopped.
- 如果容器启动后修改过容器内的/etc/resolv.conf,则不会对该容器进行处理,否则可能会丢失已经完成的修改,无论该容器为什么状态。
- 如果容器启动时,用了–dns, –dns-search, or –dns-opt选项,其启动时已经修改了宿主机的/etc/resolv.conf过滤后的内容,因此docker daemon永远不会更新这种容器的/etc/resolv.conf。
- 注意: docker daemon监控宿主机/etc/resolv.conf的这个file change notifier的实现是依赖linux内核的inotify特性,而inotfy特性不兼容overlay fs,因此使用overlay fs driver的docker deamon将无法使用该/etc/resolv.conf自动更新的功能。、
Embedded DNS in user-defined networks
在docker 1.10版本中,docker daemon实现了一个叫做embedded DNS server
的东西,用来当你创建的容器满足以下条件时:
- 使用自定义网络;
- 容器创建时候通过
--name
,--network-alias
or--link
提供了一个name;
docker daemon就会利用embedded DNS server对整个自定义网络中所有容器进行名字解析(你可以理解为一个网络中的一种服务发现)。
因此当你启动容器时候满足以上条件时,该容器的域名解析就不应该去考虑容器内的/etc/hosts, /etc/resolv.conf,应该保持其不变,甚至为空,将需要解析的域名都配置到对应embedded DNS server中。具体配置参数及说明如下:
Options | Description |
---|---|
–name=CONTAINER-NAME | 在该容器启动时,会将CONTAINER-NAME和该容器的IP配置到该容器连接到的自定义网络中的embedded DNS server中,由它提供该自定义网络范围内的域名解析 |
–network-alias=ALIAS | 将容器的name-ip map配置到容器连接到的其他网络的embedded DNS server中。PS:一个容器可能连接到多个网络中。 |
–link=CONTAINER_NAME:ALIAS | 在该容器启动时,将ALIAS和CONTAINER_NAME/ID对应的容器IP配置到该容器连接到的自定义网络中的embedded DNS server中,但仅限于配置了该link的容器能解析这条rule。 |
–dns=[IP_ADDRESS…] | 当embedded DNS server无法解析该容器的某个dns query时,会将请求foward到这些–dns配置的IP_ADDRESS DNS Server,由它们进一步进行域名解析。注意,这些–dns配置到nameserver IP_ADDRESS 全部由对应的embedded DNS server管理,并不会更新到容器内的/etc/resolv.conf. |
–dns-search=DOMAIN… | 在该容器启动时,会将–dns-search配置的DOMAIN们配置到the embedded DNS server,并不会更新到容器内的/etc/resolv.conf。 |
–dns-opt=OPTION… | 在该容器启动时,会将–dns-opt配置的OPTION们配置到the embedded DNS server,并不会更新到容器内的/etc/resolv.conf。 |
说明:
- 如果docker run时不含