Dockerオーケストレーション入門:Swarm Modeを使ったコンテナ管理の基本

記事概要

コンテナ技術の代名詞とも言えるDockerは、アプリケーション開発・デプロイの現場で不可欠なツールとなっています。しかし、本番環境で複数のサービスを安定して運用するには、単一のコンテナを動かすだけでは不十分です。そこで必要になるのが、多数のコンテナを効率的かつ堅牢に管理する「Dockerオーケストレーション」です。

この記事では、Dockerに標準で搭載されているオーケストレーションツール「Docker Swarm Mode」に焦点を当て、その基本的な概念から、実際に動かしてみるハンズオンまでを分かりやすく解説します。


Dockerオーケストレーションとは?

オーケストレーション(Orchestration)とは、「調整・統合」を意味します。ITの文脈では、多数のコンポーネント(ここではDockerコンテナ)のデプロイ、管理、スケーリング、ネットワーク設定などを自動化する仕組みを指します。

なぜオーケストレーションが必要なのか?

  • 可用性(High Availability): 1つのコンテナやノード(サーバー)が停止しても、自動的に別の場所でコンテナを再起動し、サービスを継続します。
  • スケーラビリティ(Scalability): トラフィックの増加に応じて、コンテナの数を簡単に増やし(スケールアウト)、負荷分散を行います。
  • 管理の容易さ: 多数のコンテナを、手動ではなく宣言的な設定ファイル(例: YAML)に基づいて一元管理できます。

代表的なオーケストレーションツールには、Kubernetes(クーバネティス)と、本記事で扱うDocker Swarm Modeがあります。


Docker Swarm Modeの基本

Docker Swarm Modeは、複数のDockerホストを連携させ、あたかも**一つの仮想的な環境(Swarm)**として動作させるための機能です。

主要なコンポーネント

コンポーネント役割
Node (ノード)Swarmに参加する物理または仮想サーバー。
Manager Node (マネージャーノード)Swarm全体の管理・制御を行います。クラスタの状態を保持し、タスクの割り当てを決定します。
Worker Node (ワーカーノード)Managerから割り当てられたコンテナ(タスク)を実行します。
Service (サービス)Swarm内で実行したいアプリケーションの定義。使用するDockerイメージ、起動するレプリカ数(コンテナ数)、ポートなどを指定します。
Task (タスク)Serviceの定義に基づいて、Worker Node上で実行される単一のコンテナインスタンス。

動作の仕組み

Manager Nodeがサービス定義を受け取ると、それを実現するためのTaskを生成し、最適なWorker Nodeに割り当てて実行させます。これにより、ユーザーはノードごとのコンテナ管理を意識することなく、サービス単位でアプリケーションのライフサイクルを管理できます。


ハンズオン:Swarm ModeでWebサービスをデプロイ

ここでは、実際に2つのノード(1つのManagerと1つのWorker)からなるSwarmクラスタを構築し、シンプルなWebサービスをデプロイする手順を体験します。

前提条件:

  • DockerがインストールされたLinuxまたはmacOS環境が2台以上(今回は仮想環境やクラウドのVMを推奨します)。
  • すべてのノード間でTCPポート 2377 (クラスタ管理)、7946 (通信)、4789 (オーバーレイネットワーク) が開いていること。
  • 本ハンズオンでは、**node-managernode-worker**という2台のノードを使用します。

ステップ1:Swarmクラスタの初期化 (node-manager)

node-managerとなるノードで、以下のコマンドを実行しSwarmを初期化します。

Bash

docker swarm init --advertise-addr <ManagerノードのIPアドレス>

実行結果例:

Swarm initialized: current node (XXXXXXXX) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token <TOKEN> <ManagerノードのIPアドレス>:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

このとき表示されたdocker swarm joinコマンド(トークンを含む)をメモしておきます。これが、他のノードをWorkerとして追加するためのコマンドです。

ステップ2:Workerノードの参加 (node-worker)

node-workerとなるノードで、ステップ1でメモしたdocker swarm joinコマンドを実行します。

Bash

# <TOKEN>と<ManagerノードのIPアドレス>を置き換えて実行
docker swarm join --token <TOKEN> <ManagerノードのIPアドレス>:2377

実行結果例:

This node joined a swarm as a worker.

ステップ3:ノードの状態確認 (node-manager)

node-managerに戻り、クラスタの状態を確認します。

Bash

docker node ls

実行結果例:

IDHOSTNAMESTATUSAVAILABILITYMANAGER STATUS
XXXXXXXXnode-managerReadyActiveLeader
YYYYYYYYnode-workerReadyActive

node-managerLeaderとして、node-workerReadyとして表示されていれば成功です。

ステップ4:サービスのデプロイ (node-manager)

NginxのWebサーバーサービスをデプロイします。ここでは、レプリカ数(コンテナ数)を3に設定し、外部ポート8080に公開します。

Bash

docker service create \
  --name my-web-app \
  --replicas 3 \
  --publish published=8080,target=80 \
  nginx:latest
  • --name: サービス名
  • --replicas 3: 3つのコンテナ(タスク)を動作させることを宣言
  • --publish: 外部ポート8080を、コンテナのポート80にマッピング

ステップ5:サービスの確認 (node-manager)

サービスが正常にデプロイされ、タスクがノードに分散されていることを確認します。

Bash

docker service ps my-web-app

実行結果例:

ID             NAME          IMAGE         NODE            DESIRED STATE   CURRENT STATE           ERROR  PORTS
zzzzzzzz       my-web-app.1  nginx:latest  node-worker     Running         Running 6 seconds ago
aaaaaaaa       my-web-app.2  nginx:latest  node-manager    Running         Running 7 seconds ago
bbbbbbbb       my-web-app.3  nginx:latest  node-worker     Running         Running 7 seconds ago

3つのタスクが、ManagerとWorkerノードに自動的に分散配置されていることが確認できます。

ステップ6:動作の確認

ManagerノードまたはWorkerノードのどちらかのIPアドレスに対し、ポート8080でアクセスします(例: http://<ノードのIPアドレス>:8080)。

いずれのノードにアクセスしても、負荷分散機能(ルーティングメッシュ)により、デプロイしたNginxコンテナにリクエストが転送され、Nginxのデフォルトページが表示されます。


まとめ

本記事では、Docker Swarm Modeの基本的な仕組みと、簡単なWebサービスをデプロイする手順をご紹介しました。

  • Dockerオーケストレーションは、コンテナの高可用性スケーラビリティを確保するために不可欠です。
  • Docker Swarm Modeは、Dockerに標準搭載されており、比較的簡単にクラスタを構築できます。
  • Swarmでは、Manager/Workerノード、Service、Taskといった概念でコンテナを管理します。

投稿日

カテゴリー:

投稿者:

タグ:

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です