Kubernetesの代わりにDockerを使用してコンテナを直接オーケストレーションできるかどうか疑問に思ったことはありませんか? Docker Swamはあなたが探しているソリューションであり、あなたは正しい方向に進んでいます!
このチュートリアルでは、DockerSwarmを使用して複数のDockerコンテナを管理する方法を学習します。
読んで、オーケストレーションを開始してください!
このチュートリアルは、実践的なデモンストレーションになります。フォローする場合は、次のものがあることを確認してください。
- Ubuntu20.04.3LTSで実行されている3つのEC2インスタンス。
- すべてのEC2インスタンスにインストールされたDocker–このチュートリアルではバージョン20.10.12を使用します。
DockerSwarmへのコンテナーの構築とデプロイ
Docker Swarmは、Dockerアプリケーションを実行する仮想または物理マシンクラスターです。スウォームモードは、Dockerにコンテナオーケストレーションの組み込み機能を提供します。
ただし、複数のコンテナの管理を開始する前に、さまざまなシステム/マシン(AWS EC2インスタンス)が必要になります。
チュートリアルに進む前に、スウォームモードの主要な概念を学ぶことができます。
EC2インスタンスが設定されていると仮定します:
1. Webブラウザーを開き、EC2ダッシュボードにログインします。以下に示すように、EC2インスタンスの情報の概要ページの1つを表示し、パブリックIPv4アドレスをメモします。
2.次に、ターミナルを開き、以下のコマンドを実行して、EC2インスタンスの1つにマネージャーノードを作成します。 18.237.102.75
を必ず置き換えてください 以前にメモしたEC2インスタンスのパブリックIPv4アドレスを使用します(ステップ1)。以下のコマンドは、インスタンスをDockerswarmmanagerノードとして初期化します。
マネージャーノードは、タスク/コンテナーにIPアドレスを割り当て、ノードにタスクを割り当て、ワーカーノードが実行するコマンドを発行します。
マネージャーノードは、DockerSwarmのオーケストレーションおよびクラスター管理機能を実行します。でも心配しないでくださいこのチュートリアルを進めるにつれて、ワーカーノードについて学習します。
sudo docker swarm init --advertise-addr 18.237.102.75
以下に示す同様のコマンドに注意してください。
3.前にメモしたコマンド(ステップ2)を実行して、ワーカーノードとして群れに参加します。ワーカーノードは、マネージャーノードによって指示されたタスクを受信して実行します。
4.次に、 docker node
を実行します 以下のコマンドを使用して、特定の群れに存在するすべてのノードを確認します。以下のコマンドを実行できるのはマネージャーノードのみであることに注意してください。
sudo docker node ls
5.手順2を繰り返して、別のEC2インスタンスにマネージャーノードを作成します。
参加トークンがもうない場合は、マネージャーノードで以下のコマンドを実行して参加トークンを表示できます。
sudo docker swarm join-token worker
6.次に、以下の docker service
を実行します DockerSwarmで管理されるサービスを作成するコマンド。このチュートリアルでは、プレーンなNGINXイメージをデプロイします。
dockerサービス
以下のコマンドは以下を実行します:
- (
-name
という名前のサービスを作成します )nginx-service
、ただし、どの名前でも機能します。 -
-replicas
の数を記載してください あなたが望むあなたのアプリケーション/コンテナの。この場合、レプリカの値は3(3
)に設定されます。 )。レプリカはアプリケーションの高可用性を提供し、ダウンタイムを排除します。 Dockerは、サービスのレプリカを作成するときに、使用可能な3つのノード間でレプリカを共有します。 - ポートを記述します(
-p 80:80
)、使用する画像の名前を指定します(nginx:latest
。
sudo docker service create --name nginx-service --replicas 3 -p 80:80 nginx:latest
7.以下のコマンドを実行して、以前に作成したサービス(nginx-service)を確認します(ステップ6)。
sudo docker service ls
8.次に、各ノードに切り替えて、以下のコマンドを実行して、使用可能なコンテナーをリストします。
sudo docker ps
以下に示すように、ノードごとに作成したコンテナのレプリカが1つ表示されます。
9.最後に、各EC2インスタンスのIPアドレスを取得し、お好みのWebブラウザーでそれらに移動します。
同様に、以下では、各インスタンスがアプリケーションのレプリカを保持していることを確認できます。
単一のサービスのデプロイを完了しましたが、複数のサービスを使用してアプリケーションをどのようにデプロイしますか? DockerSwarmも仕事を成し遂げることができます。 stack deploy
を使用します コマンド。作成するYAMLファイルに記載されている手順を使用します。
1.マネージャーノードを開き、お好みのテキストエディターでYAMLファイルを作成します。ファイルには別の名前を付けることができますが、このデモでは、ファイルの名前は file-name.yml です。 。
file-name.ymlにデータを入力します 次のコードを含むファイル。NGINXイメージとUbuntuイメージを使用して2つのサービスを作成します。
version: '3.3' # version of compose file
services:
service1:
image: 'nginx:latest' # latest version of NGINX image on Docker hub
ports:
- '8000:8080'
service2:
image: 'ubuntu' # Ubuntu image on docker hub
2.次に、 docker stack
を実行します 以下のコマンドでdeploy
file-name.yml
によって作成されたサービス DockerSwarmにファイルします。 new-stack
パラメーターは任意であり、コマンドがサービス用に作成するスタックに名前を付けます。
sudo docker stack deploy -c file-name.yml new-stack
3.以下のコマンドを実行して、使用可能なサービスを一覧表示し、必要なサービスの名前をメモします。
sudo docker service ls
4.次に、以下のコマンドを実行して、スタックのレプリカを作成します。 4つ( 4
)このデモに正確なレプリカ。マネージャノードは、レプリカを保持するノードを割り当てます。
以前にDockerSwarmにデプロイしたアプリケーション(ステップ2)には、マネージャーノードによって処理されるレプリカが1つだけあります。サービスをスケーリングするには、そのサービスの4つのレプリカを作成します。ノードは3つしかないため、1つのノードが2つのレプリカを処理し、残りのノードはそれぞれ1つのレプリカを処理します。
レプリカの数を減らすことでサービスを縮小することもできます。
sudo docker service scale new-stack_service1=4
5.最後に、以下のdocker serviceコマンドを実行して、 new-stack_service1
のレプリカを現在処理しているすべてのコンテナーを確認します。 サービス。
sudo docker service ps new-stack_service1
次の画像では、1つのノードが2つのレプリカを処理していることに注意してください。
以前にサービスを展開する方法を学びましたが、サービスを更新できることをご存知ですか?おそらく、古いバージョンのサービスをテストしたいと思うでしょう。その場合は、 update
を使用します タグと--image
フラグを立てて必要なサービスのバージョンを示し、次に更新するサービスの名前を示します。
1.以下のコマンドを実行して、現在実行中のサービスの詳細を調べます。
sudo docker service inspect --pretty nginx-service
以下では、NGINXが最新で実行されていることがわかります。 バージョン。
2.現在実行中のサービス( nginx-service
)で別のバージョンのNGINXに変更/更新する場合は、以下のコマンドを実行します。 ) 検査用の。必ずnginx:1.20
を置き換えてください お好みのバージョンで。
sudo docker service update --image nginx:1.20 nginx-service
3.最後に、前に行ったように(ステップ1)、以下のコマンドを再実行して、実行中のサービスの詳細を調べます。
sudo docker service inspect --pretty nginx-service
以下で、実行中のサービスが正常に更新されたことに注意してください。
特定のワーカーノードで作業して、コンテナに変更を加えることもできますが、アプリケーションを稼働させたい場合があります。どのように?そのノードで作業している間、drain
そのノードなので、マネージャーノードからタスクを受け取ることはありません。
drain
と並んで コマンドの場合、 update
を追加する必要があります タグと-可用性コード> 特定のノードの可用性を変更するためのフラグ。
1.dockerノード
を実行します 以下のコマンドを使用して、使用可能なノードを一覧表示し、ターゲットノードのIDをメモします。
sudo docker node ls
2.次に、以下のコマンドを実行して、-availability
を変更します。 ドレインによるノードの(drain
)。 kseh5660n8xb3i2ojidzx0x13
を置き換えます 手順1でメモしたターゲットノードのIDを使用します。
sudo docker node update --availability drain kseh5660n8xb3i2ojidzx0x13
3.最後に、 docker
を再実行します 手順1で行ったように、以下のコマンドを実行して、使用可能なノードを一覧表示します。 sudo docker node ls
sudo docker node ls
以下に、選択したノードの可用性が変更されていることを確認できます(ドレイン )、ノードが群れで行われているアクティビティに参加しないようにします。
このチュートリアルでは、DockerSwarmでコンテナオーケストレーションを活用する方法を学びました。複数のサービスを使用してアプリケーションをスケーリングし、DockerSwarmを使用して操作を実行するための基本的な知識を習得しました。
この時点で、DockerSwarmでDockerコンテナとサービスを管理する方法をすでに知っています。では、この新しく発見された知識を将来のコンテナオーケストレーションにどのように組み込む予定ですか?おそらく、Docker Swarmを使用してDjangoアプリケーションのデプロイを開始しますか?