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 クエリの最適化: クエリが遅い原因と解決策

推薦する

MySQL で自動インクリメントシーケンスを実装するためのサンプルコード

1. シーケンステーブルを作成する テーブル `sequence` を作成します ( `name` ...

Webデザイン: タイトルが完全に表示できない場合

<br />今日、新しくなった ChinaUI.com の Web サイトを見たのですが...

要素のフォームコンポーネントに関する注意事項

要素フォームとコード表示詳細はエレメントフォーム公式サイトをご覧ください構造と機能の分析紹介とソース...

type="file" の入力ボックスのスタイル変更の概要

入力タイプ「file」とは何ですか?これが何なのかは説明する必要はないと思います。誰もが知っているこ...

この記事では、CSSのようなJSモジュールをインポートする方法を説明します。

目次序文構築可能なスタイルシートとは何ですか? CSSモジュールスクリプトの使用インポートアサーショ...

MySQL における引用符とバックティックの違いと使い方の詳細な説明

序文そこでこのブログを書きました。このブログでは大物の記事からいくつかの知識も推奨しています。侵害が...

ローカルで起動したときに Vue プロジェクトがクッキーを保持できない問題を解決する

vueプロジェクトをパッケージ化してサーバーにデプロイし、正常にログインできるが、ローカルで起動する...

シンプルなアコーディオン効果を実現するjs

この記事では、アコーディオン効果を実現するためのjsの具体的なコードを参考までに共有します。具体的な...

Mysqlのインポートとエクスポート時に発生する問題の解決

背景すべての業務を Docker の運用管理に移行してから、一連の落とし穴に遭遇しましたが、今回は ...

SQLシリアル番号取得コード例

この記事は主にSQLシリアル番号取得コード例を紹介します。記事ではサンプルコードを詳細に紹介しており...

Vue.js アプリケーションのパフォーマンス最適化分析 + ソリューション

目次1. はじめに2. Vue JS のパフォーマンス最適化が必要な理由は何ですか? 3. Vueの...

WeChatアプレットはふるいを振る効果を実現

この記事では、WeChatアプレットの具体的なコードを参考までに共有します。具体的な内容は次のとおり...

CentOS7 環境で gcc (バージョン 10.2.0) をアップグレードする詳細な手順

目次簡単な紹介1. 現在のgccバージョンを確認する2. gccインストールパッケージ(バージョン1...

Nginx 仮想ホスト (IP ベース) を構成する 3 つの方法の詳細な説明

Nginx は、IP ベースの仮想ホスト構成、ポート ベースの仮想ホスト構成、ドメイン名ベースの仮想...

MySQLの大規模テーブル最適化ソリューションについての簡単な説明

背景Alibaba Cloud RDS for MySQL(MySQL バージョン 5.7)データベ...