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

推薦する

ボタントリガーイベントを使用して背景色の点滅効果を実現します

背景色の点滅効果を実現するには、次のコードを <body> 領域に追加するだけです。コー...

Linux ユーザー スクリプトの作成/推測ゲーム/ネットワーク カード トラフィック監視の紹介

目次1. ユーザーが作成したスクリプト2. 単語当てゲーム3. ネットワークカードのトラフィック監視...

MySQL データベースの最適化に関する 9 つのヒント

目次1. 最も適切なフィールド属性を選択する2. フィールドをNOT NULLに設定してみる3. サ...

Zabbix で Windows のパフォーマンスを監視する方法

背景情報最近、Windows パフォーマンスに関する本を読み直しています。以前は SCOM 監視を使...

Vueの最初のプログラムを書くための勉強ノート

目次1. HTMLを書く、最初のVueプログラムビューテンプレートとデータに注意してください決定ルー...

Nginxは特定のページへのIPアクセスを制限します

1.すべてのIPアドレスが3つのページa1.htm、a2.htm、a3.htmにアクセスするのを禁止...

Windows 10 に TomCat をインストールするチュートリアル図

WindowsにTomCatをインストールするこの記事では、WindowsプラットフォームにTomC...

JavaScript でシンプルなクリスマス ゲームを実装する

目次序文成果を達成するコードCSSコードJSコードHTMLコードデモンストレーションのプロセス序文ク...

CSS3 アニメーション ボールローリング JS コントロールアニメーション一時停止

CSS3 はアニメーションを作成でき、多くの Web ページのアニメーション画像、Flash アニメ...

JavaScript の new 演算子を自分で実装する方法

目次コンストラクタ新しいオペレーター自分で新しいものを実装するコンストラクタnew を導入する前に、...

ネイティブJSで実装されたギャラリー機能

目次最初2番目Native Js はギャラリー機能を実装します。画像をクリックすると、対応する拡大画...

CSSスタイルとセレクターの使い方

HTML で CSS を使用する 3 つの方法: 1. インラインスタイル: 要素のスタイル属性を通...

Linux で MySQL 8.0 バージョンをアンインストールする方法

1. MySQLをシャットダウンする [root@localhost /]# サービスmysqldを...

ウェブデザインレイアウトの理解

<br />矛盾が生じます。私たちのような小さな工房では、デザインとレイアウトは基本的に...

ティックアニメーション効果を作成するための svg+css または js

以前、上司からログイン後にチェックマークを表示できるプログラムを作るように言われたのですが、Baid...