Dockerコンテナ間のホスト間通信 - オーバーレイベースの実装方法

Dockerコンテナ間のホスト間通信 - オーバーレイベースの実装方法

オーバーレイネットワーク分析

組み込みのホスト間ネットワーク通信は、常に Docker の待望の機能でした。バージョン 1.9 より前には、Macvlan、Pipework、Flannel、Weave など、この問題を解決しようとするサードパーティのツールや方法がコミュニティにすでにたくさんありました。

これらのソリューションは実装の詳細において多くの違いがありますが、その考え方はレイヤー2 VLANネットワークとオーバーレイネットワークの2つのタイプに分けられます。

簡単に言えば、ホスト間通信を解決するためのレイヤー 2 VLAN ネットワークの考え方は、元のネットワーク アーキテクチャを大規模な相互接続されたレイヤー 2 ネットワークに変換し、特定のネットワーク デバイスを介して直接ルーティングし、コンテナー間のポイントツーポイント通信を実現することです。このソリューションは、伝送効率の点でオーバーレイ ネットワークよりも優れていますが、いくつかの固有の問題もあります。

この方法は、レイヤー 2 ネットワーク デバイスからのサポートを必要とし、後者ほど汎用性や柔軟性がありません。

スイッチで使用できる VLAN の数は通常 4,000 程度であるため、コンテナ クラスターの規模が制限され、パブリック クラウドや大規模なプライベート クラウドの導入要件を満たすにはほど遠いものになります。大規模なデータ センターに VLAN を導入すると、VLAN のブロードキャスト データがデータ センター全体に溢れ、大量のネットワーク帯域幅が消費され、メンテナンスが困難になります。

対照的に、オーバーレイ ネットワークとは、既存のネットワーク インフラストラクチャを変更することなく、特定の合意された通信プロトコルを介して IP メッセージの上にレイヤー 2 メッセージをカプセル化する新しいデータ形式を指します。これにより、成熟した IP ルーティング プロトコル プロセスのデータ配信が最大限に活用されるだけでなく、オーバーレイ テクノロジーの拡張分離識別ビットを使用して 4000 の VLAN 制限を突破し、最大 1600 万人のユーザーをサポートし、必要に応じてブロードキャスト トラフィックをマルチキャスト トラフィックに変換して、ブロードキャスト データのフラッディングを回避できます。

したがって、オーバーレイ ネットワークは、実際には現在最も主流のコンテナ クロス ノード データ転送およびルーティング ソリューションです。

コンテナが 2 つのホスト間で通信する場合、オーバーレイ ネットワーク モードを使用して通信を行います。ホストを使用する場合は、物理 IP アドレスを直接使用してホスト間通信を実現することもできます。オーバーレイは、IP アドレス 10.0.2.3 などの仮想ネットワークを作成します。このオーバーレイ ネットワーク モードでは、サービス ゲートウェイと同様のアドレスがあり、パケットは物理サーバーのアドレスに転送され、ルーティングとスイッチングを通じて最終的に別のサーバーの IP アドレスに到達します。

1.png

環境の紹介

ホスト名ipシステムバージョン
cdh1 10.30.10.111セントロス7
cdh2 10.30.10.112セントロス7

Consul インストール構成

オーバーレイ ネットワークを実装するには、サービス検出が必要です。たとえば、consul は 10.0.2.0/24 などの IP アドレス プールを定義します。そこにはコンテナがあり、コンテナの IP アドレスはそこから取得されます。取得が完了するとens33を介して通信が行われるため、ホスト間の通信が可能になります。

ここに画像の説明を挿入

Consul は docker を通じて cdh1 にデプロイされます。まず、cdh1 の docker 設定を変更して再起動する必要があります。

[root@cdh1 /]# vim /etc/docker/daemon.json
//次の設定を追加します "live-restore": true
[root@cdh1 /]# systemctl dockerを再起動します

"live-restore": true この構成により、Docker デーモンが停止または再起動された場合でもコンテナの実行を継続できます。

cdh1にconsulイメージをダウンロードして起動します

[root@cdh1 /]# docker pull コンスル
[root@cdh1 /]# docker run -d -p 8500:8500 -h consul --name consul consul

cdh1のdocker設定を変更して再起動します

[root@cdh1 /]# vim /etc/docker/daemon.json
# 「cluster-store」を構成するには、次の 2 行を追加します: 「consul://10.30.10.111:8500」
"クラスターアドバタイズ": "10.30.10.111:2375"
[root@cdh1 /]# systemctl dockerを再起動します

cdh2のdocker設定を変更して再起動します

[root@cdh2 /]# vim /etc/docker/daemon.json
# 「cluster-store」を構成するには、次の 2 行を追加します: 「consul://10.30.10.111:8500」
"クラスターアドバタイズ": "10.30.10.112:2375"
[root@cdh2 /]# systemctl dockerを再起動します

cluster-store は consul サービスのアドレスを指定します。consul サービスは cdh1 のポート 8500 で実行されるため、両方のマシンの cluster-store 値はconsul://10.30.10.111:8500 になります。
cluster-advertiseはローカルマシンとconsul間の通信ポートを指定するため、ローカルマシンのポート2375として指定されます。

この時点で、http://10.30.10.111:8500/ から consul アドレスにアクセスできます。Key /Valueメニューの docker-nodes ディレクトリには、2 つの docker ノード cdh1 と cdh2 が表示されており、consul が正常に構成されていることがわかります。

ここに画像の説明を挿入

オーバーレイネットワークの作成

この時点でオーバーレイ ネットワークを作成できます。まず、ノードに現在あるネットワーク タイプを確認します。

[root@cdh1 /]# docker ネットワーク ls
ネットワーク ID 名前 ドライバー スコープ
ab0f335423a1 ブリッジ ブリッジ ローカル
b12e70a8c4e3 ホスト ホスト ローカル
0dd357f3ecae なし null ローカル

次に、cdh1 の docker ノードにオーバーレイ ネットワークを作成します。consul サービス検出が正常に実行されており、cdh1 と cdh2 の docker サービスがすでに接続されているため、オーバーレイ ネットワークはグローバルに作成され、どのホストでも 1 回作成できます。

[root@cdh1 /]# docker network create -d overlay my_overlay
cafa97c5cf9d30dd6cef08a5e9710074c828cea3fdd72edb45315fb4b1bfd84c
[root@cdh1 /]# docker ネットワーク ls
ネットワーク ID 名前 ドライバー スコープ
ab0f335423a1 ブリッジ ブリッジ ローカル
b12e70a8c4e3 ホスト ホスト ローカル
cafa97c5cf9d my_overlay オーバーレイ グローバル
0dd357f3ecae なし null ローカル

この時点で、作成されたオーバーレイ ネットワークが golbal としてマークされていることがわかります。 cdh2 ネットワークを確認すると、オーバーレイ ネットワークも作成されていることがわかります。

[root@cdh2 ~]# docker ネットワーク ls
ネットワーク ID 名前 ドライバー スコープ
90d99658ee8f ブリッジ ブリッジ ローカル
19f844200737 ホスト ホスト ローカル
cafa97c5cf9d my_overlay オーバーレイ グローバル
3986fe51b271 なし null ローカル

ネットワークテスト

作成が完了したら、cdh1 と cdh2 でオーバーレイ ネットワークを指定して Docker コンテナを作成し、ホスト間で通信できるかどうかをテストできます。

cdh1にmasterという名前のコンテナを作成し、そのIPを表示します。

[root@cdh1 /]# docker run -itd -h マスター --name マスター --network my_overlay centos7_update /bin/bash
[root@cdh1 /]# docker examine -f "{{ .NetworkSettings.Networks.my_overlay.IPAddress}}" マスター
10.0.0.2

cdh1にslaverというコンテナを作成し、そのIPを表示します。

[root@cdh2 ~]# docker run -itd -h slaver --name slaver --network my_overlay centos7_update /bin/bash
[root@cdh2 ~]# docker examine -f "{{ .NetworkSettings.Networks.my_overlay.IPAddress}}" スレーブ
10.0.0.3

このとき、2 つのコンテナに入り、お互いの IP を ping して通信が成功するかどうかを確認します。

[root@cdh1 ~]# docker exec -it マスター /bin/bash
[root@master /]# 10.0.0.3 にpingする
PING 10.0.0.3 (10.0.0.3) 56(84) バイトのデータ。
10.0.0.3 からの 64 バイト: icmp_seq=1 ttl=64 time=0.587 ms
10.0.0.3 からの 64 バイト: icmp_seq=2 ttl=64 time=0.511 ms
10.0.0.3 からの 64 バイト: icmp_seq=3 ttl=64 time=0.431 ms
10.0.0.3 からの 64 バイト: icmp_seq=4 ttl=64 time=0.551 ms
10.0.0.3 からの 64 バイト: icmp_seq=5 ttl=64 time=0.424 ms
^C
--- 10.0.0.3 ping 統計 ---
送信パケット 5 個、受信パケット 5 個、パケット損失 0%、時間 4000 ミリ秒
rtt 最小/平均/最大/平均偏差 = 0.424/0.500/0.587/0.070 ミリ秒
[root@cdh2 ~]# docker exec -it slaver /bin/bash
[root@slaver /]# 10.0.0.2にpingする
PING 10.0.0.2 (10.0.0.2) 56(84) バイトのデータ。
10.0.0.2 からの 64 バイト: icmp_seq=1 ttl=64 time=0.499 ms
10.0.0.2 からの 64 バイト: icmp_seq=2 ttl=64 time=0.500 ms
10.0.0.2 からの 64 バイト: icmp_seq=3 ttl=64 time=0.410 ms
10.0.0.2 からの 64 バイト: icmp_seq=4 ttl=64 time=0.370 ms
^C
--- 10.0.0.2 ping 統計 ---
4 パケット送信、4 パケット受信、パケット損失 0%、時間 3000 ミリ秒
rtt 最小/平均/最大/平均偏差 = 0.370/0.444/0.500/0.062 ミリ秒

コミュニケーション成功!

これで、docker コンテナ間のホスト間通信 - オーバーレイベースの実装方法についての記事は終了です。docker コンテナ間のホスト間通信に関する詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Docker のホスト間コンテナ通信オーバーレイ実装プロセスの詳細な説明
  • Docker クリーニングキラー/Docker オーバーレイ ファイルがディスク領域を大量に占有する
  • Docker クロスホストネットワーク (オーバーレイ) の実装
  • Dockerオーバーレイネットワークの構築方法
  • Dockerオーバーレイはホスト間のコンテナ相互通信を実現します

<<:  検証コードケースのJavaScript実装

>>:  MySQL クエリの最適化: クエリが遅い原因と解決策

推薦する

jQueryはキャンバスタグを使用して検証コードを描画します

<canvas> 要素は、クライアント側のベクター グラフィックス用に設計されています。...

docker runとstartの違い

docker における実行と開始の違いDocker run はミラーイメージを指定します。そしてdo...

Win10 インストール Linux システム チュートリアル ダイアグラム

Windows システムに仮想マシンをインストールするには、 VMware Workstationソ...

マウスがカード上に移動したときにフローティング効果を実現する CSS の使用例

原理ホバーしたときに要素に影を設定します: box-shadow で、通常とは異なるスタイルにします...

Vueの自己ネストツリーコンポーネントの使い方の詳細な説明

この記事では、Vueの自己ネストツリーコンポーネントの使い方を参考までに紹介します。具体的な内容は次...

フロントエンドJavaScriptの動作原理

目次1. JavaScript エンジンとは何ですか? 2. V8エンジン3. ランタイム環境4. ...

Vuex はシンプルなショッピングカート機能を実装します

この記事の例では、ショッピングカート機能を実装するためのvuexの具体的なコードを参考までに共有して...

MySQL5.6.17データベースをインストールするときにMy.iniファイルを構成する方法

最近、プロジェクトの開発時に MySql データベースを使用しました。MySql に関する記事をいく...

HTML 内の CSS および JS リンクのバージョン番号 (キャッシュを更新)

背景検索エンジンで「.htaccess キャッシュ」というキーワードを検索すると、ウェブサイトのファ...

MySQLでテーブル名を変更する方法と注意すべき点

目次1. テーブル名を変更する方法2. 注記要約: 1. テーブル名を変更する方法RENAME TA...

英語の単語の出現頻度を数えるtrコマンドの魔法

置換を削除したり文字列を削除したりできる tr コマンドは、誰もがよく知っています。 英語では、英語...

伝説的な VUE 構文シュガーは何をするのでしょうか?

目次1. 糖衣構文とは何ですか? 2. VUE の構文糖とは何ですか? 1. 最も一般的な構文シュガ...

テーブル切り替えのための JavaScript プラグインのカプセル化

この記事では、テーブル切り替えプラグインを実装するためのJavaScriptのカプセル化コードを参考...

おすすめの無料英語手書きフォント20選

Jellyka Beesアンティーク手書き [ank]* ジェリーカ・カティカップケーキ LHF ジ...