我的机器位于具有专用DNS服务器和用于DNS解析的专用区域的专用网络上。我可以从主机上解析此区域中的主机,但不能从主机上运行的容器中解析主机。
主持人 :
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或DOCKER_OPTS="--dns 192.168.0.1"在中设置强制设置/etc/default/docker,但是我的笔记本电脑经常切换网络。似乎应该有系统的方法来解决此问题。
docker --dns 192.168.0.1
DOCKER_OPTS="--dns 192.168.0.1"
/etc/default/docker
Docker /etc/resolv.conf通过复制主机的/etc/resolv.conf,并过滤掉任何本地名称服务器(例如127.0.1.1)来进行填充。如果之后没有名称服务器,则Docker将添加Google的公共DNS服务器(8.8.8.8和8.8.4.4)。
/etc/resolv.conf
根据Docker文档:
注意 :如果需要访问主机的localhost解析器,则必须在主机上修改DNS服务,以侦听可从容器内部访问的非localhost地址。
主机上的DNS服务是dnsmasq,因此,如果您使dnsmasq监听您的docker IP,并将其添加到resolv.conf中,则docker将配置容器以将其用作名称服务器。
1 。 创建/编辑/etc/dnsmasq.conf†并添加以下行:
/etc/dnsmasq.conf
interface=lo interface=docker0
2 。 找到您的Docker IP(在本例中为172.17.0.1):
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 。 创建/编辑/etc/resolvconf/resolv.conf.d/tail并添加以下行:
/etc/resolvconf/resolv.conf.d/tail
nameserver 172.17.0.1
4 。 重启网络,更新resolv.conf,重启docker:
resolv.conf
sudo service network-manager restart sudo resolvconf -u sudo service docker restart
您的容器现在将能够从主机使用的任何DNS服务器解析DNS。
†路径可能是/etc/dnsmasq.conf,/etc/dnsmasq.conf.d/docker.conf,/etc/NetworkManager/dnsmasq.conf,或/etc/NetworkManager/dnsmasq.d/docker.conf根据您的系统和个人喜好上。
/etc/dnsmasq.conf.d/docker.conf
/etc/NetworkManager/dnsmasq.conf
/etc/NetworkManager/dnsmasq.d/docker.conf