Dockerコンテナのホスト間通信におけるダイレクトルーティングの詳細な説明

Dockerコンテナのホスト間通信におけるダイレクトルーティングの詳細な説明

概要

Docker 自体の現在のデフォルト ネットワークについては、単一ホスト上の異なる Docker コンテナは docker0 ブリッジの助けを借りて直接通信できますが、これは問題ありません。ただし、異なるホスト上の Docker コンテナは、ホスト上のポートをマッピングすることによってのみ通信できます。この方法は不便な場合があり、要件を満たさないこともあります。したがって、異なる物理マシン上の Docker コンテナは、独自の IP アドレスを使用して直接通信する必要があります。さらに、異なる物理ホスト上で Docker コンテナを起動すると、必然的に Docker コンテナのホスト間通信の問題が発生します。この記事で試してみましょう。

スキーム原則の分析

コンテナの IP はルーティングに使用されるため、異なるホスト上のコンテナが同じ IP を使用することは避ける必要があります。このためには、異なるホストに異なるサブネットを割り当てる必要があります。そこで、2 つのコンテナ間の通信のためのルーティング ソリューションを構築します。

環境の紹介:

ホスト1のIPアドレスは192.168.145.128です。
ホスト2のIPアドレスは192.168.145.129です。
ホスト 1 上の Docker コンテナに割り当てられたサブネット: 172.17.1.0/24
ホスト 2 上の Docker コンテナに割り当てられたサブネット: 172.17.2.0/24
この構成の後、2 つのホスト上の Docker コンテナは同じ IP アドレスを使用しないため、IP の競合が回避されます。

要約すると、2 つのコンテナー間のデータ パケット転送プロセスは次のようになります。
コンテナ 1 からコンテナ 2 に送信されたデータ パケットは、まずコンテナ 1 の「ゲートウェイ」docker0 に送信され、次にホスト 1 のルートを調べると、データ パケットをホスト 2 に送信する必要があることがわかります。データ パケットがホスト 2 に到着すると、ホスト 2 の docker0 に転送され、最後に docker0 によってコンテナ 2 に転送されます。逆の原理も同じなので、ここでは繰り返しません。

1. ホスト1とホスト2でそれぞれdocker0を設定します。

ホスト 1 の /etc/docker/daemon.json ファイルを編集し、次の内容を追加します: "bip" : "ip/netmask"
{ "bip", "172.17.1.252/24" }

ホスト 2 の /etc/docker/daemon.json ファイルを編集し、次の内容を追加します: "bip" : "ip/netmask"
{ "bip", "172.17.2.252/24" }

docker サービスを再起動します。変更した docker0 ネットワーク セグメントを有効にするために、ホスト 1 とホスト 2 の両方で次のコマンドを実行して docker サービスを再起動します。systemctl restart docker

2. ルーティングルールを追加する

次のようにホスト 1 にルーティング ルールを追加します。
ルート追加 -net 172.17.2.0 ネットマスク 255.255.255.0 GW 192.168.145.129

次のようにホスト 2 にルーティング ルールを追加します。
ルート追加 -net 172.17.1.0 ネットマスク 255.255.255.0 GW 192.168.145.128

3. iptablesルールを設定する

ホスト 1 に次のルールを追加します。
iptables -t nat -F ポストルーティング
iptables -t nat -A POSTROUTING -s 172.17.1.0/24 ! -d 172.17.0.0/16 -j マスカレード

ホスト 2 に次のルールを追加します。
iptables -t nat -F ポストルーティング
iptables -t nat -A POSTROUTING -s 172.17.2.0/24 ! -d 172.17.0.0/16 -j マスカレード

4. コンテナを起動する

ホスト 1 で Centos コンテナを起動します。
docker run -it --name コンテナ1 centos /bin/bash

ホスト 2 で Centos コンテナを起動します。
docker run -it --name コンテナ2 centos /bin/bash

これで、2 つのコンテナが相互に ping できるようになりました。

5. ルートの永続性(ホストの再起動時にルートが失われるのを防ぐため)

root@rancher:~# vi /etc/rc.local

ルーティング情報を追加します。終了する前に必ず書き込んでください。 ! ! :
ルート追加 -net 172.17.2.0 ネットマスク 255.255.255.0 GW 192.168.102.88

以上がDockerコンテナのホスト間通信に関する知識のすべてです。123WORDPRESS.COMをご活用いただき、ありがとうございます。

以下もご興味があるかもしれません:
  • Dockerコンテナがホスト間で通信する方法の詳細な説明
  • Dockerにおけるオーバーレイネットワークの詳細な説明
  • Docker クロスホストネットワーク (オーバーレイ) の実装
  • Docker コンテナのホスト間通信 - オーバーレイ ネットワーク

<<:  Vue-Routerのインストールと使用方法の詳細な説明

>>:  データベースSQL SELECTクエリの仕組み

推薦する

ウェブデザインのためのロイヤルブルーのカラーマッチング入門

古典的な色の組み合わせは力と権威を伝え、強いロイヤルブルーはあらゆる古典的な色の組み合わせの中心的な...

CSS でショートカット プロパティを記述する際は、トラブルの順序に注意してください (落とし穴を避けるため)

ショートハンドプロパティは、複数のプロパティに同時に値を割り当てるために使用されます。たとえば、fo...

CSS で隠し要素を実現する 7 つの興味深い方法

序文非表示要素の 3 つの属性である表示、可視性、不透明度の類似点と相違点は、フロントエンドの就職面...

MySQL トランザクション分離レベルと MVCC の詳細な説明

目次トランザクション分離レベル同時トランザクション実行中に発生した問題SQL標準の4つの分離レベルM...

Tomcat サーバーが tomcat7w.exe を開けない場合の解決策

今日、Tomcat サーバーの設定時にちょっとした問題が発生したので、参考までにいくつかご説明したい...

ElementUI の el-dropdown に複数のパラメータを実装する方法

最近、業務上のボタンの増加により、ページレイアウトにボタンが多すぎて、ページが美しくなく、ユーザーエ...

初心者向けのHTMLタグネストルールの詳細なまとめ

最近、HTML を再度学習しており、これは HTML に対する新たな理解と言えます。これを過小評価し...

XHTML 入門チュートリアル: よく使われる XHTML タグ

<br />記事と同様に、Web ページにも明確な段落と重要度の異なるタイトルが必要です...

nginxとバックエンドポート間の競合の解決策

質問: Alice 管理システムを開発しているときに、すべてのバックエンド インターフェイスが最初の...

CentOS のクローン作成、Linux 仮想マシンの共有の完全な手順

序文Linux が完全にセットアップされると、クローン機能を使用して短時間で複数の Linux を作...

MySQLデータベースを別のマシンに移行する方法の詳細な説明

1. まず、移行サーバー上のデータ ファイルを見つけます。MySQL 5.7 とデフォルトのインスト...

CSS3 で @media を使用して Web ページの適応を実現するためのサンプル コード

現在、コンピュータモニターの画面解像度はますます高くなる傾向にありますが、携帯電話などのモバイルデバ...

JavaScript ES6 分割演算子の理解と応用

目次序文脱構築記号の役割使い方分割割り当ての適用アプリケーションの簡単な紹介JSONデータを抽出する...

スマートCSSを使用して、ユーザーのスクロール位置に基づいてスタイルを適用します。

現在のスクロール オフセットを html 要素の属性に追加することで、現在のスクロール位置に基づいて...

MySQLデータベースを使い始めるための最初のステップはテーブルを作成することです

データベースを作成する右クリック - 新しいデータベースを作成ライブラリ名を入力し、文字セットと並べ...