Docker Swarmは、複数のDockerホスト(サーバー)をひとつのクラスターとして管理するためのコンテナオーケストレーションツールです。Dockerに標準で組み込まれており、追加インストールなしで使えるのが大きな特徴です。この記事ではDocker Swarmの基本概念から実際のクラスター構築・運用方法まで詳しく解説します。
Docker Swarmとは?
Docker Swarmは複数台のサーバーをまとめて「クラスター」として扱い、コンテナを自動的に分散配置・スケーリング・障害復旧してくれる仕組みです。
Docker Swarmの主なメリット
- 高可用性:1台のサーバーが落ちても他のサーバーでコンテナを自動的に再起動
- スケーリング:コマンド一発でコンテナの数を増減できる
- ロードバランシング:トラフィックを複数のコンテナに自動分散
- ローリングアップデート:サービスを止めずにコンテナを順番に更新
- Docker標準:追加インストール不要、docker-compose.ymlをそのまま流用できる
Swarmの構成要素
ManagerノードとWorkerノード
| 役割 | 説明 |
|---|---|
| Managerノード | クラスター全体の管理・スケジューリングを担当。Workerへの指示を出す |
| Workerノード | Managerの指示に従ってコンテナ(タスク)を実際に実行する |
Managerは奇数台(1、3、5台)構成が推奨されます。3台のManagerで1台が故障しても動き続けます(過半数が必要なため)。
サービスとタスク
| 用語 | 説明 |
|---|---|
| サービス | 「このコンテナを3台動かす」という定義。Swarmの管理単位 |
| タスク | サービスが各ノードで実際に起動したコンテナのインスタンス |
| スタック | 複数のサービスをまとめたもの。docker-compose.ymlで定義 |
Docker Swarmのセットアップ
前提条件
- Docker Engineがインストールされた複数台のサーバー
- 各サーバー間でネットワーク通信が可能
- 必要なポートが開放されている(2377/tcp、7946/tcp・udp、4789/udp)
Step 1:Swarmを初期化する(Managerノード)
# ManagerノードでSwarmを初期化
docker swarm init --advertise-addr
# 実行例
docker swarm init --advertise-addr 192.168.1.10
# 実行後にWorker参加用のトークンが表示される(メモしておく)
# docker swarm join --token SWMTKN-1-xxxxx 192.168.1.10:2377
Step 2:WorkerノードをSwarmに参加させる
# 各WorkerサーバーでManagerから取得したコマンドを実行
docker swarm join --token SWMTKN-1-xxxxx 192.168.1.10:2377
# ManagerノードでWorkerの参加トークンを再確認する場合
docker swarm join-token worker
Step 3:ノードの状態を確認する
# ManagerノードでSwarmのノード一覧を確認
docker node ls
# 出力例
# ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS
# abc123 * manager1 Ready Active Leader
# def456 worker1 Ready Active
# ghi789 worker2 Ready Active
サービスの作成とスケーリング
サービスを作成する
# Nginxを3台のレプリカで起動
docker service create --name my-nginx --replicas 3 --publish 80:80 nginx:latest
# サービスの状態確認
docker service ls
# タスク(コンテナ)の分散状況を確認
docker service ps my-nginx
スケーリング(レプリカ数を変更する)
# レプリカ数を5台に増やす
docker service scale my-nginx=5
# または update コマンドで変更
docker service update --replicas 5 my-nginx
# スケールダウン(2台に減らす)
docker service scale my-nginx=2
ローリングアップデート
# サービスのイメージを更新(順番に入れ替え)
docker service update --image nginx:1.25 --update-parallelism 1 --update-delay 10s my-nginx
# --update-parallelism:同時に更新するタスク数
# --update-delay:各タスク更新後の待機時間
Docker Stackでアプリをデプロイする
docker-compose.yml形式のファイルを使って複数サービスをまとめてデプロイできます。
# docker-stack.yml の例
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "80:80"
deploy:
replicas: 3
update_config:
parallelism: 1
delay: 10s
restart_policy:
condition: on-failure
db:
image: postgres:15
environment:
POSTGRES_PASSWORD: secret
deploy:
replicas: 1
placement:
constraints:
- node.role == manager
# スタックをデプロイ
docker stack deploy -c docker-stack.yml myapp
# スタックのサービス一覧
docker stack services myapp
# スタックを削除
docker stack rm myapp
よく使うDocker Swarmコマンド一覧
| コマンド | 説明 |
|---|---|
docker swarm init | Swarmを初期化(Managerになる) |
docker swarm join | 既存のSwarmに参加 |
docker node ls | ノード一覧を表示 |
docker service create | 新しいサービスを作成 |
docker service ls | サービス一覧を表示 |
docker service ps <name> | サービスのタスク一覧を表示 |
docker service scale <name>=N | レプリカ数を変更 |
docker service update | サービスを更新(ローリングアップデート) |
docker service rm <name> | サービスを削除 |
docker stack deploy | Composeファイルからスタックをデプロイ |
docker stack rm <name> | スタックを削除 |
Docker SwarmとKubernetesの比較
| 比較項目 | Docker Swarm | Kubernetes |
|---|---|---|
| 学習コスト | 低い | 高い |
| セットアップ | 簡単(Docker標準) | 複雑 |
| スケーラビリティ | 中規模まで | 大規模対応 |
| 機能の豊富さ | シンプル | 非常に豊富 |
| コミュニティ | 小さめ | 非常に大きい |
| 向いている規模 | 小〜中規模 | 中〜大規模 |
まとめ
- Docker Swarmは複数サーバーのコンテナを一元管理するオーケストレーションツール
- Docker標準機能なので追加インストール不要で手軽に始められる
- ManagerノードとWorkerノードに役割を分けてクラスターを構成する
- スケーリング・ローリングアップデート・障害時の自動復旧が可能
- 小〜中規模の本番環境にはDocker Swarmが手軽でおすすめ



コメント