Docker1.9のマルチホストネットワーク
Overlay Driverの検証
ここまでの手順によりOverlay Driverを利用する準備が整ったので、実際に動作させ検証を行う。
Overlay Networkの生成
「docker network create」コマンドを用いて、Overlay Networkを構成する。構成された情報はconsulを通じてすべてのホストで共有されるため、どのホストでコマンドを実行してもかまわない。
下記のように「--driver=overlay」を明示的にDriverを指定しないと、Bridge Driverを用いて仮想ネットワークが作成されてしまうので注意すること。また「--subnet」オプションを用いれば、Dockerが生成する仮想ネットワークのネットワークアドレスを指定することもできる。どのようなオプションが使えるかは、「docker network create --help」で確認してほしい。
root@docker01:~# docker network create --driver=overlay --subnet=192.168.0.0/24 vnet
本稿では、「vnet」という名前のOverlay Networkを「192.168.0.0/24」というサブネットアドレスで作成したものとして検証を進める。
Dockerコンテナを起動してOverlay Networkに接続
Overlay Networkに接続するためには、以下の2通りの手順がある。
- Dockerコンテナを起動した後、DockerコンテナをOverlay Networkに参加させる
- 「docker run」のオプションでOverlay Networkを指定し、Overlay Neworkに接続した状態でDockerコンテナを起動する
どちらの手順を取っても、Overlay Network上でDockerコンテナ間の通信が可能となるが、Dockerデーモンによって自動的に構成されるネットワークの状態が少し異なる。その差異は後述するが、まずはそれぞれの手順を見ていこう。
Dockerコンテナ起動後にOverlay Networkに接続
まずは、Dockerコンテナを通常どおり起動させる。
【Dockerコンテナ起動】 root@docker01:~# docker run -itd --name=c01 --hostname=c01 ubuntu:14.04
この段階で、Dockerコンテナには従来通り、docker0に接続されたeth0が差し込まれる。
その後、DockerコンテナをOverlay Networkに接続する。
【DockerコンテナをOverlayNetworkに接続】 root@docker01:~# docker network connect vnet c01
この段階でDockerコンテナには、Overlay Networkに接続されたeth1が差し込まれる。
Overlay Networkに接続した状態でDockerコンテナを起動
「--net」オプションを用いることで、Overlay Networkに接続された状態でDockerコンテナを起動させることができる。
【OverlayNetworkを指定してDockerコンテナ起動】 root@docker02:~# docker run -itd --name=c02 --hostname=c02 --net=vnet ubuntu:14.04
これにより、Overlay Networkに接続されたeth0を持ったDockerコンテナが起動する。
ただしOverlay NetworkはSandbox内に隠蔽されており、Snadbox外部のネットワークとは直接の通信ができない。この問題を解決するために、ホストOSのネットワークスタック上に仮想ブリッジ(docker_gwbridge)が自動的に作成され、docker_gwbridgeと接続したeth1がDockerコンテナに自動的に差し込まれる。
以上の2通りの手順を比較すると、eth0とeth1が逆転していることがわかるだろう。実際に行う際には注意が必要だ。
--linkオプションを用いないDockerコンテナの名前解決
従来、他のDockerコンテナにコンテナ名でアクセスするためには、Dockerコンテナ起動時に「--link」オプションを指定する必要があった。
しかし新しいDockerネットワーク機能を用いると、コンテナが接続するたびに、「コンテナ名」や「コンテナ名.ネットワーク名」というエントリが、そのネットワークに参加している全てのコンテナの「/etc/hosts」に自動的に追加される。またこれらのエントリは、「docker stop」でコンテナを停止すれば、自動削除される。
そのため「--link」オプションを明示的に指定せずとも、複数のコンテナ間をコンテナ名でアクセスすることができ、非常に便利である。
【/etc/hostsの例】 root@docker01:~# docker exec c01 cat /etc/hosts 172.17.0.2 c01 127.0.0.1 localhost 192.168.0.3 c02 192.168.0.3 c02.vnet
この「/etc/hosts」を用いたDockerコンテナの名前解決は、Overlay DriverだけでなくBridge Driverでも適用される。そのため、単一ホストでDockerを運用する場合であっても、従来のdocker0と--linkオプションを使うのではなく、新しいDockerネットワークのBridge Driverを用いた方が使い勝手が良い場合もあるだろう。
Dockerコンテナ間の疎通確認
このようにして、複数のホストに分散したDockerコンテナを同じOverlay Networkに接続すれば、Dockerコンテナどうしが同じサブネットに所属しているものとして、通信が可能となる。pingやnetcat等を用いて、パケットの到達状況を確認してみると良いだろう。
またOverlay Networkに接続するDockerコンテナは、Overlay Networkだけでなく、ホストのネットワークにつながった仮想ブリッジにも接続されている。Dockerコンテナのdefault gatewayは、このBridge Networkに向けられているため、Dockerコンテナからホストのネットワークスタックを経由して外部ネットワークとの通信も可能である。
Overlay Networkの状態
では最後に、Overlay Driverが構成する仮想ネットワークの状態を確認してみよう。
たとえば同一サブネットの2台のホスト+別サブネットの1台のホストで、Overlay Networkを構成した場合、図3のようにSandboxに隠蔽された仮想ブリッジbr0がお互いにVXLANで接続されて、仮想ネットワークが構成される。
上述した「Dockerコンテナ起動 → Overlay Networkに接続」というステップでDockerコンテナをOverlay Networkに接続した場合、Dockerコンテナはdocker0に接続したeth0とOverlay Networkに所属したeth1を持つことになる(下図のc01)。一方「--net」オプションを用いてOverlay Networkに接続したDockerコンテナを直接起動した場合、DockerコンテナはOverlay Networkに接続したeth0と、新たに作成された仮想ブリッジ(docker_gwbridge)に接続したeth1を持つ(下図のc02とc03)。
Overlay Networkのネットワークアドレスは、「docker network create」実行時に指定できるが、各コンテナに割り当てられるIPアドレスは、従来と同様にDockerデーモンが決めており、利用者が明示的に指定することはできない。ただし前述した「/etc/hosts」を用いた名前解決機能があるため、実用上は問題にならないだろう。
まとめ
最新リリースのDocker 1.9では、Docker単体でマルチホストネットワークを構成できるようになった。Docker Swarm等のコンテナスケジューリングツールと上手に連携させれば、単一ホスト上でDockerを動作させているような利便性を保持したまま、複数ホスト利用による可用性向上や負荷分散が行えるようになるだろう。
皆さんにもぜひ、この新しいDockerネットワーク機能を試してみてほしい。
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- Oracle Cloud Hangout Cafe Season 4 #2「Kubernetesのネットワーク」(2021年5月12日開催)
- コンテナ関連技術の現状を確認しておく
- Neutron最新動向: 活発なサブプロジェクトに注目
- Project Calicoのアーキテクチャを見てみよう
- Dockerコンテナ環境のバックアップツール「Convoy」を使う
- コンテナとKubernetes作成・運用に関するセキュリティ
- OpenStackの自動構築
- サービス・ディスカバリのためのConsul入門
- Dockerコンテナのオーケストレーション機能を実現するOpenStack Magnumを触ってみた
- CentOS 7のネットワーク管理基礎(後編)