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

mar*_*v81 7 networking 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)
Run Code Online (Sandbox Code Playgroud)

如果我然后启动一个容器,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)
Run Code Online (Sandbox Code Playgroud)

如果我重新启动 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)
Run Code Online (Sandbox Code Playgroud)

当然,我可以在每次重新启动机器时重新启动 docker 服务,或者可能 hack 一个启动脚本来为我做这件事(我没有尝试过)。有谁知道解决这个问题的干净方法?

mar*_*v81 7

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 中修复。