Docker容器无法解决网站名称,而可以ping他们的IP



当我尝试

apt-get update

在基于Ubuntu的容器中。

我有这样的错误。

Temporary failure resolving 'archive.ubuntu.com'.

当我尝试ping ping'archive.ubuntu.com'的IP时,没关系。

但是当我尝试ping" archive.ubuntu.com"时,它向我展示了

uknown host archive.ubuntu.com

所以我尝试了几种可以在互联网上找到的方法。

echo "91.189.92.201 archive.ubuntu.com" >> /etc/hosts

然后我可以ping'Archive.ubuntu.com'

但是其他网站仍然无法按名称链接。

我尝试将行添加到/etc/default/docker,例如

DOCKER_OPTS="--dns 8.8.8.8 --dns 114.114.114.114 --dns 8.8.4.4"

然后我重新启动Docker服务,然后附加到容器上,以查看此

cat /etc/resolv.conf

和结果

root@d9d5bbdb11de:/# 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

我不知道这是否适用。

ps,我可以ping 8.8.8.8,114.114.114.114,8.8.4.4。

由于某些原因,我试图找出它是防火墙问题的地方,所以我在容器中使用了iptables。

iptables-save.

,这是iPtables-sude of containers的结果。

wjy@wjy-VirtualBox:~$ sudo iptables-save [sudo] wjy 的密码: 
# Generated by iptables-save v1.6.0 on Sat Mar  4 16:06:53 2017
*nat :PREROUTING ACCEPT [28:1772] :INPUT ACCEPT [0:0] :OUTPUT ACCEPT [253:15867] :POSTROUTING ACCEPT [253:15867] :DOCKER - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A DOCKER -i docker0 -j RETURN COMMIT
# Completed on Sat Mar  4 16:06:53 2017
# Generated by iptables-save v1.6.0 on Sat Mar  4 16:06:53 2017
*filter :INPUT ACCEPT [1211:567114] :FORWARD DROP [0:0] :OUTPUT ACCEPT [1254:152567] :DOCKER - [0:0] :DOCKER-ISOLATION - [0:0]
-A FORWARD -j DOCKER-ISOLATION
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A DOCKER-ISOLATION -j RETURN COMMIT
# Completed on Sat Mar  4 16:06:53 2017

它可能是主机,DNS或可实现的问题。但是我不知道该怎么做才能使我所有的容器都解决网站名称并链接到Internet。如果您遇到类似情况或知道如何解决,请帮我一个忙。非常感谢。

我正好实验了在主机机器上的代理后面的错误。我的意思是,如果您的Docker主机机器设置了代理设置。我会解释一下我如何解决它,如果您的情况或对他人有用,也许对您有用。

有3个配置代理设置的地方:

  • 在OS级别:

这取决于O.S.,通常您可以将http_proxy=http://yourproxy:port/放在/etc/environment

  • 在Docker发动机级别:

您必须在包含/etc/systemd/system/docker.service.d/http-proxy.conf上创建文件夹和文件:

[Service]
Environment="HTTP_PROXY=http://yourproxy:port/"
  • 和最后一个(在最后两个步骤后不要忘记重新启动),您也必须将其作为Dockerfile上的环境来构建它!

dockerfile的示例:

FROM ubuntu:latest
ENV HTTP_PROXY http://yourproxy:port/
RUN apt-get update

也许这是我的问题。

我的建议是不要触摸iptable,也不要触摸DNS。重新创建容器Docker会自动执行所需的作业。如果您需要在那里触摸,出了点问题。仅确保在Docker Host Machine上完全访问Internet访问。

祝你好运。

最新更新