Answers:
在取消DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
在/etc/default/docker
为马特运营商建议没有不为我工作。也没有将我公司的DNS服务器放在该文件中。但是,还有另一种方式(请继续阅读)。
首先,让我们验证问题:
$ docker run --rm busybox nslookup google.com # takes a long time
nslookup: can't resolve 'google.com' # <--- appears after a long time
Server: 8.8.8.8
Address 1: 8.8.8.8
如果命令似乎挂起,但最终吐出错误“无法解析'google.com'”,那么您和我有同样的问题。
该nslookup
命令查询DNS服务器8.8.8.8,以将“ google.com”的文本地址转换为IP地址。具有讽刺意味的是,8.8.8.8是Google的公共DNS服务器。如果nslookup
失败,则您的公司可能会阻止8.8.8.8之类的公共DNS服务器(出于安全原因,我认为这是假定的)。
你可能会认为,将您的公司的DNS服务器DOCKER_OPTS
中/etc/default/docker
应该做的伎俩,但无论出于何种原因,它并没有为我工作。我在下面描述对我有用的东西。
解决方案:
在主机上(我使用的是Ubuntu 16.04),查找主要和辅助DNS服务器地址:
$ nmcli dev show | grep 'IP4.DNS'
IP4.DNS[1]: 10.0.0.2
IP4.DNS[2]: 10.0.0.3
使用这些地址,创建一个文件/etc/docker/daemon.json
:
$ sudo su root
# cd /etc/docker
# touch daemon.json
放入/etc/docker/daemon.json
:
{
"dns": ["10.0.0.2", "10.0.0.3"]
}
从根目录退出:
# exit
现在重启docker:
$ sudo service docker restart
验证:
现在检查添加/etc/docker/daemon.json
文件是否可以将“ google.com”解析为IP地址:
$ docker run --rm busybox nslookup google.com
Server: 10.0.0.2
Address 1: 10.0.0.2
Name: google.com
Address 1: 2a00:1450:4009:811::200e lhr26s02-in-x200e.1e100.net
Address 2: 216.58.198.174 lhr25s10-in-f14.1e100.net
参考资料:
我的解决方案基于Robin Winslow的文章,该解决方案值得所有赞扬。谢谢,罗宾!
“修复Docker的网络DNS配置。” 罗宾·温斯洛(Robin Winslow)。检索2016-11-09。https://robinwinslow.uk/2016/06/23/fix-docker-networking-dns/
nslookup google.com 8.8.8.8
就我而言,是我收到了此错误connection timed out; no servers could be reached
/etc/default/docker
对某些人不起作用的原因是(引用文件中的评论)# THIS FILE DOES NOT APPLY TO SYSTEMD
经过很多头痛后,我找到了答案。Could not resolve 'archive.ubuntu.com'
可以通过进行以下更改来修复:
取消注释以下行 /etc/default/docker
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"
重新启动Docker服务
sudo service docker restart
删除所有已缓存无效DNS设置的图像。
归功于Andrew SB
docker build --no-cache=true ...
docker build --no-cache=true -t docker-whale .
但似乎没什么不同。
我遇到了同样的问题,但是无需取消注释/ etc / default / docker dns条目或编辑构建容器中的/etc/resolv.conf或/etc/docker/daemon.json对我有帮助。
但是,在我使用--network = host选项进行构建之后,解析又很好了。
docker build --network=host -t my-own-ubuntu-like-image .
也许这会再次帮助某人。
我相信Matt Carrier的答案是解决此问题的正确方法。但是,实施后,我仍然观察到相同的行为:could not resolve 'archive.ubuntu.com'
。
这使我最终发现我连接的网络阻止了公共DNS。解决此问题的方法是将Docker容器配置为使用与主机(运行Docker的计算机)所使用的名称服务器相同的名称服务器。
我如何分类:
docker run -it docker/whalesay bash
ping 172.217.4.238
:(google.com)ping google.com
就我而言,第一个ping
结果是响应,第二个则没有。
我如何解决:
一旦发现DNS在容器内不起作用,我便验证了可以在主机上复制相同的行为。nslookup google.com
在主机上解决就好了。但是,nslookup google.com 8.8.8.8
还是nsloookup google.com 8.8.4.4
超时。
接下来,通过运行nm-tool
(在Ubuntu 14.04上),找到了主机正在使用的名称服务器。为了获得快速反馈,我再次启动了示例图像,并将名称服务器的IP地址添加到了容器的resolv.conf文件:中sudo vi /etc/resolv.conf
。保存后,我再次尝试ping(ping google.com
),这一次成功了!
请注意,对容器的resolv.conf所做的更改不是永久性的,并且在重新启动容器后将丢失。就我而言,更合适的解决方案是将网络名称服务器的IP地址添加到主机的/etc/default/docker
文件中。
nmcli device show <interfacename> | grep IP4.DNS
(Ubuntu> = 15)和nmcli dev list iface <interfacename> | grep IP4
(Ubuntu <15)。信用:马蒂·弗里德(Marty Fried)。
在将本地dns ip添加到默认的docker文件后,它开始为我工作...请找到以下步骤...
$ nm-tool # (will give you the dns IP)
DNS:172.168.7.2
$ vim /etc/default/docker # (uncomment the DOCKER_OPTS and add DNS IP)
DOCKER_OPTS="--dns 172.168.7.2 --dns 8.8.8.8 --dns 8.8.4.4"
$ rm `docker ps --no-trunc -aq` # (remove all the containers to avoid DNS cache)
$ docker rmi $(docker images -q) # (remove all the images)
$ service docker restart #(restart the docker to pick up dns setting)
现在继续构建docker ... :)
对于也有此问题的任何人,我都/etc/default/docker
按照其他答案和问题的建议通过编辑文件解决了我的问题。但是我不知道将什么IP用作DNS。
不久之后,我发现我必须ifconfig docker
在主机上运行才能显示docker网络接口的IP。
docker0 Link encap:Ethernet Endereço de HW 02:42:69:ba:b4:07
inet end.: 172.17.0.1 Bcast:0.0.0.0 Masc:255.255.0.0
endereço inet6: fe80::42:69ff:feba:b407/64 Escopo:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Métrica:1
pacotes RX:8433 erros:0 descartados:0 excesso:0 quadro:0
Pacotes TX:9876 erros:0 descartados:0 excesso:0 portadora:0
colisões:0 txqueuelen:0
RX bytes:484195 (484.1 KB) TX bytes:24564528 (24.5 MB)
就172.17.0.1
我而言。希望这对遇到此问题的所有人有所帮助。
ifconfig docker0
经过一番Google搜索,我找到了这个答案。我正在使用Windows,因此上述某些答案不适用于我的文件系统。
基本上运行:
docker-machine ssh default
echo "nameserver 8.8.8.8" > /etc/resolv.conf
8.8.8.8
我相信,这将覆盖现有的名称服务器。它为我工作!
根据一些评论,您可能必须是root。为此,请发出sudo -i
。
ssh
不起作用,因为不存在?
sudo -i
请在您进入时发布
我只想为从搜索引擎中遇到此问题的任何人添加最新答复。
不要这样做:我曾经在/ etc / default / docker中有一个选项来设置iptables=false
。这是因为ufw无法正常工作(即使只允许3个端口也被打开了),所以我盲目地遵循了这个问题的答案:使用Docker时,不复杂的防火墙(UFW)不会阻塞任何东西,而这在注释
我对iptables规则/ nat /路由的了解非常低,因此为什么我可能会做一些不合理的事情。
原来,我可能对它进行了错误配置,并杀死了容器内的DNS解析。当我运行一个交互式容器终端时:docker run -i -t ubuntu:14.04 /bin/bash
我得到了以下结果:
root@6b0d832700db:/# ping google.com
ping: unknown host google.com
root@6b0d832700db:/# cat /etc/resolv.conf
search online.net
nameserver 8.8.8.8
nameserver 8.8.4.4
root@6b0d832700db:/# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=56 time=1.76 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=56 time=1.72 ms
恢复我所有的ufw配置(before.rules),禁用ufw并从/ etc / default / docker中删除iptables = false还原了容器的DNS解析功能。
我现在期待通过遵循这些说明来重新启用ufw功能。
对我来说同样的问题(在Ubuntu Xenial上)。
docker run --dns ...
用于工作的容器。 docker build
(docker-compose等)更新docker守护程序选项不起作用。在分析docker日志(journalctl -u docker.service
)后,如果发现有关应用resolvconf错误的警告。
之后,我发现我们的公司名称服务器已添加到网络接口,但未添加到resolvconf中。
应用此解决方案如何在接口中配置我的静态DNS?(askubuntu),即将名称服务器添加到/etc/resolvconf/resolv.conf.d/tail
更新resolvconf之后(或重新启动)。
bash
docker run --rm busybox nslookup google.com
立即工作。
我所有的docker-compose构建现在都在工作。
我现在也为此苦了一段时间,但这正是我解决它的原因Ubuntu 16.04 x64
。我希望它也可以节省人的时间。
在/etc/NetworkManager/NetworkManager.conf
:注释掉
#dns=dnsmasq
创建(或修改)/etc/docker/daemon.json
:
{
"dns": ["8.8.8.8"]
}
sudo service docker restart
newgrp docker
而不是完全注销然后在给自己登录后登录,则在使用新的docker安装的linux笔记本电脑上发生这种sudo usermod -aG docker myuserid
情况。确保它确实发生了