Docker容器内没有互联网连接


24

我无法在任何Docker容器内执行任何需要Internet连接的命令。

作品:

docker run ubuntu /bin/echo 'Hello world'

不起作用:

docker run ubuntu apt-get update

Err:1 http://archive.ubuntu.com/ubuntu xenial InRelease
  Temporary failure resolving 'archive.ubuntu.com'
Err:2 http://archive.ubuntu.com/ubuntu xenial-updates InRelease
  Temporary failure resolving 'archive.ubuntu.com'
Err:3 http://archive.ubuntu.com/ubuntu xenial-security InRelease
  Temporary failure resolving 'archive.ubuntu.com'
Reading package lists...
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/xenial/InRelease  Temporary failure resolving 'archive.ubuntu.com'
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/xenial-updates/InRelease  Temporary failure resolving 'archive.ubuntu.com'
W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/xenial-security/InRelease  Temporary failure resolving 'archive.ubuntu.com'

pip和类似ping

我在Ubuntu 16.04上,未使用防火墙或公司代理服务器,并尝试重新启动Docker。

更新:

交互模式下的更新以相同的方式失败。

docker exec -ti angry_goodall /bin/bash
apt-get update
#fails
ping google.com
#fails with "unknown host" message
ping 8.8.8.8 
# shows PING 8.8.8.8 (8.8.8.8): 56 data bytes
# and than hangs indefinetly

sudo apt-get update 在主机上成功运行,即在docker之外的我的计算机上运行。

UPD多克尔版本1.12.1,构建23cf638


您可以从主机ping域吗?您可以apt-get update在与Docker交互模式下运行吗?
adampski '16

输出显示错误:解决'archive.ubuntu.com'的临时失败...尝试.. ping www.google.com ..查看是否收到相同的响应..然后尝试... ping 8.8.8.8 .. ..如果IP有效,并且主机名不起作用,则您的DNS断开(更多的/etc/resolv.conf来查看正在使用的DNS服务器)
TG2

@adampski,我根据您的建议更新了问题。
Sashko Lykhenko '16

@ TG2,我也根据您的建议更新了问题。
Sashko Lykhenko '16

您正在运行什么版本的Docker引擎?
adampski '16

Answers:


13

正如creack在GitHub问题#866上为Docker所建议的那样

pkill docker
iptables -t nat -F
ifconfig docker0 down
brctl delbr docker0
docker -d

“这将迫使docker重新创建网桥并重新初始化所有网络规则”


1
我尝试了一下,这杀死了我整个计算机上的网络。
petersohn

这对我很有帮助,并为我解决了该问题。谢谢。

10
-d标志不会退出。
路易·德·索萨

2
嗨,@LuísdeSousa,您对此表示反对,这很可惜,但请考虑一下,在较新版本中可能删除或更改了某些开关的可能性。特别是因为一年多以前。
adampski

3
而不是仅复制/粘贴命令,您可以解释这些意思:)
Adelin

12

StackOverflow上存在类似的问题,其中一个不同的解决方案使用Ubuntu 16.04上的Docker 17.09解决了此问题:

检查以下内容resolv.conf

$ cat /etc/resolv.conf

如果包含这样的行,nameserver 127.0.1.1则表示容器正在获取不正确的名称服务器。要解决此问题,请编辑NetworkManager.conf文件:

$ sudo pico /etc/NetworkManager/NetworkManager.conf

并用注释界线dns=dnsmasq; 该文件应如下所示:

[main]
plugins=ifupdown,keyfile,ofono
#dns=dnsmasq

[ifupdown]
managed=false

最后,重新启动网络管理器:

$ sudo systemctl restart network-manager

再次测试容器:

$ docker run ubuntu:16.04 apt-get update
Get:1 http://archive.ubuntu.com/ubuntu xenial InRelease [247 kB]
Get:2 http://archive.ubuntu.com/ubuntu xenial-updates InRelease [102 kB]

我的安装符合说明,以上方法为我解决了该问题。
krcools

Ubuntu 18.04的更新答案:superuser.com/a/1335054
wisbucky

7

首先要检查的是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"]
    }
    
  • 重新启动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(带有#/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复制到容器中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.