Swarm モードの重要な考え方

ここでは Docker Engine 1.12 におけるクラスター管理とオーケストレーション機能に特有の考え方について説明します。

Swarm とは何か

Docker Engine に組み込まれているクラスター管理とオーケストレーション機能は、Swarmkit を使って構築されています。 Swarmkit は Docker のオーケストレーション層を実装する別のプロジェクトですが、Docker 内において直接用いられています。

Swarm とは、複数の Docker ホストが Swarm モード で稼動し、マネージャー(参加者を管理し代表となるノード)またはワーカー(Swarm サービス を起動するノード)として振る舞います。 Docker ホストは、マネージャー、ワーカーのいずれになるか、あるいは両方の役割を持つことができます。 サービスを生成する際には、サービスの最適な状態(レプリカ数、利用可能なネットワークやストレージ、外部にサービスを公開するポート番号など)を定義します。 Docker は定義された状態を維持しながら動作します。 たとえばワーカーノードが利用不能になった場合、Docker はそのノードのタスクを別のノードに割り当てます。 タスク とは実行コンテナーのことであり、Swarm サービスの一部として Swarm マネージャーによって管理されます。 スタンドアロンコンテナーとは対照的なものです。

Swarm サービスをスタンドアロンコンテナーと比べた場合の重要な利点は、接続されているネットワークやボリュームなどの設定内容を、サービスを再起動することなく変更できる点です。 Docker は設定内容を更新した上で、古くなった設定に基づいたサービスタスクを終了させ、定義された設定に従った新たなものを生成します。

Docker が Swarm モードで稼動しているときに、Swarm に参加している Docker ホスト上では、スタンドアロンコンテナーも起動することができます。 Swarm サービスと同時に起動させることができます。 スタンドアロンコンテナーと Swarm サービスの重要な違いは、Swarm を管理するのは Swarm マネージャーだけであり、一方スタンドアロンコンテナーは Docker デーモン上で動作します。 Docker デーモンは Swarm 内に対して、マネージャー、ワーカー、あるいはその両方として参加します。

Docker Compose を使ってコンテナーを定義し実行した場合と同じように、Swarm サービス スタックを定義して実行することができます。

Docker Swarm サービスに関する考え方の詳細を、これより読み進めてください。 以降ではノード、サービス、タスク、負荷分散について示します。

ノード

ノード とは Swarm に参加している Docker Engine のインスタンスの 1 つのことです。 Docker ノードとして表現してかまいません。 1 つまたは複数のノードを、単一の物理コンピューターやクラウドサーバー上で実行することができます。 ただし本番環境での Swarm デプロイメントにおいては、通常は複数の物理マシンやクラウドマシンに分散された Docker ノードを利用します。

Swarm に対してアプリケーションをデプロイするには、マネージャーノード に対してサービス定義を行う必要があります。 マネージャーノードは、タスク と呼ばれる処理単位をワーカーノードに割り振ります。

マネージャーノードはまた、Swarm の定義状態を維持するために必要となるオーケストレーション機能やクラスター管理機能を実現します。 マネージャーノードが 1 人のリーダーを選出して、オーケストレーションのタスクを指揮します。

ワーカーノード は、マネージャーノードから割り振られたタスクを受け取り実行します。 デフォルトにおいてマネージャーノードは、ワーカーノードとしてサービス実行も行います。 ただし設定によってマネージャータスクのみを行い、マネージャーオンリーのノードとすることもできます。 エージェントというものが各ワーカーノード上に起動しており、そのノードに割り当てられたタスクに関する報告を行います。 ワーカーノードは割り当てられたタスクの現状態を、マネージャーに通知します。 マネージャーノードはこれによって、各ワーカーに定義された状態を維持管理できるようになっています。

サービスとタスク

サービス とはタスク定義のことであり、マネージャーノードやワーカーノード上で実行されます。 これが Swarm システムの中心的な構成であり、Swarm に対してユーザーが対話するための対象となります。

サービスを生成するときには、実行中の複数コンテナー内において、どのコンテナーイメージを利用し、どういったコマンドを実行するかを指示します。

複製サービス(replicated service)モデルにおいては、定義されたスケールに基づいて、ノード間のタスクレプリカ数を Swarm マネージャーが配分します。

グローバルサービス の場合、Swarm はクラスター内の利用可能ノード上に、このサービスにおける 1 つのタスクを実行します。

タスク とは Docker コンテナーとその内部で実行されるコマンドを意味します。 これは Swarm に割り当てられる最小単位のものです。 マネージャーノードは、サービスのスケールとして設定されたレプリカ数に応じて、タスクをワーカーノードに割り当てます。 一度ノードに割り当てられたら、そのタスクは他のノードに移すことはできません。 タスクは割り当てられたノード上で実行されるか、そうでなければ失敗するだけです。

負荷分散

Swarm マネージャーは Ingress 負荷分散 を利用して、Swarm の外部向けに利用可能としたいサービスを公開します。 Swarm マネージャーはサービスに対して 公開ポート(PublishedPort)を自動で割り当てます。 公開ポートは設定により定めることもできます。 その場合、利用されていないポートであれば、どれでも設定可能です。 ポートを指定しなかった場合、Swarm マネージャーは 30000 から 32767 の範囲でポートを割り当てます。

クラウドロードバランサーなどのような外部コンポーネントからは、クラスター内のどのノードに対しても、公開ポートを通じてサービスにアクセスすることができます。 この場合のノードは、サービスに対するタスクをその時点で実行しているかどうかには関係がありません。 Swarm 内のノードはすべて、実行中のタスクインスタンスに向けて Ingress による接続を行います。

Swarm モードには内部 DNS コンポーネントがあり、Swarm 内の各サービスに対して自動的に DNS エントリーを割り当てます。 Swarm マネージャーは 内部負荷分散 を利用して、サービスの DNS 名に基づき、クラスター内のサービス間でのリクエストを分散します。

次にすることは

docker, container, cluster, swarm mode