デプロイから基本操作までDocker Swarm

デプロイから基本操作までDocker Swarm

Docker Swarmについて

Docker Swarm は次の 2 つの部分で構成されます。

  1. Docker クラスター: ユーザーがクラスター方式で管理できるように、1 つ以上の Docker ノードを編成します。
  2. アプリケーション オーケストレーション: コンテナをデプロイおよび管理するための API セットがあります。

公式情報: https://docs.docker.com/swarm/

ネットワーク図

次の図は、Docker 公式 Web サイトの典型的な Docker Swarm クラスターの展開図です。

次に、上の図に従って Docker Swarm クラスターを構築します。

準備

今回の実戦では合計 5 台のマシンが使用され、構成情報はすべて次のとおりです。

  • オペレーティング システム: CentOS Linux リリース 7.6.1810
  • Docker サービス バージョン: 1.13.1
  • ファイアウォールはオフになっています。

マシン情報は次の表に示されています。

IPアドレスホスト名身元
192.168.121.142 0 メートル管理ノード
192.168.121.139 1 メートル管理ノード
192.168.121.140平方メートル管理ノード
192.168.121.141 0 うワーカーノード
192.168.121.138 w1ワーカーノード

なぜ管理ノードが 3 つあるのですか?

公式図からわかるように、管理ノード クラスター間の内部管理調整には Raft コンセンサス アルゴリズムが使用され、管理ノードの高可用性 (HA) が確保されます。一般的に、次の 2 つの原則が参照されます。

  • ブレインスプリットを減らすために、奇数の管理ノードを展開します。
  • 管理ノードの数が増えると合意に達するまでの時間も長くなるため、管理ノードをあまり多く展開しないでください。

クラスターの展開手順の概要

展開プロセス全体は次のステップに分かれています。

  • 最初の管理ノード(m0)を初期化します。
  • 新しい管理ノード(m1、m2)を追加します。
  • 作業ノード(w0、w1)を結合します。

それでは正式に始めましょう。

最初の管理ノード(m0)を初期化する

m0 ノードの IP アドレスは 192.168.121.142 なので、m0 ノードで次のコマンドを実行します。

docker スウォーム初期化\
--アドバタイズアドレス 192.168.121.142:2377
--listen-addr 192.168.121.142:2377

2 つのパラメータ、advertise-addr と listen-addr については、前者は m0 に接続するときに他のノードのアドレスを指定するために使用され、後者は swarm トラフィックを伝送する IP とポートを指定します。より詳細で徹底した違いについては、次の記事を参照してください: https://boxboat.com/2016/08/17/whats-docker-swarm-advertise-addr/

2. コンソールに次の情報が表示され、Swarm クラスターが正常に初期化されたことが示されます。

Swarm が初期化されました: 現在のノード (7585zt09o2sat82maef0ocf42) がマネージャーになりました。

この Swarm にワーカーを追加するには、次のコマンドを実行します。

  docker swarm 参加 \
  --トークン SWMTKN-1-5huefb5501cv7p8i2op1am2oevasoqu4te8vpvapndkudvszb4-e8l6755jstd7urpdo5smyi8fv \
  192.168.121.142:2377

この Swarm にマネージャーを追加するには、「docker swarm join-token manager」を実行し、指示に従います。

現在の Swarm クラスター内のすべてのノードを一覧表示すると、唯一のノード m0 のステータスと ID を確認できます。

[root@m0 ~]# docker ノード ls
ID ホスト名 ステータス 可用性 マネージャ ステータス
7585zt09o2sat82maef0ocf42 * m0 準備完了アクティブリーダー

クラスターが確立されたので、管理ノードとワーカーノードを追加する必要があります。

新しいノードを追加するにはどうすればいいですか?

新しいノードが Docker Swarm に参加するための戦略は、管理ノードから参加トークンと呼ばれる長いコマンド文字列を取得することです。クラスターに参加したいマシンは、この参加トークン自体を実行することで Swarm クラスターに参加できます。

新しい管理ノードを追加する必要がある場合は、以下に示すように、m0 でコマンドdocker swarm join-token managerを実行して、管理ノードの参加トークンを取得します。

[root@m0 ~]# docker swarm join-token マネージャー
この Swarm にマネージャーを追加するには、次のコマンドを実行します。

  docker swarm 参加 \
  --トークン SWMTKN-1-5huefb5501cv7p8i2op1am2oevasoqu4te8vpvapndkudvszb4-5tz9d4w7nwzu8r4ozd0ff2aiu \
  192.168.121.142:2377

新しいワーカー ノードを追加する必要がある場合は、次に示すように、コマンド docker swarm join-token worker in m0 を実行して、ワーカー ノードの参加トークンを取得します。

[root@m0 ~]# docker swarm join-token ワーカー
この Swarm にワーカーを追加するには、次のコマンドを実行します。

  docker swarm 参加 \
  --トークン SWMTKN-1-5huefb5501cv7p8i2op1am2oevasoqu4te8vpvapndkudvszb4-e8l6755jstd7urpdo5smyi8fv \
  192.168.121.142:2377

両方の参加トークンの準備が整い、新しいノードの追加を開始します。

管理ノードm1とm2を追加する

先ほど取得した管理ノード参加トークンを m1 で実行します。

[root@m1 ~]# docker swarm に参加 \
> --token SWMTKN-1-5huefb5501cv7p8i2op1am2oevasoqu4te8vpvapndkudvszb4-5tz9d4w7nwzu8r4ozd0ff2aiu \
> 192.168.121.142:2377
このノードはマネージャーとして群れに参加しました。

m2 でも同じことを行います。

m0、m1、m2 のいずれかでコマンド docker node ls を実行し、Swarm クラスターの現在のステータスを表示します。次の図に示すように、3 つの管理ノードはすべて正常なステータスです。ID フィールドにはアスタリスク サフィックスが付いており、現在コマンドを実行しているマシンが m1 であることを示しています。

[root@m1 ~]# docker ノード ls
ID ホスト名 ステータス 可用性 マネージャ ステータス
0isfyre69mdu1hm11esf1q3dk m2 準備完了 アクティブ 到達可能
7585zt09o2sat82maef0ocf42 m0 準備万端のアクティブリーダー
slc0hjbs7jh2hdi8ai3wohy23 * m1 準備完了 アクティブ 到達可能

作業ノードw0とw1を結合する

先ほど取得した作業ノードの参加トークンを w0 で実行します。

[root@w0 ~]# docker swarm に参加\
> --token SWMTKN-1-5huefb5501cv7p8i2op1am2oevasoqu4te8vpvapndkudvszb4-e8l6755jstd7urpdo5smyi8fv \
> 192.168.121.142:2377
このノードはワーカーとして群れに参加しました。

w1に対しても同じ操作を実行します。

m0、m1、m2 のいずれかで docker node ls コマンドを実行して、Swarm クラスターの現在のステータスを表示します。すべての動作ノードが準備ができていることがわかります。

[root@m0 ~]# docker ノード ls
ID ホスト名 ステータス 可用性 マネージャ ステータス
0isfyre69mdu1hm11esf1q3dk m2 準備完了 アクティブ 到達可能
7585zt09o2sat82maef0ocf42 * m0 準備完了アクティブリーダー
i71bcxt1auc804syybroajtan w1 準備完了 アクティブ    
slc0hjbs7jh2hdi8ai3wohy23 m1 準備完了 アクティブ 到達可能
wqcwcccva3d3mxgi5p423d4fv w0 準備完了 アクティブ

この時点で、Swarm クラスター環境が構築され、次に検証できるようになります。

Swarmクラスタ環境を確認する

tomcat-net という名前のオーバーレイ ネットワークを作成します。これはレイヤー 2 ネットワークです。このネットワークの下にある Docker コンテナは、ホスト マシンが異なっていても相互にアクセスできます。

docker ネットワーク作成 -d オーバーレイ tomcat-net

作成したオーバーレイ ネットワークを使用して、tomcat というサービスを作成します。

docker サービス作成 --name tomcat \
--network tomcat-net \
-p 8080:8080 \
--レプリカ 3 \
トムキャット:7.0.96-jdk8-openjdk

現在のすべてのサービスを表示するには、docker service ls コマンドを実行します。

[root@m0 ~]# docker サービス ls
ID 名前 モード レプリカ 画像
kguawc4b5th4 tomcat は 3/3 に複製されました tomcat:7.0.96-jdk8-openjdk
 

コマンド docker service ps tomcat を実行して、tomcat という名前のサービスを表示します。3 つのコンテナがそれぞれ m0、m2、w1 マシンにデプロイされていることがわかります。

[root@m0 ~]# docker サービス ps tomcat
ID 名前 イメージ ノード 望ましい状態 現在の状態 エラー ポート
n1gs9f1plce2 tomcat.1 tomcat:7.0.96-jdk8-openjdk w1 実行中 実行中 19 分前     
q8jyg088ci21 tomcat.2 tomcat:7.0.96-jdk8-openjdk m2 実行中 実行中 19 分前     
h9ww33dpw56m tomcat.3 tomcat:7.0.96-jdk8-openjdk m0 実行中 実行中 19 分前

tomcat という名前のサービスに関する詳細情報を表示するには、コマンド docker service inspect --pretty tomcat を実行します (より完全なビューを表示するには、--pretty を削除します)。

[root@m0 ~]# docker service inspect --pretty tomcat

ID: kguawc4b5th4qlwlsv183qtai
名前: トムキャット
サービスモード: 複製
 レプリカ: 3
配置:
更新構成:
 並列処理: 1
 失敗した場合: 一時停止
 最大故障率: 0
コンテナ仕様:
 イメージ: tomcat:7.0.96-jdk8-openjdk@sha256:91eadffb59d9a35ada2d39fcd616a749ac580aa5e834499b7128f27be2e46623
リソース:
ネットワーク: tomcat-net 
エンドポイントモード: vip
ポート:
 公開ポート 8080
 プロトコル = tcp
 ターゲットポート = 8080

ブラウザを開き、5 台のマシン m0、m1、m2、w0、w1 のポート 8080 にアクセスしてみます。Tomcat ホームページに正常にアクセスできます。

サービスモデル

  1. サービス モードには、Ingress と Host の 2 つがあります。指定しない場合は、デフォルトで Ingress が使用されます。
  2. Ingress モードでは、ノードに Tomcat サービス レプリカがない場合でも、任意の Swarm ノードのポート 8080 に到着するトラフィックは、任意のサービス レプリカの内部ポート 80 にマッピングされます。
  3. ホスト モードでは、コンテナ コピーが実行されているマシンでのみポートが開かれます。ホスト モードを使用するコマンドは次のとおりです。
docker サービス作成 --name tomcat \
--network tomcat-net \
--publish 公開済み=8080、ターゲット=8080、モード=ホスト \
--レプリカ 3 \
トムキャット:7.0.96-jdk8-openjdk

サービスのスケーリング

コマンド docker service scale tomcat=5 を実行して、レプリカの数を 3 から 5 に調整します。

[root@m0 ~]# docker サービススケール tomcat=5
tomcat 5にスケールアップ

コマンド docker service ps tomcat を実行して、tomcat という名前のサービスを表示します。各マシンにコンテナが分散されていることがわかります。

[root@m0 ~]# docker サービス ps tomcat
ID 名前 イメージ ノード 望ましい状態 現在の状態 エラー ポート
w32tjahze2fk tomcat.1 tomcat:7.0.96-jdk8-openjdk m2 実行中 実行中 42 分前       
yj5czwwhrrsh tomcat.2 tomcat:7.0.96-jdk8-openjdk m0 実行中 実行中 42 分前       
pq40995nbd0k tomcat.3 tomcat:7.0.96-jdk8-openjdk w1 実行中 実行中 42 分前       
y1y6z1jczel1 tomcat.4 tomcat:7.0.96-jdk8-openjdk m1 実行中 約 1 分前に実行中     
w0dcii8f79os tomcat.5 tomcat:7.0.96-jdk8-openjdk w0 実行中 約1分前に実行中

ローリングアップグレード

現在の tomcat サービスでは、tomcat イメージのタグは7.0.96-jdk8-openjdkです。これを9.0.24-jdk11-openjdkにアップグレードしてみます。次のコマンドを実行します。

docker サービスの更新 \
--image tomcat:9.0.24-jdk11-openjdk \
--update-parallelism 1 \
--update-delay 10s tomcat

上記のコマンドに関して注意すべき点がいくつかあります。
a. update-parallelism: 毎回更新されるコンテナの数。ここでは 1 に設定されており、各コンテナは正常にアップグレードされた後にのみアップグレードされることを意味します。
b. update-delay: 各バッチが正常にアップグレードされた後、次のバッチをアップグレードするまでの待機時間。ここでは、1 つのコンテナをアップグレードした後、次のコンテナをアップグレードするまでに 10 秒間待機することを意味します。

2. アップグレード プロセス中に、コマンドdocker service ps tomcatを実行してサービスを表示すると、新しいバージョンのコンテナーを 1 つずつ起動するプロセスを確認できます。

[root@m0 ~]# docker サービス ps tomcat
ID 名前 イメージ ノード 望ましい状態 現在の状態 エラー ポート
w32tjahze2fk tomcat.1 tomcat:7.0.96-jdk8-openjdk m2 実行中 実行中 56 分前       
yj5czwwhrrsh tomcat.2 tomcat:7.0.96-jdk8-openjdk m0 実行中 実行中 56 分前       
semuna9awsn7 tomcat.3 tomcat:9.0.24-jdk11-openjdk w1 実行中 15 秒前       
pq40995nbd0k \_ tomcat.3 tomcat:7.0.96-jdk8-openjdk w1 シャットダウン シャットダウン 約 1 分前     
y1y6z1jczel1 tomcat.4 tomcat:7.0.96-jdk8-openjdk m1 実行中 実行中 15 分前       
oot3yex74v4t tomcat.5 tomcat:9.0.24-jdk11-openjdk w0 実行中 準備中 5 秒前       
w0dcii8f79os \_ tomcat.5 tomcat:7.0.96-jdk8-openjdk w0 シャットダウン シャットダウン 3秒前

アップグレードが完了したら、ブラウザを使用してサービスにアクセスすると、Tomcat のバージョンがアップグレードされたことがわかります。

サービスの削除

サービスを削除するには、コマンド docker service rm tomcat を実行します。

[root@m0 ~]# docker サービス rm tomcat
トムキャット
[root@m0 ~]# docker サービス ls
ID 名前 モード レプリカ 画像

ここまで、Docker Swarmのデプロイから基本的な操作までを体験してきました。この記事が環境構築の際の参考になれば幸いです。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Docker をインストールして Docker Swarm モードで使用する方法
  • Docker Swarm のサービス検出と負荷分散の原則の詳細な説明
  • docker swarm クラスターの障害と例外の詳細な説明
  • Docker 1.12 を使用してマルチホスト Docker Swarm クラスターを構築する詳細な説明
  • Docker swarm を使用して Nebula Graph クラスターを迅速にデプロイする方法のチュートリアル

<<:  PDO を使用して SQL インジェクションを防ぐ原理の分析

>>:  Vueでaxiosをカプセル化するいくつかの方法

推薦する

HTML 描画ユーザー登録ページ

この記事では、HTML描画ユーザー登録ページの具体的な実装コードを参考までに共有します。具体的な内容...

Ubuntu で .sh ファイルを実行するいくつかの方法の違いについて簡単に説明します。

序文特に bash 環境では、スクリプトの実行方法によって結果が異なります。スクリプトを実行する方法...

Raspberry PiにDockerをインストールする方法

Raspberry Pi は ARM アーキテクチャをベースとしているため、Docker のインスト...

Vue で eslint 検出をオフにする方法 (複数の方法)

目次1. 問題の説明2. 問題解決1. 問題の説明Vue プロジェクトを開発する場合、作成時に誤って...

Linux (CentOS7) で RPM を使用して MySQL 8.0.11 をインストールするチュートリアル

目次1. インストールの準備1. Linux関連情報の表示(Linuxコマンドライン操作) 2. M...

Vueはデジタル千単位区切り形式をグローバルに実装します

この記事の例では、Vue がデジタル 3 桁区切り形式をグローバルに実装するための具体的なコードを参...

どのような種類の MYSQL 接続クエリを知っていますか?

序文クエリ情報が複数のテーブルから取得される場合、クエリのためにこれらのテーブルを結合する必要があり...

border-radius 値の設定に関する質問

問題記録今日はプログレスバーに似た小さなコンポーネントを完成させるつもりでした。プロトタイプは次のよ...

Linux 構成 SSH パスワードフリーログイン「ssh-keygen」の基本的な使い方

目次1 SSHとは何か2 SSHパスワードフリーログインを設定する2.1 必要なソフトウェアのインス...

Dockerはmysqldumpコマンドを使用してプロジェクト内のmysqlデータをバックアップおよびエクスポートします。

mysqldump コマンドはじめに: データベースバックアッププログラム形式: mysqldum...

NestJsはMongooseを使用してMongoDBを操作する

最近、NestJs フレームワークを学び始めました。学習コストは他のフレームワークよりもはるかに高く...

フレックスとポジションの互換性の詳細な説明マイニングノート

今日は、すべてのブラウザ (主に IE 9 以上と Chrome) と互換性のある自分のホームページ...

HTMLチェックボックス説明テキストをクリックして状態を選択/チェック解除します

Web 開発では、チェックボックスは小さく、ユーザーにとって操作があまり便利ではないため、ユーザーが...

vueプロジェクトのマルチ環境設定(.env)の実装

目次マルチ環境構成とは何ですか? また、なぜそれが必要なのですか? .env ファイルはどこで設定さ...

Centos7 で ZooKeeper3.4 ミドルウェアを構築するための一般的なコマンドの概要

1.ダウンロードして解凍する1. Zookeeperの紹介分散サービス フレームワークとして、Zoo...