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 ファイルを作成する方法

推薦する

TypeScript を使用して Vue3 で axios をカプセル化する詳細な例

この axios パッケージは、vue3 デモで使用されます。便宜上、element-plus は ...

HTML コメント HTML 内のテキストコメントをマークするための記号

HTML コメント。コードの横に HTML コメントを付ける必要があることがよくあります。そうするこ...

ウェブ標準学習リソースの素晴らしいコレクション

これらの仕様は、下位互換性のあるドキュメントを Web 上で公開し、できるだけ幅広いユーザーがアクセ...

win2008R2 64 ビット システムでの mysql5.7.17 のインストールと構成の例

123WORDPRESS.COM では、さまざまな環境での MYSQL の他のバージョンのインストー...

見落としがちなMySQLのCOLLATIONの例の詳細な説明

序文MySQL データベースの文字列型は、CHAR、VARCHAR、BINARY、BLOB、TEXT...

JS 日付コントロール My97DatePicker の基本的な使い方

My97DatePicker は非常に柔軟で使いやすい日付コントロールです。使い方はとても簡単です。...

Chrome タブバーを実装するための CSS のヒント

今回は、Google Chrome のタブバーのような、特殊な丸い角を持つナビゲーション バーのレイ...

Vue echarts は水平棒グラフを実現します

この記事では、水平棒グラフを実現するためのvue echartsの具体的なコードを参考までに共有しま...

GolangでMySQLデータベースを操作するための実装コード

序文Golang は、SQL データベースにアクセスするための database/sql パッケージ...

DockerでLinuxシェルコマンドを実行する方法

Docker でシェル コマンドを実行するには、コマンドの前に sh -c を追加する必要があります...

HTML+CSSを使用してTG-visionホームページを作成する方法

今回はHTML+CSSレイアウトを使用して、TG-vision Shuanghui Mediaのホー...

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

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

MySQL データベースのパフォーマンス最適化の概要

目次なぜ最適化するのですか? ?どこから始めますか? ?解決策は何ですか? ? ?どうやって選ぶ? ...

MySQL MyISAM と InnoDB の違い

違い: 1. InnoDB はトランザクションをサポートしていますが、MyISAM はサポートしてい...

Mac で docker と kubectl の自動補完コマンドを追加する方法

kubectl の紹介kubectl は、k8s クラスターを操作するためのコマンドライン ツールで...