Dockerコンテナはルーティングを介して直接通信し、ネットワーク通信を実現します。

Dockerコンテナはルーティングを介して直接通信し、ネットワーク通信を実現します。

概要

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

現時点で、2 つのホスト上の Docker コンテナはどのようにして IP アドレスを介して直接通信できるのでしょうか?

思いつく解決策の 1 つは、それぞれのホストにルートを追加して、2 つの Centos コンテナ間の直接通信を可能にすることです。

スキーム原則の分析

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

構成は次のとおりです。

• ホスト1のIPアドレスは192.168.18.162です
• ホスト2のIPアドレスは192.168.18.141です
• ホスト 1 上の Docker コンテナに割り当てられたサブネット: 192.168.100.0/24
• ホスト 2 上の Docker コンテナに割り当てられたサブネット: 192.168.200.0/24

この構成の後、2 つのホスト上の Docker コンテナは同じ IP アドレスを使用しないため、IP の競合が回避されます。

次に、2 つのルーティング ルールを定義します。

• 宛先アドレスが192.168.100.0/24であるすべてのパケットはホスト1に転送されます。
• 宛先アドレスが192.168.200.0/24であるすべてのパケットはホスト2に転送されます。

要約すると、2 つのコンテナー間のデータ パケット転送プロセスは次のようになります。

• コンテナ 1 からコンテナ 2 に送信されたデータ パケットは、まずコンテナ 1 の「ゲートウェイ」docker0 に送信され、次にホスト 1 のルートを調べることで、データ パケットをホスト 2 に送信する必要があることがわかります。データ パケットがホスト 2 に到着すると、ホスト 2 の docker0 に転送され、最終的にコンテナ 2 に転送されます。逆の原理は同じであり、繰り返されません。

これが私たちの考えです。実際に実行してみて、実現可能かどうか確認してみましょう。

実際のテスト

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

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

{ "bip":"192.168.100.252/24" }

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

{ "bip":"192.168.200.252/24" }

• 2. dockerサービスを再起動する

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

systemctl dockerを再起動します

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

次のようにホスト 1 にルーティング ルールを追加します。

ルート追加 -net 192.168.200.0 ネットマスク 255.255.255.0 GW 192.168.18.141

次のようにホスト 2 にルーティング ルールを追加します。

ルート追加 -net 192.168.100.0 ネットマスク 255.255.255.0 GW 192.168.18.162

• 4. iptablesルールを設定する

ホスト 1 に次のルールを追加します。

iptables -t nat -F ポストルーティング
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 ! -d 192.168.0.0/16 -j マスカレード

ホスト 2 に次のルールを追加します。

iptables -t nat -F ポストルーティング
iptables -t nat -A POSTROUTING -s 192.168.200.0/24 ! -d 192.168.0.0/16 -j マスカレード

• 5. コンテナを起動する

ホスト 1 で Centos コンテナを起動します。

docker run -it --name コンテナ1 centos /bin/bash

ホスト 2 で Centos コンテナを起動します。

docker run -it --name コンテナ2 centos /bin/bash

• 両方のマシンに ifconfig をインストールし、次のコマンドを使用してコンテナの IP アドレスを確認します。

[root@695ba390d221 /]# yum 検索 ifconfig
[root@695ba390d221 /]# yum install net-tools.x86_64

ホスト 1 上のコンテナ IP アドレス:


ホスト 2 上のコンテナ IP:

• 6. コンテナ間の直接通信

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

ホスト 1 に ping を実行します。

ホスト2へのping:

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。これについてもっと知りたい場合は、次のリンクをご覧ください。

以下もご興味があるかもしれません:
  • TLS暗号化通信を使用してDockerにリモート接続する詳細な例
  • 安全な構成のためにDockerでTLSを有効にする手順
  • Dockerのセキュリティについて Docker-TLS暗号化通信の問題

<<:  JS でオブジェクトが空オブジェクトかどうかを判断する 5 つの方法

>>:  MySQL 5.7.19 インストールディレクトリに my.ini ファイルを作成する方法

推薦する

MySQL での IN データボリュームの使用の最適化された記録

MySQL のバージョン番号は 5.7.28 です。テーブル A には 390 万件のレコードがあり...

MySQLインデックスの詳細な分析

序文インデックスの選択はオプティマイザ段階の作業であることはわかっていますが、オプティマイザは万能で...

InnoDB のアーキテクチャと機能の詳細な説明 (InnoDB ストレージ エンジンの読書メモの要約)

背景スレッド•マスタースレッドコア バックグラウンド スレッドは主に、バッファー プール データをデ...

mysql replace into の使用法の詳細な説明

replace ステートメントは、一般的に insert ステートメントに似ています。ただし、テーブ...

CentOS インストール mysql5.7 詳細チュートリアル

この記事では、参考までに、centOSにmysql5.7をインストールする詳細な手順を紹介します。具...

VMware 仮想マシンでの CentOS7 ネットワーク構成 (ホストのワイヤレス インターネット アクセス)

CentOS7 システムを使用するのは今回が初めてで、ネットワーク構成を行う際に多くの問題が発生し...

vue3 における vuex と pinia の落とし穴

目次導入インストールと使用方法文章の相違点と類似点の簡単な比較VuexとPiniaの長所と短所Pin...

MySQLの詳細な説明Explain

日常業務では、実行に時間のかかる SQL ステートメントを記録するために、スロー クエリを実行するこ...

VMware 仮想マシンのネットワークの問題の解決方法

目次1. 問題の説明2. 問題解決1. 仮想マシンシステムのインストール時にネットワークがない場合2...

CSS3でハートを描く

成果を達成する要件/機能: CSS + HTML を使用してハートを描く方法。分析:正方形と 2 つ...

2つのシンプルなメニューナビゲーションバーの例

メニューバーの例 1: コードをコピーコードは次のとおりです。 <!DOCTYPE html ...

コマンドを使用してMySQLデータベース(de1)を作成する方法

1. MYSQLに接続するフォーマット: mysql -h ホストアドレス -u ユーザー名 -p ...

Vue3はサイドナビゲーションテキストスケルトン効果コンポーネントをカプセル化します

Vue3プロジェクトのカプセル化サイドナビゲーションテキストスケルトン効果コンポーネント-グローバル...

検証コード干渉を実装する js (静的)

この記事では、検証コード干渉を実装するためのjsの具体的なコードを参考までに共有します。具体的な内容...

Linuxでディスクをマウントする方法

仮想マシンを使用しているときに、ディスク容量が不足し、継続使用するためにディスクをマウントする必要が...