Docker 容器内没有互联网连接

Docker 容器内没有互联网连接

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

作品:

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之外的我的电脑上。

更新Docker 版本 1.12.1,内部版本 23cf638

答案1

根据建议GitHub 上 Docker 问题 #866 上的 creack

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

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

答案2

当您创建容器时docker run未明确指定其网络(--network foo),docker 会将其连接到默认bridge网络。

默认bridge网络已被弃用(无法找到有关哪个版本的 Docker Engine 的信息),应被视为实现细节,不应使用。

但更重要的是,任何连接到默认bridge网络的容器都禁止与外界联网 - 请参阅“自定义桥接和默认桥接的区别”

你可以使这种网络与外界相连,但我不建议这样做。它要求您保留建议的主机配置更改,这可能不是您想要的。

解决方法很简单:只需创造您自己的(用户定义的)桥接网络,将其命名为,common并使用创建的每个一次性容器明确使用它docker run

$ docker network create --driver bridge common
$ docker run -it --network common ubuntu:latest bash

答案3

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]

答案4

对我来说,这似乎很有效:

systemctl stop docker

systemctl start docker

(可能systemctl restart docker也会有效)

相关内容