Docker: Docker Swarm

最終更新:2026-08-26

単一の Docker インスタンスではトラフィックを捌ききれない——そんなとき Swarm なら 1 台から 3 台へスケールし、ゼロダウンタイムで新バージョンをデプロイできます。

1. 学べること



2. EC 運用者のストーリー

(1) 悩み: 1 台ではトラフィックを捌けない

Charlie の EC サイトのトラフィックが急増し、単一の Docker インスタンスでは処理しきれません——ピーク時には CPU 使用率が 100% に達し、API レスポンスがタイムアウトし、ユーザーからの苦情が殺到しました。複数サーバーへスケールする必要がありますが、3 台のサーバーに手動でコンテナを起動するのは複雑すぎます。

(2) Docker Swarm クラスターによるソリューション

Charlie は 3 ノードの Swarm クラスターを初期化し、API を 5 レプリカにスケールし、ローリングアップデートでゼロダウンタイムの新バージョンデプロイを実現しました。

BASH
# Swarm クラスターを初期化
docker swarm init --advertise-addr 10.0.0.1

# 5 レプリカでサービスをデプロイ
docker service create --replicas 5 --name api -p 8080:80 myapp:v2

# v3 へローリングアップデート
docker service update --image myapp:v3 api

(3) 効果: 単一マシンからクラスターへ、わずか 5 分

3 台のサーバーがクラスターとして結合され、API は 5 レプリカへ自動分散、ゼロダウンタイムでローリングアップデートが実行されました。単一サーバーからクラスターへの移行はわずか 5 分で完了しました。



3. Swarm のアーキテクチャ

(1) ノードロール

100%
graph TB
    MGR1["マネージャーノード 1<br/>リーダー"] --- MGR2["マネージャーノード 2<br/>スタンバイ"]
    MGR1 --- MGR3["マネージャーノード 3<br/>スタンバイ"]
    MGR1 --> WRK1["ワーカーノード 1"]
    MGR2 --> WRK2["ワーカーノード 2"]
    MGR3 --> WRK3["ワーカーノード 3"]
ロール 役割 台数 コンテナ実行
マネージャー クラスター管理、スケジューリング、API 奇数(3 / 5 / 7) ✅ 任意
ワーカー タスク実行、コンテナ実行 任意 ✅ 必須

(2) サービス vs コンテナ

比較項目 コンテナ サービス
作成方法 docker run docker service create
レプリカ数 1 レプリカ数を指定可能
セルフヒーリング 再起動ポリシーが別途必要 ✅ レプリカ数を自動維持
負荷分散 なし ✅ ルーティングメッシュ
ローリングアップデート 手動 ✅ 組み込み
ユースケース 単一マシン開発 クラスター本番


4. Swarm の初期化

▶ サンプル: swarm init で初期化 (難易度: ⭐⭐)

BASH
# マネージャーノードで: Swarm を初期化
docker swarm init --advertise-addr 10.0.0.1

# 出力にワーカー参加用トークンが含まれる
# docker swarm join --token SWMTKN-xxx 10.0.0.1:2377
BASH
# ワーカーノードで: Swarm に参加
docker swarm join --token SWMTKN-xxx 10.0.0.1:2377

# 全ノードを一覧表示
docker node ls
💻 出力:

TEXT 📖 参照専用
ID            HOSTNAME   STATUS   AVAILABILITY   MANAGER STATUS
abc123 *      manager1   Ready    Active         Leader
def456        worker1    Ready    Active
ghi789        worker2    Ready    Active


5. サービスの管理

▶ サンプル: service create でデプロイ (難易度: ⭐⭐)

BASH
# 3 レプリカのサービスを作成
docker service create \
  --name web \
  --replicas 3 \
  --publish 80:80 \
  nginx:1.25-alpine

# サービスを一覧表示
docker service ls

# サービスのタスク(コンテナ)を確認
docker service ps web

▶ サンプル: サービスのスケール (難易度: ⭐⭐)

BASH
# 5 レプリカにスケール
docker service scale web=5

# 確認
docker service ps web

▶ サンプル: service update でローリングアップデート (難易度: ⭐⭐⭐)

BASH
# ローリングアップデート: 一度に 2 コンテナずつ、30 秒間隔で更新
docker service update \
  --image nginx:1.26-alpine \
  --update-parallelism 2 \
  --update-delay 30s \
  --update-failure-action rollback \
  web

# アップデートの状態を確認
docker service inspect web --format='{{.UpdateStatus.State}}'

(1) ローリングアップデート戦略

パラメーター デフォルト 説明
--update-parallelism 1 一度にいくつのタスクを更新するか
--update-delay 0s バッチ間の待機時間
--update-failure-action pause 失敗時の動作(pause / rollback / continue)
--update-monitor 5s アップデート後の監視時間

▶ サンプル: サービスのロールバック (難易度: ⭐⭐)

BASH
# 前バージョンへロールバック
docker service rollback web


6. シークレットと設定管理

▶ サンプル: Docker Secret の作成と利用 (難易度: ⭐⭐⭐)

BASH
# ファイルからシークレットを作成
echo "my_super_secret_password" | docker secret create db_password -

# サービスで利用
docker service create \
  --name api \
  --secret db_password \
  -e DB_PASSWORD_FILE=/run/secrets/db_password \
  myapp:1.0
🔒 セキュリティ: シークレットはマネージャーノードの Raft ログに(暗号化されて)保存され、サービスを実行中のワーカーにのみ送信されます。コンテナ内では /run/secrets/<name> ファイル経由でアクセスし、環境変数には露出しません。**



7. ルーティングメッシュ

(1) ネットワークルーティングの仕組み

Swarm のルーティングメッシュにより、任意のノードの任意のポートが、そのサービスの任意の(現在ノードにいなくても)レプリカへルーティングできます。

100%
graph LR
    A["ノード 1<br/>:80"] -->|"リクエスト"| B["ルーティングメッシュ"]
    C["ノード 2<br/>:80"] --> B
    B -->|"ラウンドロビン"| D["レプリカ 1<br/>ノード 1"]
    B --> E["レプリカ 2<br/>ノード 2"]
    B --> F["レプリカ 3<br/>ノード 3"]
パターン 構文 説明
VIP(デフォルト) --publish 80:80 仮想 IP + 負荷分散
DNSRR --endpoint-mode dnsrr DNS ラウンドロビン、VIP なし


8. Swarm と Compose の比較

比較項目 Docker Compose Docker Swarm
ノード数 単一ノード マルチノードクラスター
高可用性 ✅ マネージャー冗長化
サービスセルフヒーリング 再起動ポリシー ✅ レプリカ数を維持
ローリングアップデート 手動 ✅ 組み込み
負荷分散 Nginx / DNS ラウンドロビン ✅ ルーティングメッシュ
シークレット 環境変数 ✅ 暗号化保存
デプロイ方法 docker compose up docker stack deploy

▶ サンプル: stack deploy で Compose ファイルを Swarm へデプロイ (難易度: ⭐⭐⭐)

BASH
# Compose ファイルをスタックとしてデプロイ
docker stack deploy -c docker-compose.yml mystack

# スタック一覧
docker stack ls

# スタック内のサービス一覧
docker stack services mystack

# スタックを削除
docker stack rm mystack


9. 完全なサンプル: 3 ノードクラスターのデプロイ

BASH
# ============================================
# 完全なウォークスルー: 3 ノード Swarm クラスター
# 内容: init、join、service、scale、update
# ============================================

# --- マネージャー (10.0.0.1) にて ---
# 1. Swarm を初期化
docker swarm init --advertise-addr 10.0.0.1

# 2. ワーカー参加トークンを取得
docker swarm join-token worker

# --- ワーカー (10.0.0.2、10.0.0.3) にて ---
# 3. Swarm に参加(ステップ 2 のトークンを貼る)
docker swarm join --token SWMTKN-xxx 10.0.0.1:2377

# --- マネージャーにて ---
# 4. クラスターを確認
docker node ls

# 5. web サービスを 5 レプリカでデプロイ
docker service create \
  --name web \
  --replicas 5 \
  --publish 80:80 \
  --restart-condition on-failure \
  nginx:1.25-alpine

# 6. ノード間の分散を確認
docker service ps web

# 7. v1.26 へローリングアップデート
docker service update \
  --image nginx:1.26-alpine \
  --update-parallelism 2 \
  --update-delay 30s \
  web

# 8. ノード障害をシミュレート
docker node update --availability drain worker1
docker service ps web  # レプリカが再スケジュールされる

# 9. ノードを復旧
docker node update --availability active worker1

# 10. スケールダウン
docker service scale web=2

# 11. クリーンアップ
docker service rm web
docker swarm leave --force  # マネージャーにて


❓ よくある質問

Q Swarm に必要な最小サーバー台数は?
A 開発・テスト用途なら 1 台でも動作します。本番環境では 3 台以上のマネージャー(奇数、Raft 合意は多数決を必要とするため)+ N 台のワーカーを推奨します。マネージャーは最低 1 台必須ですが、1 台ではそのマネージャーが落ちた時点でクラスターが管理不能になります。
Q Swarm のデータはどこに保存されますか?
A マネージャーノードの Raft ログ(/var/lib/docker/swarm/)に保存されます。ここにはクラスターの状態、サービス定義、シークレットなどが含まれます。マネージャーノードが故障した場合、他のマネージャーノードが Raft プロトコルで新リーダーを選出します。Raft ログの定期バックアップを推奨します。
Q ルーティングメッシュはどのように負荷分散しますか?
A Swarm の VIP(Virtual IP)モード: 各サービスに仮想 IP が割り当てられます。リクエストが VIP に到達すると、カーネルの IPVS 負荷分散が各レプリカへ分散します。すべてのノードが公開ポートをリッスンするため、任意ノード宛のリクエストを任意ノードのレプリカへルーティングできます。
Q Swarm の TLS を設定するには?
A Swarm には mTLS(相互 TLS)が組み込まれており、ノード間の通信を自動的に暗号化します。証明書は初期化時に自動生成されるため手動設定は不要です。マネージャー間、マネージャーとワーカー間の通信はすべて暗号化されます。
Q Compose から Swarm への移行で必要な変更は?
A ほとんどの docker-compose.yml はそのまま docker stack deploy で使えます。重要な注意点: ① buildimage に置き換える(Swarm は build 非対応); ② volumes は名前付きボリュームと NFS のみサポート; ③ depends_onstarted のみ対応(service_healthy は未対応); ④ deploy ブロックを追加して replicasupdate 戦略を設定する。

📖 まとめ


📝 練習問題

  1. 基本練習 (難易度 ⭐): 単一マシンで Swarm を初期化し、Nginx サービスを 3 レプリカで作成、docker service ps でレプリカの分散を確認してください。
  2. 応用練習 (難易度 ⭐⭐): ローリングアップデート(nginx: 1.25 → 1.26)を実施し、docker service ps でアップデートの過程を観察してください。
  3. 挑戦 (難易度: ⭐⭐⭐): 3 台の仮想マシンで Swarm クラスターを構築し、API サービスを 5 レプリカでデプロイ、ワーカーノードの障害をシミュレートして、レプリカが他ノードへ自動移行することを確認してください。
Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%