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

推薦する

Ember.js と Vue.js の詳細な比較

目次概要フレームワークを選択する理由は何ですか? js のエンバーEmber.js と Vue.js...

Vueはローカルストレージの追加、削除、変更機能を実装します

この記事では、ローカルストレージの追加、削除、変更を実装するためのVueの具体的なコードを例として紹...

JavaScript で charAt() を使用して、最も頻繁に出現する文字とその出現回数をカウントする方法を教えます。

前回は、JavaScript の charAt() メソッドの使い方を紹介しました。今日は、最も多く...

Web 開発 js 文字列連結プレースホルダーと conlose オブジェクト API の詳細な説明

目次プレースホルダーの置き換えコンソール印刷テーブル()ログ、情報、警告、エラーグループ()、グルー...

パフォーマンス負荷診断にMySQLシステムデータベースを使用する方法

ある達人がかつて、自分の妻のことを知るのと同じくらい、自分が管理するデータベースのことを知るべきだと...

bodyタグの主な属性の概要

bgcolor="テキストの色" background="背景画像&q...

レスポンシブ原則をシミュレートするための基礎コードの Vue 実装の例

目次1.Vue.js の機能: 2.Observer.js 関数 (データハイジャック): 3. C...

マウス追従ゲームを実現するjs

この記事では、マウス追従ゲームを実装するためのjsの具体的なコードを参考までに共有します。具体的な内...

デザイン理論: デザインにおける階層

<br />原文: http://andymao.com/andy/post/80.ht...

HTML 5のドラフトは正式な標準にはならなかった

<br />昨日、W3C で新しいHTML 5 ドラフト (ワーキング ドラフト) が ...

Youdaの新しいプチビューの実装

目次序文導入ライブ使いやすいルートスコープマウント要素の指定ライフサイクルコンポーネントグローバル状...

Docker で Node.js をデプロイする方法

序文プロジェクトでは中間層としてNodeを使用し、Nodeのデプロイにはdockerを使用します。こ...

Nest.js パラメータ検証とカスタム戻りデータ形式の詳細な説明

0x0 パラメータ検証Nest.jsでは、パラメータ検証業務のほとんどをパイプライン方式で実装してい...

マルチポートおよびマルチドメイン名アクセスのNginx構成の実装

サーバーに複数のサイトを展開するには、異なるサイトにアクセスするために複数のポートを開く必要がありま...

CSS スティッキーレイアウトを使用してヘッダーを上部に配置する方法

適用シナリオ:新しい要件の 1 つはアンケート調査を行うことですが、必然的に多くの質問が含まれ、1 ...