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 アドレスのみを取得し、コンテナからのネットワーク接続は不可能であることがわかります。ホスト IP、LAN IP、またはインターネット IP に ping できません。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 は (ipv6 アドレスに加えて) ipv4 アドレスを取得し、すべてが期待どおりに動作します。

$ 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をインストールしました。最新バージョンをインストールするには、Ubuntu 16.04 のインストール問題を修正します。

この問題を調査した結果、Docker のバージョン 15.10 では、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/interfaces仮定NetworkManager.confすると

[ifupdown] managed=false

15.10ではデフォルトです

(NetworkManager が docker 固有のインターフェースを台無しにしないようにするには、おそらくバグを発生させる必要があります)

関連情報