概要
Swarmの概要
Docker Swarmは、複数のDockerホストで構成されるクラスタを管理するモードです。これらのホストには、管理者(manager)と作業者(worker)の役割があります。各ホストは単独で管理者としても動作できますし、作業者としても動作可能です。サービスを作成する際には、リプリカ数、ネットワーク設定、ストレージ、外部に公開するポートなどの状態を定義します。Dockerはこの状態を維持し、あるノードが利用不能になった場合、そのタスクを他のノードに再スケジュールします。
ノードの説明
ノードとは、Swarmクラスタに参加するDockerインスタンスのことです。アプリケーションをSwarmにデプロイする際には、管理ノードにサービス定義を送信し、管理ノードは対応するタスクを作業ノードに分配します。作業ノードは管理ノードから受け取ったタスクを実行し、定期的にその状態を管理ノードに報告します。これにより、管理ノードは各作業ノードが必要な状態を維持できるようになります。
サービスとタスク
サービスは、各ノード上で実行されるタスクの定義です。これはSwarmシステムの中核的な構造であり、ユーザーがSwarmと相互作用する主な方法でもあります。サービスを作成する際には、通常、コンテナイメージやその内部で実行されるコマンドを指定します。タスクは、特定のDockerコンテナとその内部で実行されるコマンドを含む最小単位であり、管理ノードによってリプリカ数に基づいて作業ノードに分配されます。
負荷分散
管理ノードはingress load balancingを使用してサービスを外部に公開し、外部からのアクセスを可能にします。ユーザーがポートを指定しない場合、Swarmマネージャーは30000-32767の範囲で自動的にPublishedPortを割り当てます。また、Swarmモードには自動的にDNSエントリを生成する内部DNS機能があり、サービス間のリクエストを内部ロードバランシングで配分します。
Swarmクラスタの構築
以下の手順でSwarmクラスタを構築できます。
- Swarmの初期化
$ docker swarm init
Swarm initialized: current node (abc123xyz) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-abcdef123456 192.168.1.100:2377
- ノードの追加
# docker swarm join --token SWMTKN-1-abcdef123456 192.168.1.100:2377
This node joined a swarm as a worker.
- 作業者ノードを管理者に昇格
$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
abc123xyz * host1 Ready Active Leader 20.10.0
def456uvw host2 Ready Active 20.10.0
$ docker node promote def456uvw
Node def456uvw promoted to a manager in the swarm.
よく使用されるコマンド
- swarm init - クラスタの初期化
- swarm join - ノードの追加
- service create - 新しいサービスの作成
# docker service create --name myapp nginx:latest
# docker service create --name myapp2 --replicas=2 nginx:latest
- service inspect - サービスの詳細確認
# docker service inspect myapp --pretty
- service ls - 全てのサービスの一覧表示
# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
x1y2z3 myapp replicated 1/1 nginx:latest
a1b2c3 myapp2 replicated 2/2 nginx:latest
- service rm - サービスの削除
# docker service rm myapp
- service scale - サービスのスケール変更
# docker service scale myapp=3
- service ps - サービスのタスク一覧
# docker service ps myapp
- service update - サービスの更新
# docker service update --limit-cpu 2 myapp
# docker service update --publish-add published=8080,target=80 myapp