⑥Docker・コンテナ

Docker Swarmでクラスタリングする【複数サーバーでコンテナを管理】

⑥Docker・コンテナ
記事内に広告が含まれています。

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 initSwarmを初期化(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 deployComposeファイルからスタックをデプロイ
docker stack rm <name>スタックを削除

Docker SwarmとKubernetesの比較

比較項目Docker SwarmKubernetes
学習コスト低い高い
セットアップ簡単(Docker標準)複雑
スケーラビリティ中規模まで大規模対応
機能の豊富さシンプル非常に豊富
コミュニティ小さめ非常に大きい
向いている規模小〜中規模中〜大規模

まとめ

  • Docker Swarmは複数サーバーのコンテナを一元管理するオーケストレーションツール
  • Docker標準機能なので追加インストール不要で手軽に始められる
  • ManagerノードとWorkerノードに役割を分けてクラスターを構成する
  • スケーリング・ローリングアップデート・障害時の自動復旧が可能
  • 小〜中規模の本番環境にはDocker Swarmが手軽でおすすめ

コメント

タイトルとURLをコピーしました