Docker Swarmのすべてと、クラスター内のすべてのコンテナーを管理およびオーケストレーションする方法.
Docker Swarmとは?
Docker swarmは、Dockerエンジンのクラスターを処理するモードであるため、Swarmという名前です。 Dockerホストのクラスターは、マネージャーとワーカーで構成されるスウォームモードで実行されます。スウォームに参加するdocker-engineインスタンスはノードと呼ばれます.
本番レベルのswarmデプロイメントは、複数のサーバーに分散するDockerノードで構成されます.
なぜそれを使うのですか? –コンテナオーケストレーション
本番環境で作業している場合、数百のDockerコンテナが複数のアプリケーションを実行します。これらすべてのコンテナーを管理することは、すべてのDevOpsエンジニアにとって大きな苦痛になる可能性があります。 Docker Swarmが役立ちます。複数のDockerコンテナーを実行するクラスターを簡単に管理および調整します.
以下はその機能の一部です。
- 高可用性– ダウンタイムや停止を提供しないことを目的としています.
- 負荷分散– いずれかのノードに障害が発生した場合、クラスター内の他のノードにリソースと要求を自動的に割り当てます.
- 分散型– 複数のマネージャーノードが運用環境で実行されます。したがって、クラスターが単一のマネージャーノードに依存することはありません.
- スケーラビリティ– 単一のdocker swarmコマンドを使用して、クラスター内のコンテナーを簡単にスケールアップまたはスケールダウンできます.
Dockerコンテナーのオーケストレーション
Docker Swarmの基本を理解したところで、実装の例を見てみましょう.
この例では、以下の詳細で3つのマシンがクラスターで実行されています。
manager1:192.168.56.104
worker1:192.168.56.105
worker2:192.168.56.102
dockerでswarmモードを初期化するには、マネージャーノードで以下のコマンドを実行します。フラグ–advertise-addrは、クラスターに参加できるノードに自身をアドバタイズするために使用されます.
[メール保護]:〜$ docker swarm init –advertise-addr 192.168.56.104
Swarmの初期化:現在のノード(lssbyfzuiuh3sye1on63eyixf)がマネージャーになりました.
この群にワーカーを追加するには、次のコマンドを実行します。
docker swarm join –token SWMTKN-1-3h3d8qgvdlxi8tl1oqpfho9khx7i1t5nq7562s9gzojbcm9kr6-azy4rffrzou0nem9hxq4ro5am 192.168.56.104:2377
このswarmにマネージャーを追加するには、「docker swarm join-token manager」を実行して、指示に従います.
上記のコマンドは、このクラスターに参加するために他のノードによって使用されるトークンを生成します。生成されたトークンを使用してコマンドをコピーし、ワーカーノードで実行します.
worker1ノードでトークンを実行する.
[メール保護]:〜$ docker swarm join –token SWMTKN-1-3h3d8qgvdlxi8tl1oqpfho9khx7i1t5nq7562s9gzojbcm9kr6-azy4rffrzou0nem9hxq4ro5am 192.168.56.104:2377
このノードはワーカーとしてスウォームに参加しました.
worker2ノードでトークンを実行する.
[メール保護]:〜$ docker swarm join –token SWMTKN-1-3h3d8qgvdlxi8tl1oqpfho9khx7i1t5nq7562s9gzojbcm9kr6-azy4rffrzou0nem9hxq4ro5am 192.168.56.104:2377
このノードはワーカーとしてスウォームに参加しました.
これで、マネージャーノードで、クラスターで実行されているノードを確認できます。.
[メール保護]:〜$ docker node ls
IDホスト名ステータス空室状況マネージャーステータスエンジンバージョン
lssbyfzuiuh3sye1on63eyixf * manager1 Ready Active Leader 18.09.6
utdr3dnngqf1oy1spupy1qlhu worker1 Active 18.09.6
xs6jqp95lw4cml1i1npygt3cg worker2 Active Active 18.09.6
Dockerfileチュートリアルで使用したgeekflare_mongodb Dockerイメージを作成してみましょう.
docker build -t geekflare_mongodb .
Swarmサービスを作成して、MongoDB Dockerイメージのコンテナを実行します。 27017は、MongoDBが公開されているポート番号です.
[メール保護]:〜$ docker service create –name "モンゴコンテナ" -p 27017:27017 geekflare_mongodb
イメージgeekflare_mongodb:latestは、ダイジェストを記録するためにレジストリでアクセスできませんでした。各ノードはgeekflare_mongodb:latestに個別にアクセスし、異なるノードが異なるバージョンのイメージを実行している可能性があります.
kok58xa4zi05psh3uy6s5x9e6
全体の進捗状況:1分の1のタスク
1/1:実行中
検証:サービスが収束しました
docker swarmサービスが開始されているかどうかを確認します。複製されたモードは、コンテナーがクラスター内のすべてのノードで複製されたことを意味し、REPLICAS 1/1は、現在実行されているSwarmサービスが1つだけであることを意味します.
[メール保護]:〜$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
kok58xa4zi05 Mongo-Container複製1/1 geekflare_mongodb:latest *:27017->27017 / tcp
この単一のサービスが実行されているクラスター内のノードを確認してみましょう。 manager1ノードで実行されています.
[メール保護]:〜$ docker service ps Mongo-Container
ID NAME NODE現在の状態
jgqjo92rbq23 Mongo-Container.1 geekflare_mongodb:latest manager1 Running約1分前に実行
docker psコマンドを実行して、この群サービスを実行しているコンテナーに関する詳細を取得します。.
[メール保護]:〜$ docker ps
コンテナーID画像コマンド作成済みステータスPORTS
05d77e7b4850 geekflare_mongodb:latest "/ bin / sh -c usr / bin /…" 2分前2分前27017 / tcp Mongo-Container.1.jgqjo92rbq23sv01hrufdigtx
で群れサービスを実行できます “グローバル” デフォルトの「レプリケート」モードの代わりのモード。グローバルモードは、クラスター内のすべてのノードでswarmサービスの1つのタスクを実行します.
グローバルモードでサービスを実行する前に、既存の実行中のコンテナーを削除します.
[メール保護]:〜$ docker service rm Mongo-Container
モンゴコンテナ
–modeフラグを使用してグローバルモードでDockerコンテナー内のSwarmサービスを開始します.
[メール保護]:〜$ docker service create –name "モンゴコンテナ" -p 27017:27017 –mode global geekflare_mongodb
イメージgeekflare_mongodb:latestは、ダイジェストを記録するためにレジストリでアクセスできませんでした。各ノードはgeekflare_mongodb:latestに個別にアクセスし、異なるノードが異なるバージョンのイメージを実行している可能性があります.
mfw8dp0zylffppkllkcjl8391
全体の進行状況:3つのタスクのうち3つ
utdr3dnngqf1:実行中
lssbyfzuiuh3:実行中
xs6jqp95lw4c:実行中
検証:サービスが収束しました
swarmサービスがグローバルモードで開始したかどうかを確認します。 3つのノード(1つのマネージャー、2つのワーカー)がクラスターで実行されているため、レプリカの数は3です。.
[メール保護]:〜$ docker service ls
ID名前モードREPLICAS IMAGE PORTS
mfw8dp0zylff Mongo-Container global 3/3 geekflare_mongodb:latest *:27017->27017 / tcp
3つのサービスが3つのノードで実行されています。以下のコマンドを実行して確認してください.
[メール保護]:〜$ docker service ps Mongo-Container
ID NAMEイメージNODE望ましい状態CURRENT STATEエラーPORTS
zj2blvptkvj6 Mongo-Container.xs6jqp95lw4cml1i1npygt3cg geekflare_mongodb:latest worker2 Running約1分前の実行
3eaweijbbutf Mongo-Container.utdr3dnngqf1oy1spupy1qlhu geekflare_mongodb:latest worker1実行中約1分前に実行中
yejg1o2oyab7 Mongo-Container.lssbyfzuiuh3sye1on63eyixf geekflare_mongodb:latest manager1 Running約1分前に実行
次に、レプリカの数を定義する方法を示します。その前に、実行中の現在のコンテナーを削除します.
[メール保護]:〜$ docker service rm Mongo-Container
モンゴコンテナ
コマンドで–replicasフラグを使用し、スウォームサービスに必要なレプリカの数を指定します。たとえば、swarmサービスの2つのレプリカが必要です。
[メール保護]:〜$ docker service create –name "モンゴコンテナ" -p 27017:27017 –replicas = 2 geekflare_mongodb
イメージgeekflare_mongodb:latestは、ダイジェストを記録するためにレジストリでアクセスできませんでした。各ノードはgeekflare_mongodb:latestに個別にアクセスし、異なるノードが異なるバージョンのイメージを実行している可能性があります.
4yfl41n7sfak65p6zqwwjq82c
全体の進行状況:2つのタスクのうち2つ
1/2:実行中
2/2:実行中
検証:サービスが収束しました
現在実行中のswarmサービスを確認してください。 1つのレプリカがmanager1ノードで実行され、もう1つのレプリカがworker1ノードで実行されていることがわかります。.
[メール保護]:〜$ docker service ps Mongo-Container
ID NAME IMAGE NODE
xukodj69h79q Mongo-Container.1 geekflare_mongodb:latest worker1 Running 9秒前に実行
e66zllm0foc8 Mongo-Container.2 geekflare_mongodb:latest manager1 Running 9秒前に実行
worker1ノードに移動し、Dockerコンテナーがswarmサービスを実行しているかどうかを確認します.
[メール保護]:〜$ docker ps
コンテナID画像コマンド作成済みステータスPORTS
5042b7f161cb geekflare_mongodb:latest "/ bin / sh -c usr / bin /…" 約1分前上約1分27017 / tcp Mongo-Container.1.xukodj69h79q3xf0pouwm7bwv
このコンテナーを停止するには、以下のコマンドを実行します.
[メール保護]:〜$ドッカーストップ5042b7f161cb
5042b7f161cb
ここで、manager1ノードから、サービスを実行しているすべてのノードを確認すると、manager1ノードとworker2ノードで実行されていることがわかります。 worker1ノードの現在の状態はシャットダウンです(サービスを実行しているコンテナーを停止したため)。ただし、2つのレプリカでこのサービスを実行する必要があるため、ワーカー2で別のサービスが開始されました.
これが、Docker Swarmを使用して高可用性を実現する方法です。.
[メール保護]:〜$ docker service ps Mongo-Container
ID NAME画像ノード明確な状態状態
cd2rlv90umej Mongo-Container.1 geekflare_mongodb:latest worker2 Running 30秒前に実行
xukodj69h79q \ _ Mongo-Container.1 geekflare_mongodb:latest worker1シャットダウン38秒前に失敗 "タスク:ゼロ以外の出口(137)"
e66zllm0foc8 Mongo-Container.2 geekflare_mongodb:latest manager1 Running 3分前に実行
Dockerコンテナのスケールアップまたはスケールダウンは非常に簡単です。以下のコマンドは、mongoコンテナーを5にスケールアップします.
[メール保護]:〜$ docker service scale Mongo-Container = 5
5にスケーリングされたMongo-Container
全体の進行状況:5つのタスクのうち5つ
1/5:実行中
2/5:実行中
3/5:実行中
4/5:実行中
5/5:実行中
検証:サービスが収束しました
mongoコンテナのレプリカが現在いくつ実行されているかを確認してください。.
[メール保護]:〜$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
4yfl41n7sfak Mongo-Container複製された5/5 geekflare_mongodb:latest *:27017->27017 / tcp
これらの5つのレプリカがクラスター内で実行されている場所を確認します。 manager1ノードで1つのレプリカが実行され、両方のワーカーノードで2つのレプリカが実行されています.
[メール保護]:〜$ docker service ps Mongo-Container
ID NAME状態状態状態
cd2rlv90umej Mongo-Container.1 geekflare_mongodb:latest worker2 Running 2分前に実行
xukodj69h79q \ _ Mongo-Container.1 geekflare_mongodb:latest worker1シャットダウン2分前に失敗 "タスク:ゼロ以外の出口(137)"
e66zllm0foc8 Mongo-Container.2 geekflare_mongodb:latest manager1 Running 5分前に実行
qmp0gqr6ilxi Mongo-Container.3 geekflare_mongodb:latest worker2 Running 47秒前に実行
9ddrf4tsvnu2 Mongo-Container.4 geekflare_mongodb:latest worker1 Running 46秒前に実行
e9dhoud30nlk Mongo-Container.5 geekflare_mongodb:latest worker1 Running 44秒前に実行
クラスター内で、マネージャーノードでサービスを実行したくない場合に、ノードを管理する目的でのみサービスを維持したい場合は、マネージャーノードをドレインできます。.
[メール保護]:〜$ docker node update –availabilityrain manager1
manager1
マネージャーノードの可用性を確認する.
[メール保護]:〜$ docker node ls
IDホスト名ステータス空室状況マネージャーステータスエンジンバージョン
lssbyfzuiuh3sye1on63eyixf * manager1準備中ドレインリーダー18.09.6
utdr3dnngqf1oy1spupy1qlhu worker1 Active 18.09.6
xs6jqp95lw4cml1i1npygt3cg worker2 Ready Active 18.09.6
サービスがマネージャーノードで実行されていないことがわかります。それらはクラスター内のワーカーノードに分散しています.
[メール保護]:〜$ docker service ps Mongo-Container
ID NAME画像状態状態
cd2rlv90umej Mongo-Container.1 geekflare_mongodb:latest worker2 Running 5分前に実行
xukodj69h79q \ _ Mongo-Container.1 geekflare_mongodb:latest worker1シャットダウン5分前に失敗 "タスク:ゼロ以外の出口(137)"
qo405dheuutj Mongo-Container.2 geekflare_mongodb:latest worker1 Running 41秒前に実行
e66zllm0foc8 \ _ Mongo-Container.2 geekflare_mongodb:latest manager1シャットダウンシャットダウン44秒前
qmp0gqr6ilxi Mongo-Container.3 geekflare_mongodb:latest worker2 Running 3分前に実行
9ddrf4tsvnu2 Mongo-Container.4 geekflare_mongodb:latest worker1 Running 3分前に実行
e9dhoud30nlk Mongo-Container.5 geekflare_mongodb:latest worker1 Running 3分前に実行
それは、Docker Swarmと、Docker Swarmモードでコンテナーをオーケストレーションする方法についてのすべてでした。非運用環境でこれらを試して、それがどのように機能するかを理解してください.
タグ:
Docker