如何在 Ubuntu Gnome 15.10 中干净地设置网络 Docker

如何在 Ubuntu Gnome 15.10 中干净地设置网络 Docker

在 Ubuntu Gnome 15.10 中,Docker 几乎开箱即用,但有一个微妙之处。在我重新启动 docker 服务之前,容器似乎无法访问网络。

启动主机后,docker0接口没有任何IP地址。

$ ifconfig docker0
docker0   Link encap:Ethernet  HWaddr ea:03:cc:9c:7a:cd
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:108 (108.0 B)

如果我随后启动一个容器,docker0 接口只会获得一个 ipv6 地址,并且据我所知,容器无法建立网络连接。我无法 ping 主机 IP、LAN IP 或 Internet IP。我正在使用 ubuntu:trusty 映像并运行 bash 作为容器的主进程。

$ ifconfig docker0 
docker0   Link encap:Ethernet  HWaddr 00:00:00:00:00:00
          inet6 addr: fe80::7801:6eff:fe86:6dd8/64 Scope:Link
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:14 errors:0 dropped:0 overruns:0 frame:0
          TX packets:25 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:704 (704.0 B)  TX bytes:3917 (3.9 KB)

如果我重新启动 docker,那么 docker0 会获得一个 ipv4 地址(除了 ipv6 地址),并且一切都会按预期工作。

$ sudo service docker restart 
$ ifconfig docker0
docker0   Link encap:Ethernet  HWaddr 00:00:00:00:00:00
          inet addr:172.17.42.1  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::7801:6eff:fe86:6dd8/64 Scope:Link
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:14 errors:0 dropped:0 overruns:0 frame:0
          TX packets:25 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:704 (704.0 B)  TX bytes:3917 (3.9 KB)

当然,我可以在每次重启机器时重启 docker 服务,或者可能破解一个启动脚本来帮我做这件事(我还没试过)。有谁知道干净的怎么修复这个问题?

答案1

TL;DR:我使用“apt-get install docker.io”安装了 Docker。安装最新版本如下https://docs.docker.com/installation/ubuntulinux/解决了这个问题。

调查该问题后发现,15.10 版 Docker 无法正确创建和初始化 docker0 接口。第一次运行(service docker start)时,它会创建接口但无法初始化它,而后续运行(service docker restart)时,它会初始化它。使用 brctl 手动添加和删除接口可以一致地重现此问题。此错误已在最新的 Docker 中修复。

答案2

对我来说,是 NetworkManager 搞砸了。Docker 服务按原样创建了网桥,然后将其暴露在 dbus 上。NetworkManager 启动,看到 dbus 上的新接口并尝试配置它(因为它很愚蠢,知道网桥 docker0 已经配置好了)。NetworkManager 有时可以成功配置(重新配置)docker0,但有时会失败。所以有时你重新启动机器,docker0 就会被分配 IP,有时则不会。

为了防止 NetworkManager 混乱,请添加

iface docker0 inet manual

假设有/etc/network/interfacesNetworkManager.conf

[ifupdown] managed=false

这是 15.10 的默认设置

(可能应该提出错误来阻止 NetworkManager 弄乱 Docker 特定的接口)

相关内容