はじめに
この実験では、docker swarm leave
コマンドを使用して Docker Swarm 内のノードを管理する方法を学びます。まず、Docker Swarm を初期化し、ワーカーノードをそれに参加させます。その後、ワーカーノードを Swarm から削除する練習を行います。最後に、強制オプションの使用の必要性を含む、マネージャーノードを削除するプロセスを調査します。
💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください
この実験では、docker swarm leave
コマンドを使用して Docker Swarm 内のノードを管理する方法を学びます。まず、Docker Swarm を初期化し、ワーカーノードをそれに参加させます。その後、ワーカーノードを Swarm から削除する練習を行います。最後に、強制オプションの使用の必要性を含む、マネージャーノードを削除するプロセスを調査します。
このステップでは、Docker Swarm を初期化する方法を学びます。Docker Swarm は、Swarm モードで実行されている Docker ホストのクラスターです。Swarm モードを使用すると、Docker ノードのクラスターを単一の仮想システムとして管理することができます。
Swarm を初期化する前に、LabEx VM にインストールされている現在の Docker バージョンを確認しましょう。
docker version
以下のような出力が表示され、Docker バージョンが 20.10.21 であることが示されます。
Client: Docker Engine - Community
Version: 20.10.21
API version: 1.41
Go version: go1.18.9
Git commit: baedd2a
Built: Tue Oct 25 17:58:10 2022
OS/Arch: linux/amd64
Context: default
Experimental: true
Server: Docker Engine - Community
Engine:
Version: 20.10.21
API version: 1.41 (minimum version 1.12)
Go version: go1.18.9
Git commit: 305620d
Built: Tue Oct 25 17:56:51 2022
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.10
GitCommit: b4bd567ea6c98e7b5d78a23676a0a79559d930d5
runc:
Version: 1.1.4
GitCommit: v1.1.4-0-g5fd4c4d
docker-init:
Version: 0.19.0
GitCommit: de40ad0
Docker Swarm を初期化するには、docker swarm init
コマンドを使用します。このコマンドは、現在の Docker ホストを Swarm マネージャーに変換します。
docker swarm init
コマンドを実行した後、Swarm が初期化されたことを示す出力が表示され、他のノードをワーカーとして参加させるためのコマンドが提供されます。出力は次のようになります。
Swarm initialized: current node (xxxxxxxxxxxx) is now a manager.
To add a worker to this swarm, run the following command on the worker node:
docker swarm join --token SWMTKN-1-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 172.17.0.2:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
出力には、現在のノードが Swarm マネージャーになったことが示されています。また、この Swarm にワーカーノードを参加させるためのコマンドも提供されています。このコマンドは次のステップで使用します。
docker info
コマンドを使用して、Swarm の状態を確認することができます。
docker info
出力の "Swarm" セクションを探します。Swarm が "active" であることが示されているはずです。
...
Swarm: active
NodeID: xxxxxxxxxxxx
Is Manager: true
ClusterID: xxxxxxxxxxxx
Managers: 1
Nodes: 1
Orchestration:
TaskHistoryRetentionLimit: 5
Raft:
HeartbeatInterval: 100ms
ElectionTimeout: 3s
SnapshotInterval: 500ms
Dispatcher:
HeartbeatPeriod: 5s
CA configuration:
Expiry duration: 3 months
Force rotate at: 7 weeks
Root Rotation: false
Local Node State: active
Error: none
Remote Manager:
ID: xxxxxxxxxxxx
Addr: 172.17.0.2:2377
Addr: 172.17.0.2:2377
Node Address: 172.17.0.2
Manager Status:
Cluster Address: 172.17.0.2:2377
Leader: Yes
Reachability: Reachable
...
これにより、このノードで Docker Swarm が正常に初期化されたことが確認されます。
前のステップでは、Docker Swarm を初期化し、出力にはワーカーノードを参加させるためのコマンドが表示されました。実際のシナリオでは、このコマンドを、Swarm にワーカーとして追加したい別のマシンで実行します。ただし、ここでは単一の LabEx VM を使用しているため、同じマシンで参加コマンドを実行することでワーカーノードの参加をシミュレートします。
まず、ワーカーノードの参加コマンドを取得しましょう。マネージャーノード(現在の VM)で docker swarm join-token worker
を実行することで、参加トークンとコマンドを取得できます。
docker swarm join-token worker
出力は次のようになります。
To add a worker to this swarm, run the following command on the worker node:
docker swarm join --token SWMTKN-1-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 172.17.0.2:2377
出力から docker swarm join --token ...
の完全なコマンドをコピーします。このコマンドには、一意のトークンと Swarm マネージャーの IP アドレスとポートが含まれています。
次に、コピーしたコマンドを実行して、現在のノードをワーカーとして Swarm に参加させます。
docker swarm join --token SWMTKN-1-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 172.17.0.2:2377
トークンと IP アドレスを、docker swarm join-token worker
コマンドから取得した値に置き換えます。
ノードがワーカーとして Swarm に参加したことを示す出力が表示されるはずです。
This node joined a swarm as a worker.
ノードが Swarm に参加したことを確認するには、マネージャーの視点から Swarm 内のノードを一覧表示できます。単一の VM がマネージャーとワーカーの両方の役割を果たしているため、docker node ls
コマンドを使用できます。
docker node ls
出力には Swarm 内のノードが表示されます。同じノード ID に対して 2 つのエントリが表示され、1 つはステータスが "Ready" でロールが "Manager"、もう 1 つはステータスが "Ready" でロールが "Worker" となっているはずです。
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
xxxxxxxxxxxx * labex-vm Ready Active Leader 20.10.21
xxxxxxxxxxxx labex-vm Ready Active 20.10.21
これにより、ノードがワーカーとして Swarm に正常に参加したことが確認されます。
前のステップでは、ノードをワーカーとして Swarm に正常に参加させました。今回は、ノードを Swarm から削除する方法を学びます。ワーカーノードから Swarm を脱退するには、docker swarm leave
コマンドを使用します。
現在のノードをワーカーとして Swarm から脱退させるには、次のコマンドを実行します。
docker swarm leave
ノードが Swarm を脱退したことを示す出力が表示されるはずです。
Node left the swarm.
次に、ノードが Swarm を脱退したことを確認しましょう。再び docker node ls
コマンドを使用できます。ただし、ノードが Swarm を脱退しているため、このノードで docker node ls
を実行するとエラーが発生します。なぜなら、このノードはもはや Swarm の一部ではないからです。
docker node ls
次のようなエラーメッセージが表示されます。
Error: This node is not a swarm manager. Use "docker swarm join" to join the swarm and try again.
このエラーにより、ノードがもはや Swarm の一部ではないことが確認されます。
さらに確認するために、docker info
を使用して Swarm の状態を確認しましょう。
docker info
出力の "Swarm" セクションには、Swarm が "inactive" であることが示されているはずです。
...
Swarm: inactive
...
これにより、ノードが Docker Swarm を正常に脱退したことが確認されます。
前のステップでは、ワーカーノードを Swarm から正常に削除しました。今回は、追加オプションを使用せずに同じ docker swarm leave
コマンドを使ってマネージャーノードを Swarm から削除しようとした場合に何が起こるかを見てみましょう。
マネージャーノードから Swarm を脱退しようとするには、次のコマンドを実行します。
docker swarm leave
次のようなエラーメッセージが表示されます。
Error response from daemon: You are attempting to leave the swarm on a node that is participating as a manager. Use the --force flag to force the node to leave the swarm. Note that this may disrupt the swarm, so use this option with caution.
このエラーメッセージは、明示的に強制しない限り、マネージャーノードから単純に Swarm を脱退することはできないことを示しています。これは、特にマルチマネージャー構成において、Swarm の意図しない混乱を防ぐための安全機構です。
ノードがまだマネージャーであり、Swarm の一部であることを確認するには、docker info
コマンドを使用できます。
docker info
"Swarm" セクションには、依然として "active" と "Is Manager: true" が表示されるはずです。
...
Swarm: active
NodeID: xxxxxxxxxxxx
Is Manager: true
...
これにより、強制フラグを使用せずに Swarm を脱退しようとした試みは失敗し、ノードは依然として Swarm マネージャーであることが確認されます。
前のステップでは、--force
フラグを使用せずにマネージャーノードが Swarm を脱退できないことを学びました。これは、Swarm の意図しない混乱を防ぐためです。今回は、--force
フラグを使用してマネージャーノードを Swarm から脱退させます。
重要な注意: マネージャーノードを強制的に Swarm から脱退させると、特に最後のマネージャーである場合、Swarm が混乱する可能性があります。本番環境ではこのコマンドを慎重に使用してください。
マネージャーノードを強制的に Swarm から脱退させるには、次のコマンドを実行します。
docker swarm leave --force
ノードが Swarm を脱退したことを示す出力が表示されるはずです。
Node left the swarm.
次に、ノードが正常に Swarm を脱退したことを確認しましょう。docker info
コマンドを使用できます。
docker info
出力の "Swarm" セクションには、Swarm が "inactive" であることが示されているはずです。
...
Swarm: inactive
...
これにより、--force
フラグを使用してマネージャーノードが Docker Swarm を正常に脱退したことが確認されます。このノードでは Swarm はもう存在しません。
この実験では、docker swarm init
コマンドを使用して Docker Swarm を初期化する方法を学びました。このコマンドは、現在のノードをマネージャーとして指定し、他のノードが参加するためのコマンドを提供します。その後、新しく作成された Swarm にワーカーノードを参加させる練習を行いました。
続いて、docker swarm leave
コマンドを使用してノードを Swarm から削除する方法を調べました。まずはワーカーノードが Swarm を脱退する方法を示しました。次に、強制オプションを使用せずに同じコマンドをマネージャーノードで試してみましたが、デフォルトでは許可されないことがわかりました。最後に、--force
フラグを使用してマネージャーノードを強制的に Swarm から脱退させることに成功しました。