我的码头集装箱没有互联网

Rom*_*cea 119 docker

我让它工作正常,但现在停止了.我尝试了以下命令但无济于事:

docker run -dns 8.8.8.8 base ping google.com

docker run base ping google.com

sysctl -w net.ipv4.ip_forward=1 - 在主机和容器上

我得到的只是unknown host google.com.Docker版本0.7.0

有任何想法吗?

PS也被ufw禁用了

wis*_*cky 83

要检查的第一件事是cat /etc/resolv.confdocker容器中运行.如果它具有无效的DNS服务器,例如nameserver 127.0.x.x,则容器将无法将域名解析为IP地址,因此ping google.com将失败.

要检查的第二件事是cat /etc/resolv.conf主机上运行./etc/resolv.conf每次启动容器时,Docker基本上都会将主机复制到容器中.因此,如果主机/etc/resolv.conf是错误的,那么docker容器也是如此.

如果您发现主机/etc/resolv.conf错误,那么您有两个选择:

  1. 在daemon.json中对DNS服务器进行硬编码.这很容易,但如果您希望更改DNS服务器,则不理想.

  2. 修复主机/etc/resolv.conf.这有点棘手,但它是动态生成的,并且您不会对DNS服务器进行硬编码.


1.在docker daemon.json中硬编码DNS服务器

  • 编辑 /etc/docker/daemon.json

    {
        "dns": ["10.1.2.3", "8.8.8.8"]
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 重新启动docker守护程序以使这些更改生效:
    sudo systemctl restart docker

  • 现在,当您运行/启动容器时,docker将填充/etc/resolv.conf来自的值daemon.json.


2.修复主机 /etc/resolv.conf

A. Ubuntu 16.04及更早版本

  • 对于Ubuntu 16.04及更早版本,/etc/resolv.conf由NetworkManager动态生成.

  • 注释掉dns=dnsmasq(用a #) 行/etc/NetworkManager/NetworkManager.conf

  • 重新启动NetworkManager以重新生成/etc/resolv.conf:
    sudo systemctl restart network-manager

  • 在主机上验证: cat /etc/resolv.conf

B. Ubuntu 18.04及更高版本

  • Ubuntu 18.04改为使用systemd-resolved生成/etc/resolv.conf.现在默认情况下它使用本地DNS缓存127.0.0.53.这在集装箱内不起作用,因此Docker将默认使用Google的8.8.8.8 DNS服务器,这可能会破坏防火墙后面的人.

  • /etc/resolv.conf实际上是一个符号链接(ls -l /etc/resolv.conf),/run/systemd/resolve/stub-resolv.conf在Ubuntu 18.04中默认指向(127.0.0.53).

  • 只需将符号链接更改为指向/run/systemd/resolve/resolv.conf,其中列出了真实的DNS服务器:
    sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

  • 在主机上验证: cat /etc/resolv.conf

现在,您应该/etc/resolv.conf在主机上有一个有效的docker复制到容器中.

  • 这适用于 Ubuntu 18.04(选项 B)。然而,docker 没有将现在正确的“/etc/resolv.conf”传输到构建时的容器,我必须手动将文件复制到容器中。 (5认同)
  • 这解决了 Ubuntu 16.04 和 Docker 17.09 上的问题。 (2认同)
  • 这解决了我的问题(与OP,Ubuntu 14.04 / Docker 18.01.0-ce相同)。如果您在Docker映像上没有ping命令,则此链接可能非常有用[测试Internet连接而不进行ping](/sf/answers/1877421031/)。如果您的主机没有systemctl(Ubuntu 14.04),请尝试[如何重新启动网络服务?](https://askubuntu.com/a/544686/466140)和/或重新启动计算机。 (2认同)
  • 在我的机器(RedHat 7.4)上,主机的配置文件是正确的,但容器文件仍然指向 172.0.0.11。那么现在该怎么办呢? (2认同)
  • Ubuntu 20 有什么变化吗?你能更新一下吗? (2认同)

Rom*_*cea 76

通过遵循以下建议修复:

[...]你能尝试重置一切吗?

pkill docker
iptables -t nat -F
ifconfig docker0 down
brctl delbr docker0
docker -d
Run Code Online (Sandbox Code Playgroud)

它将强制docker重新创建网桥并重新启动所有网络规则

https://github.com/dotcloud/docker/issues/866#issuecomment-19218300

似乎接口被某种方式"绞死"了.

更新最新版本的docker:

上面的答案可能仍然可以为你完成工作,但是已经有很长一段时间了,因为这个答案已经发布了,并且docker现在更加精致,所以一定要先尝试这些,然后再进行修改iptables.

sudo service docker restart 或者(如果您使用的是不使用暴发版的Linux发行版) sudo systemctl restart docker

  • `docker -d`失败了.没有`-d`标志. (27认同)
  • @Pawan:`ip链接del docker0` (4认同)
  • 我正面临着`brctl:command not found`错误 (3认同)
  • docker -d在新版本中不存在。而是:“ service docker stop”,然后是“ dockerd”,然后是“ service docker start”。 (3认同)

bit*_*ask 57

重启docker的预期方法不是手动执行,而是使用service或init命令:

service docker restart
Run Code Online (Sandbox Code Playgroud)

  • 如果你在一个不使用upstart的linux发行版中,sudo systemctl restart docker为我工作 (5认同)
  • 确实如此,因为在OP描述的情况下,重置docker会重新初始化网络接口,从而重新启用互联网访问。确实,这并没有解决它有时会崩溃的原因,但它提供了问题的解决方案。 (2认同)

Mau*_*uro 34

尝试了所有答案,没有一个对我有用。

在尝试了我能找到的所有其他方法之后,这成功了:

reboot
Run Code Online (Sandbox Code Playgroud)

  • 这是一个可笑的投票答案,但我就是这么做了……我花了几个小时试图弄清楚为什么会发生奇怪的事情,结果却发现我使用“桥接”网络的容器无法访问任何互联网(不仅仅是 DNS)。在上面的许多答案之后,我重新启动,问题就消失了。叹。 (10认同)
  • 我知道,发布它感觉更可笑。这就是所谓的Windows 技术。 (9认同)

小智 21

使用OSX的答案更新此问题(使用Docker Machine)

如果您使用Docker Machine在OSX上运行Docker,那么以下内容对我有用:

docker-machine restart

<...wait for it to restart, which takes up to a minute...>

docker-machine env
eval $(docker-machine env)
Run Code Online (Sandbox Code Playgroud)

然后(至少根据我的经验),如果你从一个容器ping google.com一切都会好的.


小智 13

我不知道我在做什么,但这对我有用:

OTHER_BRIDGE=br-xxxxx # this is the other random docker bridge (`ip addr` to find)    
service docker stop

ip link set dev $OTHER_BRIDGE down
ip link set dev docker0 down
ip link delete $OTHER_BRIDGE type bridge
ip link delete docker0 type bridge
service docker start && service docker stop

iptables -t nat -A POSTROUTING ! -o docker0 -s 172.17.0.0/16 -j MASQUERADE
iptables -t nat -A POSTROUTING ! -o docker0 -s 172.18.0.0/16 -j MASQUERADE

service docker start
Run Code Online (Sandbox Code Playgroud)

  • 漂亮的胶带! (2认同)
  • 您的回答有助于解决类似的问题。我花了几个小时!Kubespray 安装不完整后,Docker 容器在尝试 ping 任何公共主机或 IP 时会丢失互联网,并显示消息“临时故障解决”。所以我没有这条强制性规则 - `iptables -t nat -A POSTROUTING !-o docker0 -s 172.17.0.0/16 -j MASQUERADE` 。您可以使用“iptables -t nat -L POSTROUTING”检查是否有此规则 (2认同)

job*_*bin 6

我正在使用DOCKER_OPTS="--dns 8.8.8.8"并后来发现,我的容器没有直接访问互联网,但可以访问我的企业内部网.我改为DOCKER_OPTS以下内容:

DOCKER_OPTS="--dns <internal_corporate_dns_address"
Run Code Online (Sandbox Code Playgroud)

替换internal_corporate_dns_address我们的DNS的IP地址或FQDN并使用重新启动的docker

sudo service docker restart
Run Code Online (Sandbox Code Playgroud)

然后生成我的容器并检查它是否可以访问互联网.


Sim*_*ter 6

缺少代理设置也可能导致无法访问互联网。在这种情况下,--network host也可能不起作用。代理可以通过设置环境变量来配置http_proxyhttps_proxy

docker run -e "http_proxy=YOUR-PROXY" \
           -e "https_proxy=YOUR-PROXY"\
           -e "no_proxy=localhost,127.0.0.1" ... 
Run Code Online (Sandbox Code Playgroud)

不要忘记设置 no_proxy ,否则所有请求(包括对 localhost 的请求)都将通过代理。

更多信息:Archlinux Wiki 中的代理设置


L. *_* J. 6

当我的一个容器随机发生这种情况时,我被难住了,而其他容器则很好。容器至少连接到一个非内部网络,因此Compose定义没有任何问题。重新启动 VM / docker 守护进程没有帮助。这也不是 DNS 问题,因为容器甚至无法ping获得外部 IP。为我解决的是重新创建docker网络。在我的情况下,docker-compose down && docker-compose up工作。

撰写

这会强制重新创建所有容器的所有网络:

docker-compose down && docker-compose up

群模式

我想你只是删除并重新创建服务,重新创建服务的网络:

docker service rm some-service

docker service create ...

如果容器的网络是外部的

只需删除并重新创建该服务的外部网络:

docker network rm some-external-network

docker network create some-external-network


cod*_*kel 6

其他答案指出docker0接口(网桥)可能是问题的根源。在 Ubuntu 20.04 上,我观察到该接口缺少其 IP 地址(可使用 检查ip addr show dev docker0)。单独重新启动 Docker 并没有帮助。我必须手动删除桥接口。

sudo ip link delete docker0
sudo systemctl restart docker
Run Code Online (Sandbox Code Playgroud)


lig*_*umq 6

它帮助我:

sudo ip link delete docker0
sudo systemctl stop docker.socket
sudo systemctl stop docker.service

sudo systemctl start docker.socket
sudo systemctl start docker.service
Run Code Online (Sandbox Code Playgroud)

注意:在此之后,接口 docker0 必须具有如下 IP 地址:

inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
Run Code Online (Sandbox Code Playgroud)


Adr*_*wan 5

对我来说,这是主机的防火墙。我必须在主机的防火墙上允许 DNS。并且在更改主机防火墙设置后还必须重新启动 docker。


小智 5

对我来说,我的问题是因为没有安装 iptables-services,这对我有用(CentOS):

sudo yum install iptables-services
sudo service docker restart
Run Code Online (Sandbox Code Playgroud)


Pra*_*ran 5

为后代分享一个简单且有效的解决方案。当我们在没有明确提及该标志的情况下运行 docker 容器时--network,它会连接到其默认桥接网络,该网络禁止连接到外部世界。为了解决这个问题,我们必须创建自己的桥接网络(用户定义的桥接),并且必须使用 docker run 命令明确提及它。

docker network create --driver bridge mynetwork
docker run -it --network mynetwork image:version
Run Code Online (Sandbox Code Playgroud)