Docker ubuntu 容器可以 ping archive.ubuntu.com 但不能 apt-get

Docker ubuntu container can ping archive.ubuntu.com but not apt-get

我使用 docker-machine 在我们的 openstack 私有云上设置了一个 docker 主机。一切都按预期进行。但是当我尝试使用 ubuntu:14.04 构建一个 Dockerfile 并简单地执行 RUN apt-get update 我得到这个:

Ign http://archive.ubuntu.com trusty InRelease      
Ign http://archive.ubuntu.com trusty-updates InRelease
...

永远占用,然后超时。

然后我删除 RUN apt-get update 和 运行 docker build -t test .docker run -it test /bin/bash

在容器内,我可以 ping archive.ubuntu.com 和任何其他域。我在 resolve.conf 中看到 nameserver 8.8.8.8 在那里。但是当我再次尝试 运行 apt-get update 时,我得到了相同的结果。

我已经尝试 运行 带有 --dns 8.8.8.8 标志的容器,没有任何区别。但是因为我的 resolve.conf 文件有 DNS 条目,而且我可以 ping 域,所以这应该不是问题。

如果我 运行 带有 --net=host 标志的容器,我就能够 apt-get 更新。但是这个标志不适用于 docker build 命令。

我也试过我发现的这个建议的答案 here

sudo apt-get install bridge-utils
pkill docker
iptables -t nat -F
ifconfig docker0 down
brctl delbr docker0
sudo service docker start

但这并没有帮助。

如果我启动不需要软件包更新或安装的预构建映像和服务。一切都按预期工作。 我为 docker 主机尝试了多次重新安装和不同的云映像。主机上没有防火墙软件运行ning。

在其他图像上也有此体验,例如 centos yum update

http://centos.uib.no/7.2.1511/os/x86_64/repodata/repomd.xml: 
[Errno 12] Timeout on http://centos.uib.no/7.2.1511/os/x86_64/repodata/repomd.xml: 
(28, 'Operation too slow. Less than 1000 bytes/sec transferred the last 30 seconds')
Trying other mirror.

我完全迷路了,非常感谢任何帮助!

我猜你是 运行 在 Openstack 上的一个实例上?这个问题很可能是因为 MTU。为了提供一些背景知识,典型的 openstack 部署使用 VXLAN 或 GRE,并且由于它们增加的开销,实例的默认 MTU 减少了(通过 openstack 的 components/something 类似配置)。检查您实例中的 MTU,看看它是否小于等于 1500。

现在,如果您 运行 docker 在实例中,docker 会将默认 MTU 设置为 1500。如果您启动容器并登录到它,您将查看默认 MTU 为 1500。您可以将其降低为 1450 或 1420 并查看它是否有效。我遇到了同样的问题,在降低 MTU 后它对我有用。

ExecStart=/usr/bin/docker daemon -H fd:// --mtu=1450

以下是如何更改 docker 中容器的 MTU 的详细步骤:-

https://rahulait.wordpress.com/2016/02/28/modifying-default-mtu-for-docker-containers/