Docker无法在专用networking上parsingDNS

我的机器位于专用DNS服务器的专用networking上,并且是专用于DNSparsing的专用区域。 我可以从主机上parsing这个区域的主机,但我无法从主机上运行的容器parsing它们。

主持人

root@host:~# cat /etc/resolv.conf # Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8) # DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN nameserver 127.0.1.1 root@host:~# ping privatedomain.io PING privatedomain.io (192.168.0.101) 56(84) bytes of data. 

容器

 root@container:~# cat /etc/resolv.conf # Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8) # DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN nameserver 8.8.8.8 nameserver 8.8.4.4 root@container:~# ping privatedomain.io ping: unknown host privatedomain.io 

很显然,Google的公共DNS服务器不能解决我的私人DNS请求。 我知道我可以用docker --dns 192.168.0.1强制它,或者在/etc/default/docker DOCKER_OPTS="--dns 192.168.0.1"设置DOCKER_OPTS="--dns 192.168.0.1" ,但我的笔记本电脑频繁地切换networking。 似乎应该有一个系统的方法来解决这个问题。

Docker通过复制主机的/etc/resolv.conf填充/etc/resolv.conf ,并过滤掉任何本地名称服务器(如127.0.1.1)。 如果之后没有名称服务器,Docker将添加Google的公共DNS服务器(8.8.8.8和8.8.4.4)。

根据Docker文档 :

注意 :如果您需要访问主机的本地主机parsing程序,则必须修改主机上的DNS服务以侦听可从容器内访问的非本地主机地址。

主机上的DNS服务是dnsmasq,所以如果你让dnsmasq监听你的docker IP,并将其添加到resolv.conf中,docker将configuration容器来使用它作为域名服务器。

1 创build/编辑/etc/dnsmasq.conf并添加这些行:

 interface=lo interface=docker0 

2 find您的dockerIP(在这种情况下, 172.17.0.1 ):

 root@host:~# ifconfig | grep -A2 docker0 docker0 Link encap:Ethernet HWaddr 02:42:bb:b4:4a:50 inet addr:172.17.0.1 Bcast:0.0.0.0 Mask:255.255.0.0 

3 创build/编辑/etc/resolvconf/resolv.conf.d/tail并添加以下行:

 nameserver 172.17.0.1 

4 重新启动networking,更新resolv.conf ,重新启动docker:

 sudo service network-manager restart sudo resolvconf -u sudo service docker restart 

您的容器现在将能够parsing主机正在使用的任何DNS服务器的DNS。

†path可能是/etc/dnsmasq.conf/etc/NetworkManager/dnsmasq.d/docker.conf具体取决于您的系统和个人喜好。