我无法在任何 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
也会有效)