ちょっと話題の記事

Amazon Linuxで最新のDockerを使う + Host networkingを試す

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

5/7に、Docker 0.11がリリースされましたね!

Docker_0_11_is_the_Release_Candidate_for_1_0___Docker_Blog

が、しかし。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ものプルリクがマージされたバージョンになっていますので、他の機能も試してみたいと思います!