コンテナ オーケストレーションのための Docker Swarm
公開: 2019-08-08Docker Swarm のすべてと、Docker Swarm がクラスター内のすべてのコンテナーを管理および調整する方法について説明します。
Docker Swarm とは何ですか?
Docker swarm は、Docker エンジンのクラスターを処理するモードであるため、Swarm という名前が付けられています。 Docker ホストのクラスターは、マネージャーとワーカーで構成される swarm モードで実行されます。 swarm に参加する 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
は、クラスターに参加できるノードに自分自身を通知するために使用されます。
geekflare@manager1:~$ docker swarm init --advertise-addr 192.168.56.104 Swarm initialized: current node (lssbyfzuiuh3sye1on63eyixf) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-3h3d8qgvdlxi8tl1oqpfho9khx7i1t5nq7562s9gzojbcm9kr6-azy4rffrzou0nem9hxq4ro5am 192.168.56.104:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
上記のコマンドは、他のノードがこのクラスターに参加するために使用するトークンを生成します。 トークンが生成されたコマンドをコピーし、ワーカー ノードで実行します。
worker1 ノードでトークンを実行します。
geekflare@worker1:~$ docker swarm join --token SWMTKN-1-3h3d8qgvdlxi8tl1oqpfho9khx7i1t5nq7562s9gzojbcm9kr6-azy4rffrzou0nem9hxq4ro5am 192.168.56.104:2377 This node joined a swarm as a worker.
worker2 ノードでトークンを実行します。
geekflare@worker2:~$ docker swarm join --token SWMTKN-1-3h3d8qgvdlxi8tl1oqpfho9khx7i1t5nq7562s9gzojbcm9kr6-azy4rffrzou0nem9hxq4ro5am 192.168.56.104:2377 This node joined a swarm as a worker.
これで、マネージャー ノードで、クラスター内で実行されているノードを確認できます。
geekflare@manager1:~$ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION lssbyfzuiuh3sye1on63eyixf * manager1 Ready Active Leader 18.09.6 utdr3dnngqf1oy1spupy1qlhu worker1 Ready Active 18.09.6 xs6jqp95lw4cml1i1npygt3cg worker2 Ready Active 18.09.6
Dockerfile チュートリアルで使用したgeekflare_mongodb
docker イメージをビルドしましょう。
docker build -t geekflare_mongodb .
swarm サービスを作成して、MongoDB Docker イメージのコンテナーを実行します。 27017 は、MongoDB が公開されているポート番号です。
geekflare@manager1:~$ docker service create --name "Mongo-Container" -p 27017:27017 geekflare_mongodb image geekflare_mongodb:latest could not be accessed on a registry to record its digest. Each node will access geekflare_mongodb:latest independently, possibly leading to different nodes running different versions of the image. kok58xa4zi05psh3uy6s5x9e6 overall progress: 1 out of 1 tasks 1/1: running verify: Service converged
docker swarm サービスが開始されているかどうかを確認します。 複製された MODE は、コンテナーがクラスター内のすべてのノードで複製されたことを意味し、REPLICAS 1/1 は、現在 1 つの swarm サービスのみが実行されていることを意味します。
geekflare@manager1:~$ docker service ls ID NAME MODE REPLICAS IMAGE PORTS kok58xa4zi05 Mongo-Container replicated 1/1 geekflare_mongodb:latest *:27017->27017/tcp
この単一のサービスが実行されているクラスター内のノードを確認してみましょう。 manager1 ノードで実行されています。
geekflare@manager1:~$ docker service ps Mongo-Container ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS jgqjo92rbq23 Mongo-Container.1 geekflare_mongodb:latest manager1 Running Running about a minute ago
docker ps コマンドを実行して、この swarm サービスを実行しているコンテナーの詳細を取得します。
geekflare@manager1:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 05d77e7b4850 geekflare_mongodb:latest "/bin/sh -c usr/bin/…" 2 minutes ago Up 2 minutes 27017/tcp Mongo-Container.1.jgqjo92rbq23sv01hrufdigtx
デフォルトの「レプリケート」モードの代わりに、 「グローバル」モードでも swarm サービスを実行できます。 グローバル モードでは、クラスタ内のすべてのノードで swarm サービスの 1 つのタスクが実行されます。
サービスをグローバル モードで実行する前に、既存の実行中のコンテナーを削除します。
geekflare@manager1:~$ docker service rm Mongo-Container Mongo-Container
–mode フラグを使用して、docker コンテナー内でグローバル モードで swarm サービスを開始します。
geekflare@manager1:~$ docker service create --name "Mongo-Container" -p 27017:27017 --mode global geekflare_mongodb image geekflare_mongodb:latest could not be accessed on a registry to record its digest. Each node will access geekflare_mongodb:latest independently, possibly leading to different nodes running different versions of the image. mfw8dp0zylffppkllkcjl8391 overall progress: 3 out of 3 tasks utdr3dnngqf1: running lssbyfzuiuh3: running xs6jqp95lw4c: running verify: Service converged
swarm サービスがグローバル モードで開始されたかどうかを確認します。 クラスター内で 3 つのノード (マネージャー 1 つ、ワーカー 2 つ) が実行されているため、レプリカの数は 3 です。
geekflare@manager1:~$ docker service ls ID NAME MODE REPLICAS IMAGE PORTS mfw8dp0zylff Mongo-Container global 3/3 geekflare_mongodb:latest *:27017->27017/tcp
現在、3 つのサービスが 3 つのノードで実行されています。以下のコマンドを実行して確認してください。
geekflare@manager1:~$ docker service ps Mongo-Container ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS zj2blvptkvj6 Mongo-Container.xs6jqp95lw4cml1i1npygt3cg geekflare_mongodb:latest worker2 Running Running about a minute ago 3eaweijbbutf Mongo-Container.utdr3dnngqf1oy1spupy1qlhu geekflare_mongodb:latest worker1 Running Running about a minute ago yejg1o2oyab7 Mongo-Container.lssbyfzuiuh3sye1on63eyixf geekflare_mongodb:latest manager1 Running Running about a minute ago
次に、レプリカの数を定義する方法を示しましょう。 その前に、実行中の現在のコンテナーを削除します。

geekflare@manager1:~$ docker service rm Mongo-Container Mongo-Container
コマンドで –replicas フラグを使用し、swarm サービスに必要なレプリカの数を指定します。 たとえば、swarm サービスの 2 つのレプリカが必要です。
geekflare@manager1:~$ docker service create --name "Mongo-Container" -p 27017:27017 --replicas=2 geekflare_mongodb image geekflare_mongodb:latest could not be accessed on a registry to record its digest. Each node will access geekflare_mongodb:latest independently, possibly leading to different nodes running different versions of the image. 4yfl41n7sfak65p6zqwwjq82c overall progress: 2 out of 2 tasks 1/2: running 2/2: running verify: Service converged
現在実行中の swarm サービスを確認します。 1 つのレプリカが manager1 ノードで実行され、もう 1 つのレプリカが worker1 ノードで実行されていることがわかります。
geekflare@manager1:~$ docker service ps Mongo-Container ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS xukodj69h79q Mongo-Container.1 geekflare_mongodb:latest worker1 Running Running 9 seconds ago e66zllm0foc8 Mongo-Container.2 geekflare_mongodb:latest manager1 Running Running 9 seconds ago
worker1 ノードに移動し、docker コンテナーが swarm サービスを実行しているかどうかを確認します。
geekflare@worker1:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5042b7f161cb geekflare_mongodb:latest "/bin/sh -c usr/bin/…" About a minute ago Up About a minute 27017/tcp Mongo-Container.1.xukodj69h79q3xf0pouwm7bwv
このコンテナーを停止するには、次のコマンドを実行します。
geekflare@worker1:~$ docker stop 5042b7f161cb 5042b7f161cb
manager1 ノードから、サービスを実行しているすべてのノードを確認すると、manager1 ノードと worker2 ノードで実行されていることがわかります。 worker1 ノードの CURRENT STATE は Shutdown です (サービスを実行しているコンテナーを停止したため)。 しかし、2 つのレプリカがこのサービスを実行する必要があるため、ワーカー 2 で別のサービスが開始されました。
これが、docker swarm を使用して高可用性を実現する方法です。
geekflare@manager1:~$ docker service ps Mongo-Container ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS cd2rlv90umej Mongo-Container.1 geekflare_mongodb:latest worker2 Running Running 30 seconds ago xukodj69h79q \_ Mongo-Container.1 geekflare_mongodb:latest worker1 Shutdown Failed 38 seconds ago "task: non-zero exit (137)" e66zllm0foc8 Mongo-Container.2 geekflare_mongodb:latest manager1 Running Running 3 minutes ago
Docker コンテナーのスケールアップまたはスケールダウンは非常に簡単です。 以下のコマンドは、mongo コンテナーを 5 にスケールアップします。
geekflare@manager1:~$ docker service scale Mongo-Container=5 Mongo-Container scaled to 5 overall progress: 5 out of 5 tasks 1/5: running 2/5: running 3/5: running 4/5: running 5/5: running verify: Service converged
現在実行されている mongo コンテナーのレプリカの数を確認してください。5 である必要があります。
geekflare@manager1:~$ docker service ls ID NAME MODE REPLICAS IMAGE PORTS 4yfl41n7sfak Mongo-Container replicated 5/5 geekflare_mongodb:latest *:27017->27017/tcp
これら 5 つのレプリカがクラスター内で実行されている場所を確認します。 manager1 ノードで 1 つのレプリカが実行され、両方のワーカー ノードでそれぞれ 2 つのレプリカが実行されています。
geekflare@manager1:~$ docker service ps Mongo-Container ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS cd2rlv90umej Mongo-Container.1 geekflare_mongodb:latest worker2 Running Running 2 minutes ago xukodj69h79q \_ Mongo-Container.1 geekflare_mongodb:latest worker1 Shutdown Failed 2 minutes ago "task: non-zero exit (137)" e66zllm0foc8 Mongo-Container.2 geekflare_mongodb:latest manager1 Running Running 5 minutes ago qmp0gqr6ilxi Mongo-Container.3 geekflare_mongodb:latest worker2 Running Running 47 seconds ago 9ddrf4tsvnu2 Mongo-Container.4 geekflare_mongodb:latest worker1 Running Running 46 seconds ago e9dhoud30nlk Mongo-Container.5 geekflare_mongodb:latest worker1 Running Running 44 seconds ago
クラスター内で、サービスをマネージャー ノードで実行したくなく、ノードを管理するためだけに保持したい場合は、マネージャー ノードをドレインできます。
geekflare@manager1:~$ docker node update --availability drain manager1 manager1
マネージャーノードの可用性を確認してください。
geekflare@manager1:~$ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION lssbyfzuiuh3sye1on63eyixf * manager1 Ready Drain Leader 18.09.6 utdr3dnngqf1oy1spupy1qlhu worker1 Ready Active 18.09.6 xs6jqp95lw4cml1i1npygt3cg worker2 Ready Active 18.09.6
マネージャー ノードでサービスが実行されていないことがわかります。 それらは、クラスター内のワーカー ノード全体に分散されます。
geekflare@manager1:~$ docker service ps Mongo-Container ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS cd2rlv90umej Mongo-Container.1 geekflare_mongodb:latest worker2 Running Running 5 minutes ago xukodj69h79q \_ Mongo-Container.1 geekflare_mongodb:latest worker1 Shutdown Failed 5 minutes ago "task: non-zero exit (137)" qo405dheuutj Mongo-Container.2 geekflare_mongodb:latest worker1 Running Running 41 seconds ago e66zllm0foc8 \_ Mongo-Container.2 geekflare_mongodb:latest manager1 Shutdown Shutdown 44 seconds ago qmp0gqr6ilxi Mongo-Container.3 geekflare_mongodb:latest worker2 Running Running 3 minutes ago 9ddrf4tsvnu2 Mongo-Container.4 geekflare_mongodb:latest worker1 Running Running 3 minutes ago e9dhoud30nlk Mongo-Container.5 geekflare_mongodb:latest worker1 Running Running 3 minutes ago
以上が、Docker Swarm と、docker swarm モードでコンテナーをオーケストレーションする方法についてでした。 非実稼働環境でこれらを試して、どのように機能するかを理解してください。