Amazon Linuxで最新のDockerを使う + Host networkingを試す
はじめに
5/7に、Docker 0.11がリリースされましたね!
が、しかし。amzn yumリポジトリのDockerのバージョンは残念ながら0.9のままです。
$ sudo yum list docker 読み込んだプラグイン:priorities, update-motd, upgrade-helper 利用可能なパッケージ docker.x86_64 0.9.0-2.13.amzn1
Amazon Linuxでも最新のDockerを使いたい!そして新機能を使いたい!なのでやってみました。
最新のDockerを使う
以下の作業は全てrootで行います。まず最新のdockerバイナリ(v0.11)を取得して/usr/bin/dockerに配置し、実行権限を付与します。
# wget https://get.docker.io/builds/Linux/x86_64/docker-latest -O /usr/bin/docker # chmod +x /usr/bin/docker # docker version Client version: 0.11.1 Client API version: 1.11 Go version (client): go1.2.1 Git commit (client): fb99f99 Server version: 0.11.1 Server API version: 1.11 Git commit (server): fb99f99 Go version (server): go1.2.1 Last stable version: 0.11.1
次にupstartの仕組みを使って、Dockerをdaemonとして登録します。Dockerのgitリポジトリには様々なinit用のスクリプトが用意されていますので、こちらからupstart用のスクリプトファイルを入手し、登録します。
# wget https://raw.githubusercontent.com/dotcloud/docker/master/contrib/init/upstart/docker.conf -O /etc/init/docker.conf # initctl reload-configuration # initctl list | grep docker docker stop/waiting
では起動してみましょう。
# initctl start docker docker start/running, process 4834 # ps aux | grep 4834 root 4834 0.2 0.9 192124 5784 ? Ssl 02:58 0:00 /usr/bin/docker -d
コンテナを立ち上げます。
# docker run -i -t centos /bin/bash Unable to find image 'centos' locally Pulling repository centos 0b443ba03958: Download complete 539c0211cd76: Download complete 511136ea3c5a: Download complete 7064731afe90: Download complete bash-4.1#
無事動作しました!
Host networkingを試す
折角最新のDockerが使えるようになったので、v0.11で追加された新機能であるHost Networkingを試してみます。
まず特にオプションを付けず普通にコンテナを起動してみます。デフォルトではブリッジモードとして起動されます。
# docker run -i -t centos /bin/bash bash-4.1#
この状態でホスト側のネットワークを確認すると、以下のように、dockerサービスを起動したタイミングで作られるdocker0以外に、vethという仮想インターフェースが作成されいます。
$ ifconfig docker0 Link encap:Ethernet HWaddr 56:84:7A:FE:97:99 inet addr:172.17.42.1 Bcast:0.0.0.0 Mask:255.255.0.0 inet6 addr: fe80::5484:7aff:fefe:9799/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:13 errors:0 dropped:0 overruns:0 frame:0 TX packets:3 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:844 (844.0 b) TX bytes:258 (258.0 b) eth0 Link encap:Ethernet HWaddr 06:CB:45:F2:73:DD inet addr:172.31.8.67 Bcast:172.31.15.255 Mask:255.255.240.0 inet6 addr: fe80::4cb:45ff:fef2:73dd/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:198787 errors:0 dropped:0 overruns:0 frame:0 TX packets:62598 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:290881865 (277.4 MiB) TX bytes:3927624 (3.7 MiB) Interrupt:26 veth7673 Link encap:Ethernet HWaddr 72:BC:E6:71:0F:BD inet6 addr: fe80::70bc:e6ff:fe71:fbd/64 Scope:Link UP BROADCAST RUNNING MTU:1500 Metric:1 RX packets:6 errors:0 dropped:0 overruns:0 frame:0 TX packets:3 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:468 (468.0 b) TX bytes:258 (258.0 b)
コンテナ側のネットワークは以下のように、ホスト側に作成されたdocker0インターフェースの対向となるようにeth0が設定されています。
bash-4.1# ifconfig eth0 Link encap:Ethernet HWaddr 26:F9:15:70:EC:AA inet addr:172.17.0.2 Bcast:0.0.0.0 Mask:255.255.0.0 inet6 addr: fe80::24f9:15ff:fe70:ecaa/64 Scope:Link UP BROADCAST RUNNING MTU:1500 Metric:1 RX packets:3 errors:0 dropped:0 overruns:0 frame:0 TX packets:6 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:258 (258.0 b) TX bytes:468 (468.0 b)
またルーティングテーブルも、デフォルトゲートウェイがホストに向けられています。
bash-4.1# netstat -r Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface default ip-172-17-42-1. 0.0.0.0 UG 0 0 0 eth0 172.17.0.0 * 255.255.0.0 U 0 0 0 eth0
ではHost networkingを有効にしてコンテナを起動してみましょう。--net=hostオプションを付与します。
# docker run --net=host -i -t centos /bin/bash
ホスト側のネットワークでは、docker0インターフェースのみがあり、vethインターフェースが作成されません。
$ ifconfig docker0 Link encap:Ethernet HWaddr 56:84:7A:FE:97:99 inet addr:172.17.42.1 Bcast:0.0.0.0 Mask:255.255.0.0 inet6 addr: fe80::5484:7aff:fefe:9799/64 Scope:Link UP BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:16 errors:0 dropped:0 overruns:0 frame:0 TX packets:6 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:970 (970.0 b) TX bytes:486 (486.0 b) eth0 Link encap:Ethernet HWaddr 06:CB:45:F2:73:DD inet addr:172.31.8.67 Bcast:172.31.15.255 Mask:255.255.240.0 inet6 addr: fe80::4cb:45ff:fef2:73dd/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:198787 errors:0 dropped:0 overruns:0 frame:0 TX packets:62598 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:290881865 (277.4 MiB) TX bytes:3927624 (3.7 MiB) Interrupt:26
コンテナ側のネットワークでは、ホストのネットワークインターフェースがそのまま見えています!
bash-4.1# ifconfig docker0 Link encap:Ethernet HWaddr 56:84:7A:FE:97:99 inet addr:172.17.42.1 Bcast:0.0.0.0 Mask:255.255.0.0 inet6 addr: fe80::5484:7aff:fefe:9799/64 Scope:Link UP BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:16 errors:0 dropped:0 overruns:0 frame:0 TX packets:6 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:970 (970.0 b) TX bytes:486 (486.0 b) eth0 Link encap:Ethernet HWaddr 06:CB:45:F2:73:DD inet addr:172.31.8.67 Bcast:172.31.15.255 Mask:255.255.240.0 inet6 addr: fe80::4cb:45ff:fef2:73dd/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:198738 errors:0 dropped:0 overruns:0 frame:0 TX packets:62558 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:290878700 (277.4 MiB) TX bytes:3921205 (3.7 MiB) Interrupt:26
ルーティングテーブルもホストと同じ設定になっています。
bash-4.1# netstat -r Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface default ip-172-31-0-1.a 0.0.0.0 UG 0 0 0 eth0 instance-data.a * 255.255.255.255 UH 0 0 0 eth0 172.17.0.0 * 255.255.0.0 U 0 0 0 docker0 172.31.0.0 * 255.255.240.0 U 0 0 0 eth0
以下、tracerouteの結果です。Host networkingを無効にした状態ではホストを介して通信されていますが、Host networkingを有効にした状態ではホストを介さず直接通信されていることが分かります。
### Host networkingを無効にした状態 bash-4.1# traceroute -n www.google.com traceroute to www.google.com (173.194.126.179), 30 hops max, 60 byte packets 1 172.17.42.1 0.081 ms 0.044 ms 0.033 ms 2 175.41.192.60 17.116 ms 17.054 ms 16.987 ms 3 27.0.0.154 2.257 ms 2.193 ms 2.131 ms --snip-- ### Host networkingを有効にした状態 bash-4.1# traceroute -n www.google.com traceroute to www.google.com (173.194.117.242), 30 hops max, 60 byte packets 1 175.41.192.62 0.832 ms 0.723 ms 0.676 ms 2 27.0.0.172 0.538 ms 0.486 ms 0.636 ms --snip--
githubのmargeされたpullを見ると、他のコンテナのネットワークを介するモードもあるようですね。
docker run --net none busybox ip a # no network setup docker run --net host busybox ip a # host networking configuration docker run --net bridge busybox ip a # the default bridge setup docker run --net container:redis busybox ip a # the network stack of the redis container - amazing
まとめ
最新のDockerを使うのは非常に簡単なので、新機能を追っかけて検証するのも楽ちんです。Host networking機能はネットワークインターフェースが共有されますので、サービス起動するポート番号の競合などは憂慮する必要がありますね。Docker 0.11は実に266ものプルリクがマージされたバージョンになっていますので、他の機能も試してみたいと思います!