Docker1.9のマルチホストネットワーク

2015年11月25日(水)
松井 暢之
Docker 1.9で新たに導入されたマルチホストネットワーク機能について、これまでのDockerのネットワークと比較しながら、紹介します。

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通りの手順がある。

  1. Dockerコンテナを起動した後、DockerコンテナをOverlay Networkに参加させる
  2. 「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」を用いた名前解決機能があるため、実用上は問題にならないだろう。

図3:Overlay Driverで構成される仮想ネットワークの実装例

図3:Overlay Driverで構成される仮想ネットワークの実装例

まとめ

最新リリースのDocker 1.9では、Docker単体でマルチホストネットワークを構成できるようになった。Docker Swarm等のコンテナスケジューリングツールと上手に連携させれば、単一ホスト上でDockerを動作させているような利便性を保持したまま、複数ホスト利用による可用性向上や負荷分散が行えるようになるだろう。

皆さんにもぜひ、この新しいDockerネットワーク機能を試してみてほしい。

TIS株式会社

戦略技術センター エキスパート
アーキテクトとして様々なプロジェクトに参画したのち、現部門では新規技術の 研究開発に従事している。
現在はOSSのクラウドオーケストレーションツールCloudConductorの企画開発や、IoT関連技術の研究開発を推進中。

連載バックナンバー

運用・管理

事例から考えるDockerの本番利用に必要なこと

2016/5/26
本番環境へのDockerの導入が進むために必要な条件を、各社の事例を元に考察する。
運用・管理技術解説

Dockerコンテナ環境のバックアップツール「Convoy」を使う

2016/3/30
Docker環境のバックアップツールとして注目されるConvoyのインストールから使用方法までを解説します。
運用・管理技術解説

CoreOS&Docker環境においてOracle Database 11g Release 2をインストールするためのポイント

2016/3/23
データベースの定番であるOracle Databse 11g Release 2を、コンテナ環境に導入する手順を紹介します。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています