記事概要
コンテナ技術の代名詞とも言える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-managerとnode-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
実行結果例:
| ID | HOSTNAME | STATUS | AVAILABILITY | MANAGER STATUS |
| XXXXXXXX | node-manager | Ready | Active | Leader |
| YYYYYYYY | node-worker | Ready | Active |
node-managerがLeaderとして、node-workerがReadyとして表示されていれば成功です。
ステップ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といった概念でコンテナを管理します。
コメントを残す