如何在 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 手動新增和刪除介面來一致地重現。這個bug已經在最新的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 特定介面)

相關內容