シナリオ会社のマイクロサービスがオンライン化しようとしています。マイクロサービスは Docker コンテナを使用してデプロイされます。同じホストに、すべてのサービスがデプロイされています。Nacos に登録されている IP と PORT は、Dockerfile で定義されたイントラネット IP とポート番号です。問題はないようです。ゲートウェイ経由で呼び出すこともできます。大きな前提があることに注意してください。 すべてのサービス コンテナーは同じホストにデプロイする必要があります。 サービス インスタンスが同じホストに展開されていない場合、たとえば、ゲートウェイ サービスがサーバー A にあり、サービス a がサーバー B にあり、両方とも Nacos (または他の登録センター) に登録されている場合、報告される IP アドレスはすべてイントラネットからのものです。外部からの要求が届くと、ゲートウェイは Nacos のサービス リストからサービス a の対応するイントラネット IP アドレスを見つけますが、呼び出しは失敗します。 ps: イントラネットはどのように接続できるのでしょうか... タスクマイクロサービスコンテナは異なるサーバー上に存在し、相互に呼び出すことができる アイデア
分析する以下は、上記の「アイデア」セクションに従って問題を説明するものです。 1. 公式ドキュメントと Github を確認した結果、2 つの解決策が見つかりました。
2. Dockerのホストネットワークモードを使用すると、今回報告されたIPは確かにホストIPですが、ポート番号が間違っていることがわかります... Javaパラメータを使用して、シェルを介してマップされるポート番号を渡すと、理論的には可能です。唯一の欠点は、 3. マッピングされたポート番号は取得できますが、ホストのネットワーク カード名が異なり、ハードコードされた後は柔軟性がありません。一部が 4. 成熟したDockerコンテナネットワークを介して共有しますが、パフォーマンスの低下は多少あります - 完全に利用可能です コンセプトと選択最も信頼性の高い方法は、Docker ネットワーク共有を使用することです。検索エンジンの助けを借りて、オーバーレイを使用して効果を実現することにしました。 Overlay の簡単な説明は次のとおりです。
オーバーレイ ネットワークを実装するには、ネットワーク、エンドポイント、IP などのネットワーク ステータス情報を保存する KV データベースを導入する必要があります。 Consul、Etcd、ZooKeeperはすべてDockerでサポートされているKVデータベースです。 ここではConsulを使用しています。他のKVデータベースと比較して、Consulが提供するインターフェースは管理に便利なので、ここではOverlayを実装するためにConsulを使用しています。 各サーバーの Docker デーモンが独自の IP アドレスを Consul に登録することで、Docker イントラネットを共有できます。ここで共有されるイントラネットはオーバーレイ ネットワーク モードです。登録された Docker 環境内で同じオーバーレイ ネットワークを使用しているコンテナのみが相互に通信できます。 ps: 作成後、オーバーレイネットワークを使用しないクロスサーバーコンテナはpingできません ちょっとしたテストシングルノード Consul は Docker イメージを使用してオーバーレイ ネットワークを実装します 環境説明 |
サーバーOS | ホストIP | Dockerバージョン | ネットワークカード名 |
---|---|---|---|
Ubuntu サーバー 18.04 LTS | 192.168.87.133 | 18.09.6 | ens33 |
Ubuntu サーバー 18.04 LTS | 192.168.87.139 | 18.09.7 | ens33 |
このテスト環境はSystemdで管理されるLinuxディストリビューションに適しています
Consul は非公式の progrium/consul を使用しませんでした。主な理由は、このイメージが古すぎるためです。4 年前に脆弱性があった場合、間に合うように修正できなかったため、<hub.docker.com> にアクセスして、公式の落とし穴をすべて調査しました。 💔
Dockerを実行する各ホストは異なるホスト名を持つ必要があります。
$ sudo hostnamectl set-hostname 新しいホスト名
同じホスト名の場合、同じ名前のホストDockerは相互に通信できなくなります。
イメージを使用して133サーバー上でConsulを起動できるように準備します。まず、Dockerデーモンの起動パラメータを133サーバーを指すように構成します。
サーバー133と139のdocker.serviceをそれぞれ変更します。
$ ifconfig #干渉するネットワーク カードは削除され、ネットワーク カードの名前は ens33 です ens33: flags=4163<UP、BROADCAST、RUNNING、MULTICAST> mtu 1500 inet 192.168.87.133 ネットマスク 255.255.255.0 ブロードキャスト 192.168.87.255 inet6 fe80::20c:29ff:fe02:e00a プレフィックス長 64 スコープID 0x20<リンク> ether 00:0c:29:02:e0:0a txqueuelen 1000 (イーサネット) RXパケット 156739 バイト 233182466 (233.1 MB) RXエラー 0 ドロップ 0 オーバーラン 0 フレーム 0 TX パケット 45173 バイト 2809606 (2.8 MB) TXエラー 0 ドロップ 0 オーバーラン 0 キャリア 0 衝突 0 $ vim /etc/docker/daemon.json
保存して終了します。
cluster-store
: 設定された Consul のリーダー アドレス。単一のユニットは直接書き込むことができます。他のソフトウェアはプロトコルに注意する必要があります。cluster-advertise
: リスニングネットワークカードとポートを指定し、サブスクリプションメッセージを受信するためのIP:PORTも指定します。別の方法としては、次に示すように、docker.service を直接変更します。
$ cd /etc/systemd/system/multi-user.target.wants $ sudo vim docker.service
ExecStart=
という単語を見つけて、この行の末尾に次のコードを追加します。
--cluster-store=consul://192.168.87.133:8500 --cluster-advertise=ens33:2375
効果は以下のとおりです。
操作効果は上記の方法と一致している
次にコマンドを実行してdockerサービスを再起動します。他のサーバーの操作方法も同様です。ネットワークカードの名前に注意してください。
$ sudo systemctl daemon-reload && sudo systemctl dockerを再起動します
133サーバーでConsulサービスを開始する
docker run -d --network ホスト -h consul --name=consul --restart=always -e CONSUL_BIND_INTERFACE=ens33 consul:1.5.2
ホストモードを使用する理由は、一部のポートがマップされないのを防ぐためです。Consulに外部ネットワークカードを認識させる唯一の方法はホストモードです。以下は非ホスト方式です。
$ docker run -di -h consul -p 8500:8500 --name=consul consul:1.5.2
Dockerオーバーレイ共有ネットワークを作成する
$ docker ネットワーク作成 -d オーバーレイ my_overlay
通常のネットワークを作成する場合との違いは、オーバーレイモードネットワークが指定されていることです。 -d
--driver
と書くこともできます。
Consulのページにアクセスしてください。私の場合は192.168.87.133:8500
です。
設定はキー/値で行います。
docker -> ノードをクリック
上記の2つのノードは、2つのdockerデーモンによって登録された値です。
先ほど作成したオーバーレイネットワークを使用して、2つのサーバーに2つの新しい Centos コンテナを作成します。
133 サーバー
$ docker run -di --network my_overlay --name mycentos1 centos:7
139 台のサーバー
$ docker run -di --network my_overlay --name mycentos2 centos:7
--net
は--network
と表記されます。 --
で始まるものは省略できます=
133サーバー上のmycentos1コンテナのIPを表示する
$ docker 検査 -f "{{ .NetworkSettings.Networks.my_overlay.IPAddress}}" mycentos1 10.0.1.2
139サーバー上のmycentos2コンテナのIPを表示する
$ docker 検査 -f "{{ .NetworkSettings.Networks.my_overlay.IPAddress}}" mycentos2 10.0.1.3
サーバー133からサーバー139のmycentos2のイントラネットIPにそれぞれpingを実行します。
Pingは逆の場合と同じですが、外部からアクセスすることはできず、同じオーバーレイネットワーク上のコンテナを介してアクセスします。信じられない場合は、次のように試してみましょう。
133 サーバー
$ docker exec -it mycentos1 bash # 10.0.1.3にpingする
アクセスは成功し、パケット損失はなく、逆も同様です。スペースが限られているため、テストは行いません。
これは、少なくとも現在のサービスが実際に相互接続されていることを示しています。次の記事では、本番環境向けのクラスタリング方法を開発します。
テクニカルトーク | Docker オーバーレイ ネットワークの実装
Dockerコンテナオーバーレイネットワーク
Docker クロスホスト ネットワーク - オーバーレイ
22 日目: Docker ネットワークの紹介 (パート 3)
領事KV
Docker ハブ 領事
Github docker-library/ドキュメント
Github ドッカーコンスル
この記事はHellxzによる学習・実践記事です。BubukouやMamiなどのサードパーティのクローラーWebサイトのクロールは禁止されています。
これで、Docker クロスサーバー通信オーバーレイ ソリューション (パート 1) - Consul 単一インスタンスに関するこの記事は終了です。関連する Docker オーバーレイ ネットワーク コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。
>>: CSSは6つの適応型2列レイアウト方法を実装しています
今日、私はクラスメートが問題を解決するのを手伝いました - Tomcat の起動が非常に遅く、約 5...
この記事では、例を使用して、MySQL トリガーの追加、削除、変更、およびクエリ操作について説明しま...
必要: docker を使用して nginx + tomcat デュアル プロセスを起動します。実際...
0. 以下のテストに関連する表を準備する関連するテーブル作成ステートメントについては、https:/...
これ以上時間を無駄にせず、早速本題に入りましょう。 1. ロゴに代替テキストを追加するこれには 2 ...
これは主に、場所パラメータのif判断の設定ジャンプです。迂回により、サーバーの負荷と圧力を軽減できま...
目次序文ホットチェンジとはCocos Hot アップデートの概要マニフェストプロジェクトリソースとゲ...
CentOS システムで MySQL データベース ディレクトリの場所を変更する方法1. まず、My...
CentOS8 に最小限のデプロイメントで OpenStack Ussuri をインストールするため...
MySQL には、「group_concat」という関数があります。通常の使用では問題がないかもしれ...
メインライブラリの構成1. MySQLを設定する vim /etc/my.cn # ファイルに次の内...
1. 行の形式は何ですか? MySQL の行形式の設定は次のように表示されます。 実際、MySQL ...
この記事では、Vueを使用して虫眼鏡付きの検索ボックスを実装する方法を紹介します。具体的な内容は次の...
序文これらの原則は実際の戦闘から要約されています。あらゆる原則の背後には血なまぐさい教訓があるこれら...
3回の暗記により、大量の資材の正確な場所と目的を記憶でき、その使いやすさが向上します。 これは単なる...