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

推薦する

HTML に基づいてページを更新せずにフォーム送信を実装する

ページを更新せずにフォーム送信を実装するために Ajax を使用することは、プロジェクトでよく使用さ...

冗長カーネルを削除するLinuxディープインの実装方法

前の記事では、deepin linux に新しいカーネルを手動でインストールする方法について説明しま...

Docker 経由で Redis 6.x クラスターをデプロイする方法

システム環境: Redis バージョン: 6.0.8 Docker バージョン: 19.03.12シ...

Docker-compose を使用して Django アプリケーションをオフラインでデプロイする方法

目次開発環境用のDocker-ceをインストールする開発環境用のDocker-composeをインス...

React Router V6 のアップデート

目次ReactRouterV6 の変更1. <Switch> が <Routes&...

Nginx リバース プロキシを使用してクロスドメイン問題を解決する方法の詳細な説明

質問前回のクロスドメイン リソース共有に関する記事では、ドメイン間で Cookie を送信する場合、...

UCenter ホームサイトに統計コードを追加

UCenter Homeは、ComsenzがリリースしたSNSサイト構築システムです。最新バージョン...

テキストエリアタグはサイズ変更できず、マウスでドラッグすることもできません

テキストエリアタグのサイズは不変ですコードをコピーコードは次のとおりです。 <textarea...

iframe に関するいくつかの発見と考察

この物語は、今日の予期せぬ発見から始まります。同社には複数のウェブサイトがある。友達リンクにはお互い...

Mysqlの同時パラメータ調整の詳細な説明

目次クエリキャッシュの最適化概要クエリプロセスクエリキャッシュ構成クエリキャッシュの無効化メモリ管理...

Node はあいまい検索用の検索ボックスを実装します

この記事の例では、検索ボックスでファジークエリを実装するためのNodeの具体的なコードを参考までに共...

Vueは、商品の数を制御するためのコンポーネントのパッケージ化と使用を実装します。

Vueのコントロール商品数量コンポーネントのカプセル化と使用は参考までに。具体的な内容は以下のとお...

Mac OS10.12 に mysql5.7.18 をインストールするチュートリアル

ウェブ全体を検索して、さまざまな落とし穴を見つけましたが、問題は解決しませんでした。ついに自分でも分...

CentOS7 カーネル カーネル5.0 バージョンアップグレード

アップグレードプロセス:元のシステム: CentOS7.3 [root@my-e450 ~]# un...

MySQLにおけるACIDトランザクションの実装原理の詳細な説明

導入いつものように、シーンから始めましょう〜インタビュアー:「トランザクションの4つの特性をご存知で...