序文 この記事は私自身の製作過程の簡単な記録です。練習中に質問があれば、一緒に話し合うことができます。 ローカルマシン(macOS)上でクラスター環境をシミュレートするために、vb と docker-machine を使用します。全体的な継続的インテグレーションのためのマシン機能は次のとおりです。 1. サービス ノード: マネージャー ノード 3 つとワーカー ノード 1 つ。マネージャーはより多くのリソースを占有する必要があるため、マネージャーの構成は可能な限り高くする必要があります。スウォーム マネージャー ノードのフォールト トレランス率は (N-1)/2 です。 N はマネージャーノードの数です。つまり、マネージャーが 3 つある場合、1 つのマネージャー ノードの障害を許容できます。公式アルゴリズムの説明: スウォーム モードでの Raft コンセンサス。 2. ローカル イメージ リポジトリ レジストリ: デプロイする必要があるすべてのサービス Docker イメージを保存するために使用されます。 https://docs.docker.com/registry/deploying/ スウォーム メカニズムが使用されるため、サービス間通信におけるサービス検出と負荷分散の問題を考慮する必要がありません (元の consul と registor 方式の代わりに)。 3. イメージの運用および保守ノード ops をビルドします。 つまり、運用保守機械です。単一のノードで十分です。主にイメージの構築とプッシュを担当します。 ops で gitlab のプライベート リポジトリを構築できます。ビルド スクリプトを維持します。マシンに必要な構成はそれほど高くありませんが、ネットワーク帯域幅は可能な限り高くする必要があります。 docker-machineを使用してクラスタ環境をシミュレートする レジストリノードを作成する docker-machine create -d virtualbox --virtualbox-memory "512" レジストリ –engine-registry-mirror このパラメータを使用して、いくつかのアクセラレーション リポジトリのアドレスを設定できます。 マネージャーノードとワーカーノードを作成する マネージャー 次のようにコードをコピーします。 docker-machine create -d virtualbox --virtualbox-memory "800" manager1 ワーカー: docker-machine create -d virtualbox --virtualbox-memory "800" ワーカー1 docker-machine create -d virtualbox --virtualbox-memory "800" ワーカー2 docker-machine create -d virtualbox --virtualbox-memory "800" ワーカー3 オペレーションノードを作成する docker-machine create -d virtualbox --virtualbox-memory "512" ops マシンリストのステータスを表示する docker-machine ls レジストリサービスを作成する レジストリマシンにログインします。 docker-machine ssh レジストリ レジストリ サービスを作成します。 docker run -d -p 5000:5000 --restart=always --name レジストリ \ -v `pwd` /data:/var/lib/registry \ レジストリ:2 このコマンドは、コンテナ サービスが再起動されるたびにプルされたイメージ データが失われないように、-v ボリューム オプションを設定します。レジストリやmysqlなどのストレージタイプのコンテナの場合は、ボリュームを設定することをお勧めします。より良い拡張のために、Alibaba CloudのOSSなど、他のドライバーにイメージリポジトリをバックアップすることもできます。 開始されたレジストリ サービスを確認するには、docker ps を実行します。もちろん、より拡張性を高めるために、独自のドメイン名でマウントし、再実行時に認証情報を追加することもできます。 コンテナの管理を容易にするために、docker-compose コンポーネントを使用できます。インストール: 次のようにコードをコピーします。 curl -L "https://github.com/docker/compose/releases/download/1.9.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose Compose ファイルを書き込んだ後、直接開始することもできます。 docker-compose を起動 -d ローカルリポジトリのプッシュイメージ これで、イメージをプルしてローカルレジストリにタグ付けすることができます。 次のようにコードをコピーします。 docker pull lijingyao0909/see:1.0.3 && docker tag lijingyao0909/see:1.0.3 localhost:5000/see:1.0.3 次に、push コマンドを実行します。 docker push ローカルホスト:5000/see:1.0.3 このイメージはレジストリ サービスにプッシュされます。イメージ データを表示する最も直接的な方法は、この例のデータ ディレクトリなどのローカル ボリューム ディレクトリを表示することです。 次のようにコードをコピーします。 docker run -it -p 8080:8080 --name registry-web --link registry-srv -e REGISTRY_URL=http://registry-srv:5000/v2 -e REGISTRY_NAME=localhost:5000 hyper/docker-registry-web 次に、hostname:5000/registory/index にアクセスして、シンプルな画像リスト UI を確認します。 httpsの問題 ローカル テスト中に上記の手順を実行すると、他の VB でイメージをプッシュまたはプルするときに次の問題が発生する可能性があります。
解決策は、レジストリ認証を変更することです。まず、「/var/lib/boot2docker/profile」を次のように変更します。 sudo vi /var/lib/boot2docker/プロファイル に追加 DOCKER_OPTS="--insecure-registry <ホスト名>:5000" DOCKER_OPTS="--insecure-registry レジストリ:5000" レジストリのホスト名は registry だからです。 docker ifno コマンドを実行すると、次のようになります。 安全でないレジストリ: レジストリ:5000 127.0.0.0/8 同時に、他のワーカー マシンとマネージャー マシンでは、プライベート ライブラリ イメージをプルする前に、–insecure-registry 属性も変更する必要があります。変更後は、vb を再起動する必要があります。 再起動後、マネージャーで再度プルしてみてください docker pull レジストリ:5000/see:1.0.3 リポジトリが正常に接続され、イメージがプルされたことがわかります。この例では、IP アドレスではなく、マシン名とレジストリを使用していることに注意してください。したがって、イメージをプルするときには、各 vb の etc/hosts ファイルで IP とマシン名のマッピングを構成する必要があります。マシン名を使用すると操作を覚えやすくなります。もちろん、最良の方法はドメイン名を通じて倉庫にアクセスすることです。 参考文献 レジストリ サービスをデプロイする オペレーションサービスの作成 Swarm サービス クラスターはレジストリからイメージを直接プルし、アプリケーション サービスを直接開始します。サービス イメージはレジストリに直接保存されますが、ソース コードは ops マシン上で保守できます。先ほど作成した ops virtual-box は、gitlab サービスをデプロイできます。起動パラメータについては、GitLab Dockerイメージのデプロイを参照してください。 まずgitlabイメージをプルする docker run --detach \ --hostname gitlab.lijingyao.com \ --publish 443:443 --publish 80:80 --publish 22:22 \ --name gitlab \ --常に再起動\ --volume `pwd`/gitlab/config:/etc/gitlab \ --volume `pwd` /gitlab/logs:/var/log/gitlab \ --volume `pwd` /gitlab/data:/var/opt/gitlab \ gitlab/gitlab-ce:8.14.4-ce.0 Gitプライベートリポジトリの使用 ポート80がバインドされているため、gitlabを起動してhttp://machine-host/にアクセスします。 初めて gitlab にアクセスすると、自動的にパスワードのリセット画面が表示されます。ルート アカウントのパスワードである新しいパスワードを設定できます。その後、他の git ユーザーを登録して使用することができます。 群れ この例のサービスは、シンプルな Springboot および Gradle プロジェクトです。サービス イメージは Docker Hub から取得できます。サービス イメージを参照してください。イメージをパッケージ化した後、Gradle タスクで直接レジストリ リポジトリにプッシュします。ローカル環境では、プロジェクトディレクトリ内で直接実行できます。次に、Gradle タスクが vb レジストリにプッシュされ、レジストリ リポジトリからイメージをプルできるようになります。これで、Swarm クラスターを初期化する準備が整いました。 現在、vb クラスター全体のマシンは次のようになります。 $ docker-machine ls 名前 アクティブ ドライバー 状態 URL Swarm Docker エラー haproxy - virtualbox tcp://192.168.99.103:2376 v1.12.3 を実行中 manager1 - virtualbox 実行中 tcp://192.168.99.100:2376 v1.12.3 ops - virtualbox tcp://192.168.99.106:2376 v1.12.3 を実行中 レジストリ - virtualbox 実行中 tcp://192.168.99.107:2376 v1.12.3 worker1 - virtualbox 実行中 tcp://192.168.99.101:2376 v1.12.3 worker2 - virtualbox 実行中 tcp://192.168.99.102:2376 v1.12.3 worker3 - virtualbox tcp://192.168.99.105:2376 v1.12.3 を実行中 次に、docker-machine ssh manager1 を使用して manager1 マシンにログインします。 スウォームマネージャーノードを初期化する manager1 マシンで swarm を初期化します。この初期化されたマシンは swarm のマネージャーです。以下を実行します。 docker swarm init --advertise-addr 192.168.99.100 次の実行出力が表示されます。 Swarm が初期化されました: 現在のノード (03x5vnxmk2gc43i0d7xpycvjg) がマネージャーになりました。 この Swarm にワーカーを追加するには、次のコマンドを実行します。 docker swarm 参加 \ --トークン SWMTKN-1-5ru6lyco3upj7oje6hidug3erqczok84wk7bekzfaca4uv51r9-22bcjhkbxnclmw3nl3ui8601l \ 192.168.99.100:2377 この Swarm にマネージャーを追加するには、「docker swarm join-token manager」を実行し、指示に従います。 生成されたトークン値は、他の Swarm クラスター ノードが Swarm 全体に参加するためのキーとなります。トークンを忘れた場合は、manager1 で実行できます。 $docker swarm 参加トークンマネージャー 現在のトークン値を表示します。公式の推奨では、以下のトークンを少なくとも 6 か月ごとに交換することが推奨されています。コマンドを置き換えます: $docker swarm join-token --ワーカーをローテーションする ワーカーノードの追加 それぞれworker1、worker2、worker3にログインし、joinコマンドを実行します。 参加する前に、Docker ネットワーク設備を確認してください。埋め込む $ dockerネットワークls ネットワーク ID 名前 ドライバー スコープ 4b7fe1416322 ブリッジ ブリッジ ローカル 06ab6f3352b0 ホスト ホスト ローカル eebd5c8e0d5d なし null ローカル manager1 が初期化された後のコマンドに従って、以下を実行します。 docker swarm 参加 \ --トークン SWMTKN-1-5ru6lyco3upj7oje6hidug3erqczok84wk7bekzfaca4uv51r9-22bcjhkbxnclmw3nl3ui8601l \ 192.168.99.100:2377 この時点で、任意のワーカーノードで docker network ls を実行すると、カバレッジ範囲が swarm である追加のオーバーレイ ネットワーク チャネルがあることがわかります。 3人のワーカー全員が参加した後、マネージャーのノードステータスはmanager1で確認できます。 ドッカーノードls ID ホスト名 ステータス 可用性 マネージャ ステータス 03x5vnxmk2gc43i0d7xpycvjg * manager1 準備完了アクティブリーダー 2y5wrndibe8c8sqv6851vrlgp ワーカー1 準備完了 アクティブ アクセス可能 dwgol1uinkpsybigc1gm5jgsv ワーカー2 準備完了 アクティブ etgyky6zztrapucm59yx33tg1 ワーカー3 準備完了 アクティブ アクセス可能 マネージャー ステータスの「到達可能」ステータスは、ノードがマネージャー ノードでもあることを示します。これは、worker1 と worker3 でそれぞれ次の操作を実行したためです。 docker ノードのワーカー1の昇格 docker ノードのワーカー3の昇格 この時点で、worker1 と worker3 も swarm コマンドを実行できます。manager1 がシャットダウンされると、そのうちの 1 つが新しいリーダーとして選出されます。ノードのマネージャー ステータスを削除する場合は、demote コマンドを使用して削除できます。実行後、ワーカーノードは通常のタスクノードになります。 docker ノード ワーカー1 をワーカー3 に降格する スウォームノードのその他の状態 スウォーム ノードはドレイン状態に設定できます。ドレイン状態のノードはサービスを実行しません。 ノードを使用不可に設定します。 docker ノード更新 --availability ドレイン ワーカー1 状態には、一時停止、ドレイン、アクティブの 3 つがあります。一時停止は、タスクが実行中で、新しいタスクが受け入れられないことを示します。 Swarm センターから worker1 ノードを削除する場合は、削除するノード (worker1) に対して docker swarm leave を実行し、次にマネージャー上で docker node rm worker1 を実行して Swarm ノードを削除します。 スウォームサービスの作成 この例では、Swarm を使用して Springboot ベースの REST API サービスをデプロイします。ウェアハウスのアドレスは springboot-restful-exam です。作成されたサービス名は deftsee で、ポート 80 にバインドされ、実行中の 4 つのコンテナ サービスを拡張します。 dockerサービス作成\ --レプリカ 4 \ --name 定義 \ --更新遅延 10 秒 \ --publish 8080:80 \ lijingyao0909/参照:1.0.3 サービスが作成されると、サービスノードのステータスを表示できます。 docker@manager1:~$ dockerサービスls ID 名前 レプリカ イメージ コマンド a6s5dpsyz7st deftsee 4/4 lijingyao0909/see:1.0.3 REPLICAS は、サービスの実行中のコンテナの数を表します。 0/4 の場合は、すべてのサービスが開始されていないことを意味します。各ノードの実行状態を詳細に表示するには、docker service ps servicenameを使用します。 docker@manager1:~$ docker サービス ps deftsee ID 名前 画像 ノード 望ましい状態 現在の状態 エラー 8lsdkf357lk0nmdeqk7bi33mp deftsee.1 lijingyao0909/see:1.0.3 worker2 実行中 実行中 5 分前 cvqm5xn7t0bveo4btfjsm04jp deftsee.2 lijingyao0909/see:1.0.3 manager1 実行中 実行中 7分前 6s5km76w2vxmt0j4zgzi4xi5f deftsee.3 lijingyao0909/see:1.0.3 worker1 実行中 実行中 5分前 4cl9vnkssedpvu2wtzu6rtgxl deftsee.4 lijingyao0909/see:1.0.3 worker3 実行中 実行中 6 分前 タスクが 4 つのタスク ノード間で均等に分割されて実行されていることがわかります。次に、deftseeサービスを拡大します docker@manager1:~$ docker サービススケール deftsee=6 deftsee を 6 にスケール docker@manager1:~$ docker サービス ps deftsee ID 名前 画像 ノード 望ましい状態 現在の状態 エラー 8lsdkf357lk0nmdeqk7bi33mp deftsee.1 lijingyao0909/see:1.0.3 worker2 実行中 実行中 8 分前 cvqm5xn7t0bveo4btfjsm04jp deftsee.2 lijingyao0909/see:1.0.3 manager1 実行中 実行中 10分前 6s5km76w2vxmt0j4zgzi4xi5f deftsee.3 lijingyao0909/see:1.0.3 worker1 実行中 実行中 8 分前 4cl9vnkssedpvu2wtzu6rtgxl deftsee.4 lijingyao0909/see:1.0.3 worker3 実行中 実行中 9 分前 71uv51uwvso4l340xfkbacp2i deftsee.5 lijingyao0909/see:1.0.3 manager1 実行中 実行中 5秒前 4r2q7q782ab9fp49mdriq0ssk deftsee.6 lijingyao0909/see:1.0.3 worker2 実行中 5秒前に実行中 lijingyao0909/see:1.0.3 は dockerhub のパブリック ウェアハウスのミラーです。サービスの作成時にミラーが pull されます。全体的な速度が遅いため、プライベート ウェアハウスと組み合わせて、レジストリ マシンで直接ミラーを pull することもできます。 docker service rm deftsee を使用してサービスを直接削除し、レジストリを通じて再構築することができます。 dockerサービス作成\ --レプリカ 6 \ --name 定義 \ --更新遅延 10 秒 \ --publish 8080:80 \ レジストリ:5000/参照:1.0.4 この時点で、任意のワーカー サービスにログインし、実行中のコンテナ イメージを表示します。 docker@ワーカー2:~$ docker ps コンテナID イメージ コマンド 作成ステータス ポート名 89d4f588290b registry:5000/see:1.0.4 "/bin/sh -c 'java -Dc" 約 1 分前 起動 約 1 分 8080/tcp deftsee.1.eldpgb1aqtf9v49cxolydfjm9 サービスを更新する場合は、update コマンドを通じて直接バージョンを更新することができ、サービスはローリング方式でリリースされます。 *–update-delay 10s * を設定することで、更新中の各ノードの遅延時間を変更できます。 docker サービス更新 --image レジストリ:5000/see:1.0.5 deftsee ノードサービスを再起動する シャットダウン: docker node update –availability drain worker1 開く: docker node update –availability active worker1 サービスポートの更新 サービスのポートを更新すると、サービスが再起動されます (元のサービスをシャットダウンし、サービスを再作成して起動します)。 docker サービスの更新 \ --publish-add <公開ポート>:<ターゲットポート> \ <サービス> docker@manager1:~$ dockerサービスアップデート\ --publish-add 8099:8080 \ デフトシー docker@manager1:~$ docker サービス ps deftsee ID 名前 画像 ノード 望ましい状態 現在の状態 エラー 3xoe34msrht9eqv7eplnmlrz5 deftsee.1 registry:5000/see:1.0.4 manager1 実行中 実行中 39 秒前 eldpgb1aqtf9v49cxolydfjm9 \_ deftsee.1 registry:5000/see:1.0.4 worker2 シャットダウン シャットダウン 39 秒前 9u4fh3mi5kxb14y6gih5d8tqv deftsee.2 registry:5000/see:1.0.4 manager1 実行中 約 1 分前に実行中 0skgr5fx4xtt6y71yliksoft0 \_ deftsee.2 registry:5000/see:1.0.4 worker1 シャットダウン 約 1 分前にシャットダウンしました 8hposdkqe92k7am084z6kt1j0 deftsee.3 registry:5000/see:1.0.4 worker3 実行中 約 1 分前に実行中 c5vhx1wx0q8mxaweaq0mia6n7 \_ deftsee.3 registry:5000/see:1.0.4 manager1 シャットダウン シャットダウン 約 1 分前 9se1juxiinmetuaccgkjc3rr2 deftsee.4 registry:5000/see:1.0.4 worker1 実行中 約 1 分前に実行中 4wofho0axvrjildxhckl52s41 \_ deftsee.4 registry:5000/see:1.0.4 worker3 シャットダウン シャットダウン 約 1 分前 サービス認証とネットワーク 例のサービスが開始されると、ip:port を介して直接アクセスできるようになります。たとえば、http://192.168.99.100:8099/ を見ると、サービス要求が実行中の各ノードに分散されることがわかります。これが Swarm のオーバーレイ ネットワーク層です。各ノードのネットワークは相互接続されています。Swarm は負荷分散を行います。Swarm の LB に基づいて、独自のオーバーレイ ネットワークを構築することもできます。作成されたオーバーレイ ネットワーク内のすべてのノードは、このネットワークと通信できます。ただし、サービスを作成するときにネットワーク オプションを指定する必要があります。 $dockerネットワークを作成\ --ドライバーオーバーレイ \ --サブネット 10.0.9.0/24 \ --opt 暗号化 \ 私のネットワーク $ docker サービス作成 \ --name 定義 \ --公開 8099:80 \ --レプリカ 4 \ --network 私のネットワーク \ -l com.df.serviceDomain=deftsee.com \ -l com.df.notify=true \ lijingyao0909/参照:1.0.3 –network my-network は、サービスが接続できる Docker ネットワークを指定します。Swarm ノードに my-network という名前のネットワークを作成できます。そのため、consul や haproxy のサービス検出や LB の仕組みを swarm の仕組みの中に構築することも可能です。 サービスにネットワークが指定されている場合、サービスと通信するには、swarm 上で実行されるタスクもこの指定されたネットワーク上にある必要があります。ノードがスウォーム モード ノードに追加されていない場合、または指定されたネットワーク上で実行およびマウントされていない場合、このネットワークと通信しません。Docker network ls はネットワークを検出しません。サービスを作成するときは、--network my-network タグを使用してこのネットワークにリンクします。ネットワークを表示するときは、docker network inspect my-network を使用して、返されたコンテナーにリストされているノードのマウントされたコンテナーを表示できます。 ネットワーク サービスが作成されます。サービスがネットワークに接続されると、swarm はこのネットワーク下のサービスに VIP を割り当てます。swarm 内の lb は自動的にサービスを配布します。各サービス ポートを指定する必要はありません。つまり、同じネットワークに接続されたコンテナーは、サービス名を通じてサービスにアクセスできます。このネットワークに追加されたすべてのコンテナーは、ゴシップ プロトコルを介して DNS マッピングを共有するためです (vip マッピングは、サービス名にバインドされた DNS エイリアス マッピングに基づいています)。 サービスの VIP ネットワーク情報を表示します。 $ dockerサービス検査\ --format='{{json .Endpoint.VirtualIPs}}' \ デフトシー 出力: [{"NetworkID":"dn05pshfagohpebgonkhj5kxi","Addr":"10.255.0.6/16"}] 群れの管理 マネージャ ノードの可用性 (ハートビート メカニズム、リーダー選出) を維持するために、マネージャ ノードがサービス操作を受け入れないように設定し、マネージャ ノードのリソースを節約し、マネージャ ノードをタスク環境から分離することができます。 docker node update --availability ドレイン <NODE> /var/lib/docker/swarm/raft ステータスをバックアップする 利用できないノードをクリーンアップする docker node demote <NODE> docker node rm <id-node>。 ノードがマネージャーに再参加する $docker node は <NODE> を降格します。 $docker node rm <NODE>. $ docker swarm に参加... 初期化中に固定 IP アドレスを指定します (init –advertise-addr)。ワーカーノードは動的 IP を使用できます。 参考文献 スウォームモード 以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: InnoDB ロック (レコード、ギャップ、Next-Key ロック) の詳細な説明
<a href="https://www.jb51.net/" title...
序文最近、仕事の都合で、APP ショッピングカートの注文支払いに取り組んでいました。テスト中にバグが...
目次MySQL で現在の時刻を表現するにはどうすればよいでしょうか?結論は確認するピットMySQL ...
1: スループット(1秒あたりのリクエスト数)サーバーの同時処理能力を定量的に表したもので、reqs...
1. デフォルトのポート8080に加えて、ドメイン名のアクセスとserver.xmlのオープンにポー...
目次Docker イメージ鏡とは何ですか? Dockerイメージの読み込み原理コミットミラーDock...
目次最初のステップはMySQLをダウンロードすることですステップ2: ダウンロードした圧縮パッケージ...
コンポーネントの props (props はオブジェクトです)機能: コンポーネントに渡されたデー...
チェックボックスやラジオボタンの使用を含むコードをコピーコードは次のとおりです。 <!DOCT...
1. CentOS Linuxにffmpegをインストールする1.ダウンロードして解凍する http...
目次1. 背景2. 操作手順3. Portinerをインストールする3.1 Dockerのデプロイメ...
システム管理者は複数のサーバーを同時に管理する場合があり、これらのサーバーは異なる場所に配置されてい...
GROUP BY 構文を使用すると、指定されたデータ列の各メンバーに従ってクエリ結果をグループ化して...
この記事の例では、記事の折りたたみと展開の機能を実現するためのjQueryの具体的なコードを参考まで...
--ホームページのバックアップ1.txtテキスト2. 画像をスキャンする3. PSDデザイン原画(A...