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クエリの仕組み

推薦する

mybatis-plusページングパラメータが渡された後、SQLのwhere条件にはページング情報操作の制限がありません

2時間近くかけて、さまざまな方法を試しました。後で、whereでフィルタリングした後のデータ量が1ペ...

XHTMLはHTMLのいくつかの廃止された要素を使用しなくなりました

CSS ウェブページレイアウトを行う場合、XHTML1.0 仕様に準拠する必要があることは誰もが知っ...

フレックスレイアウトの互換性の問題の概要

1. W3C バージョンの flex 2009年版フラグ: display: box; または bo...

左右の幅を固定し、中央の幅を適応させたHTMLレイアウトのソリューションの詳細な説明

この記事では、次のように、誰にでも共有できる左右幅固定のミドルアダプティブ HTML レイアウトソリ...

Pycharmとsshリモートアクセスサーバーdockerの詳細なチュートリアル

背景: 一部の実験はサーバー上で完了する必要があります。したがって、リモート サーバー上のコードをロ...

Linux の一般的なコマンド chmod を使用して、ファイルの権限 777 と 754 を変更します。

よく使用されるコマンドは次のとおりです。 chmod 777 文件或目錄例: chmod 777 /...

Nest.js 認証検証方法の例

目次0x0 はじめに0x1 RBAC 実装0x2 クレームベースの承認0x3 統合 CASL 0x4...

リアクトルーティングガード(ルーティングインターセプション)の実装

React は Vue とは異なります。ルートにメタ文字を設定することでルートインターセプションを実...

Ubuntu 16.04 mysql5.7.17 リモートポート 3306 を開く

MySQLへのリモートアクセスを有効にするデフォルトでは、MySQL ユーザーにはリモート アクセス...

Nginx の負荷分散と動的および静的分離の原理と構成

目次1. Nginxは負荷分散の原則を実装する2. Nginxの動的および静的分離の原則Nginx ...

Docker インストール Nginx チュートリアル 実装図

Nginx をインストールして試してみましょう。画像はクラスであり、コンテナはオブジェクトであること...

MySQLでSELECT文が実行される仕組み

目次1. マクロの観点からMySQLを分析する2. SQL ステートメントを実行するには、どの程度の...

Vueのキャッシュ方法の例の詳細な説明

最近、「フロントエンドキャッシュ」という新しい要件が作成されました要件背景: フォームへの高頻度の繰...

JS を使用した簡単な雪効果の例の詳細な説明

目次序文主な実装コードHTMLコードJSコード序文南の友達の多くは、雪をほとんど見たことがない、ある...

MySQLのスイッチングデータ保存ディレクトリの実装方法

MySQLのスイッチングデータ保存ディレクトリの実装方法今日、仕事中に、mysql が保存されている...