【Dockerの最新機能を使ってみよう】 Docker SwarmによるDockerクラスタ環境の構築 3ページ

Docker Swarmを利用した場合のクラスタ構成とネットワーク構成

 Docker SwarmでDockerクラスタを構築してサービスを運用する場合、どのようなネットワーク構成を取るかを検討しなければならない。Docker Swarmでは特別なネットワークルーティング機能などは用意されないため、単純にコンテナを起動するだけでは、異なるノード上にあるコンテナ間の通信すら行えない。そのためDockerが提供するオーバーレイネットワーク機能や、異なるホスト上にあるコンテナ間の通信を可能にするようなネットワークプラグイン等を利用して独自に設定を行う必要がある。

 もっとも簡単なのは、以前の記事で紹介したDockerのマルチホストネットワーク機能を利用するものだ。Docker 1.9以降ではデフォルトでこの機能が利用できるため、簡単に異なるノード上のコンテナ同士を通信させることができる。

 また、Docker SwarmによるDockerクラスタを構築する際のもう1つの課題として、クラスタ外からのアクセスを受け付けるコンテナをどう配置するか、というものがある。「docker run」コマンドにはコンテナを実行するホストの指定したポートへのアクセスをコンテナ内に転送する設定を行う「-p」オプションがあり、これを利用してコンテナ内で稼動しているサービスを外部に公開することが一般的だ。しかしDocker Swarmでコンテナを起動する場合、デフォルト設定では状況によってコンテナを実行するホストが変わってしまうため、外部に公開するIPアドレスを一意に決定できないという問題が発生する。

 これを解決する方法の1つに、クラスタ外からのアクセスを受け付けるコンテナ(フロントエンドコンテナ)を稼動させるノードを前述のフィルタ機能を利用して固定し、そのノードに対してロードバランサでアクセスを振り分ける、というものがある(図3)。

図3 フロントエンドコンテナを実行するノードを固定する構成例
図3 フロントエンドコンテナを実行するノードを固定する構成例

 この構成ではフロントエンドコンテナを実行するノードを固定し、かつノードの特定ポート(たとえばHTTPであれば80番)をフロントエンドコンテナに転送するよう設定することで、ロードバランサから振り分けられたコネクションをフロントエンドコンテナが受け付けられるように設定できる。この場合、フロントエンドコンテナ1つにつき1つのノードが必要となるというデメリットがあるが、ノードの増減を制御しやすいクラウド環境内などであればこちらの構成が容易だ。

 また、コンテナ内でロードバランサを実行するという構成も考えられる(図4)。こちらの場合、フロントエンドコンテナではなくロードバランサコンテナを実行するノードを固定し、そこに外部のロードバランサやファイアウォールからのアクセスを振り分けるという形になる。

図4 コンテナ内でロードバランサを実行する
図4 コンテナ内でロードバランサを実行する

 Dockerのマルチホストネットワーク機能では、内部的に立ち上げられたDNSサーバーを利用することで、コンテナ名だけでネットワークアクセスを行うことが可能になる。これを利用して適切に設定を行っておけば、フロントエンドコンテナがどのノードで稼動してるかに関わらずロードバランサコンテナからフロントエンドコンテナへのアクセスが可能になる。

 この構成ではロードバランサが冗長になりやすいというデメリットがあるが、フロントエンドコンテナを柔軟に配置できるようになる。使用するインフラ環境や目的に応じて、どのような構成を取るのかを検討すると良いだろう。

必要十分の機能を提供するDocker Swarm

 Dockerを利用したクラスタ構築ツールとしてはKubernetesが先行していたが、Docker Swarmも正式リリース版となり、機能的には必要十分なものを提供している。Docker Swarmは特別なクライアント等を利用することなしにDockerクラスタを構築でき、ネットワークなどもDockerの標準機能をそのまま利用するため習得しやすいというメリットがある。

 いっぽうで、Docker SwarmではKubernetesが持つ、依存関係のあるコンテナをまとめて起動・管理するといった機能は提供されていない。この機能は「Docker Compose」と呼ばれる別のツールで提供されており、これを利用することが推奨されている。今回はDocker Composeについては触れていないが、興味のある方はドキュメント等を参照してほしい。