Dockerはホスト間のネットワーク通信を実現するためにMacvlanを導入する

Dockerはホスト間のネットワーク通信を実現するためにMacvlanを導入する

基本的な概念:

Macvlanの動作原理:

Macvlan は、Linux カーネルでサポートされているネットワーク インターフェイスです。必要な Linux ビルドは v3.9~3.19 および 4.0+ です。物理ネットワーク カードに Macvlan サブインターフェイスを作成することにより、物理ネットワーク カードは複数の独立した MAC アドレスと IP アドレスを持つことができます。仮想化されたサブインターフェースは、隣接する物理ネットワークに直接公開されます。外から見ると、ネットワーク ケーブルは複数のストランドに分割され、それぞれ異なるホストに接続されているように見えます。物理ネットワーク カードはパケットを受信すると、受信したパケットの宛先 MAC アドレスに基づいて、パケットを仮想ネットワーク カードに渡す必要があるかどうかを判断します。

コンテナを物理ネットワークに直接接続する必要がある場合は、Macvlan を使用できます。 Macvlan 自体はネットワークを作成しません。本質的には、まずホストの物理ネットワーク カードを「プロミスキャス モード」で動作させ、物理ネットワーク カードの MAC アドレスを無効にして、物理ネットワーク カードがレイヤー 2 ネットワーク内のすべてのトラフィックを受信できるようにします。次のステップは、この物理ネットワーク カード上に仮想ネットワーク カードを作成し、仮想ネットワーク カードに MAC アドレスを割り当てて、1 枚のカードを複数回使用できるようにすることです。物理ネットワークの観点から見ると、各仮想ネットワーク カードは個別のインターフェイスです。

Macvlan を使用する場合は、次の点に注意する必要があります。
  • コンテナは、IP アドレスの割り当てを担当する物理ネットワークに直接接続されます。これにより、物理ネットワークの IP アドレスが枯渇する可能性があります。もう 1 つの結果は、ネットワーク パフォーマンスの問題です。物理ネットワークに接続されるホストが増えると、ブロードキャスト パケットの割合が急速に増加し、ネットワーク パフォーマンスが低下します。
  • ホスト上のネットワークは「プロミスキャス モード」で動作する必要があります。
  • 前述の通り、プロミスキャスモードで動作する物理ネットワークカードの MAC アドレスは無効になります。そのため、このモードで動作するコンテナは外部ネットワークと通信できませんが、ホストと外部ネットワーク間の通信には影響しません。
  • 長期的には、仮想ネットワークは物理ネットワークから共有されるのではなく分離される必要があるため、ブリッジ ネットワークとオーバーレイ ネットワークの方が適しています。

プロジェクト環境:

2 つの Docker ホスト: (centos7)
docker01: 172.16.1.30
docker02: 172.16.1.31

プロジェクト運営:

例 1: macvlan クロスホスト単一ネットワークソリューション:

ドッカー01:

(1)ens33ネットワークカードのプロミスキャスモードを有効にし、ネットワークカードの複数の仮想インターフェースを有効にします。

[root@sqm-docker01 ~]# ip link set ens33 promisc on
##ネットワーク カードの状態を確認します。
[root@sqm-docker01 ~]# ipリンクshow ens33 

(2)macvlanネットワークを作成する:

[root@sqm-docker01 ~]# docker network create -d macvlan --subnet 172.16.100.0/24 --gateway 172.16.100.1 -o parent=ens33 mac_net1

パラメータの説明:
-o: どのネットワーク カードにバインドするか (ens33 ネットワーク カードに基づく)

(3)作成したネットワークに基づいてコンテナを実行します。

[root@sqm-docker01 ~]# docker run -itd --name box1 --ip 172.16.100.10 --network mac_net1 busybox

docker02: (docker01と同じ操作)

プロミスキャスモードを有効にする [root@sqm-docker02 ~]# ip link set ens33 promisc on
[root@sqm-docker02 ~]# ipリンクshow ens33 

// macvlan ネットワークを作成する [root@sqm-docker02 ~]# docker network create -d macvlan --subnet 172.16.100.0/24 --gateway 172.16.100.1 -o parent=ens33 mac_net1
//コンテナを実行します:
[root@sqm-docker02 ~]# docker run -itd --name box2 --network mac_net1 --ip 172.16.100.20 busybox

(4)2つのホスト上の2つのコンテナが相互に通信できることをテストします。

注記:

ping が成功する理由は、両方のコンテナーが実際の ens33 ネットワーク カードに基づいているため、ホスト上の ens33 ネットワーク カードが相互に通信できる必要があるためです。この方法では IP アドレスのみを ping できますが、コンテナ名を ping することはできません。

例 2: macvlan クロスホスト マルチネットワーク ソリューション:

(1)まずホストカーネルの8021qモジュールを確認します。

[root@sqm-docker01 ~]# modinfo 8021q 

##モジュールが表示されない場合は、次のコマンドを実行してロードする必要があります。
[root@sqm-docker01 ~]# modprobe 8021q
ルーティング転送を有効にする:
[root@sqm-docker01 ~]# echo "net.ipv4.ip_forward = 1" > /etc/sysctl.conf 
[root@sqm-docker01 ~]# sysctl -p
ネット.ipv4.ip_forward = 1

(2)ネットワーク構成情報を変更する:

ドッカー01:

[root@sqm-docker01 ~]# cd /etc/sysconfig/network-scripts/
[root@sqm-docker01 ネットワークスクリプト]# ls 


[root@sqm-docker01 ネットワークスクリプト]# vim ifcfg-ens33 

ens33 ネットワーク カードに基づいてサブネット カードを作成します。

[root@sqm-docker01 network-scripts]# cp -p ifcfg-ens33 ifcfg-ens33.10 #ネットワークカード名をカスタマイズ [root@sqm-docker01 network-scripts]# cp -p ifcfg-ens33 ifcfg-ens33.20

-p: 元の属性(権限)を保持することを意味します

//ens33.10 ネットワーク カードを変更します。
[root@sqm-docker01 ネットワークスクリプト]# vim ifcfg-ens33.10
##次のオプションのみを保持します。 

//ens33.20 ネットワーク カードを変更します。
[root@sqm-docker01 ネットワークスクリプト]# vim ifcfg-ens33.20 
設定は ens33.10 と同じですが、IP アドレスのみを変更する必要があります。 

(3)サブネットカードを起動する。

[root@sqm-docker01 ネットワークスクリプト]# ifup ifcfg-ens33.10 
[root@sqm-docker01 ネットワークスクリプト]# ifup ifcfg-ens33.20
//ネットワーク情報を表示 [root@sqm-docker01 network-scripts]# ifconfig 

(4)ens33.10とens33.20に基づいてmacvlanネットワークを作成します。

注: ネットワークセグメントによってネットワーク名が異なります

[root@sqm-docker01 ~]# docker network create -d macvlan --subnet 172.16.200.0/24 --gateway 172.16.200.1 -o parent=ens33.10 mac_net10

[root@sqm-docker01 ~]# docker network create -d macvlan --subnet 172.16.210.0/24 --gateway 172.16.210.1 -o parent=ens33.20 mac_net20

(5)上記のネットワークに基づいて2つのコンテナを実行する。

[root@sqm-docker01 ~]# docker run -itd --name test1 --ip 172.16.200.10 --network mac_net10 busybox

[root@sqm-docker01 ~]# docker run -itd --name test2 --ip 172.16.210.10 --network mac_net20 busybox

docker02をデプロイします。

操作は基本的にdocker01と同じです。ネットワークセグメントは同じですが、ホストIPが異なることに注意してください。

#以下の操作については説明しません。

ルーティング転送を有効にする:
[root@sqm-docker01 ~]# echo "net.ipv4.ip_forward = 1" > /etc/sysctl.conf 
[root@sqm-docker01 ~]# sysctl -p
ネット.ipv4.ip_forward = 1
[root@sqm-docker02 ネットワークスクリプト]# pwd
/etc/sysconfig/ネットワークスクリプト
[root@sqm-docker02 ネットワークスクリプト]# vim ifcfg-ens33 

[root@sqm-docker02 ネットワークスクリプト]# cp -p ifcfg-ens33 ifcfg-ens33.10
[root@sqm-docker02 ネットワークスクリプト]# cp -p ifcfg-ens33 ifcfg-ens33.20
[root@sqm-docker02 ネットワークスクリプト]# vim ifcfg-ens33.10 


[root@sqm-docker02 ネットワークスクリプト]# vim ifcfg-ens33.20 

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

 [root@sqm-docker02 network-scripts]# ifup ifcfg-ens33.10 [root@sqm-docker02 network-scripts]# ifup ifcfg-ens33.20
 //創建macvlan網絡:[root@sqm-docker02 ~]# docker network create -d macvlan --subnet 172.16.200.0/24 --gateway 172.16.200.1 -o parent=ens33.10 mac_net10[root@sqm-docker02 ~]# docker network create -d macvlan --subnet 172.16.210.0/24 --gateway 172.16.210.1 -o parent=ens33.20 mac_net20
 //運行容器(ip地址不同):[root@sqm-docker02 ~]# docker run -itd --name test3 --network mac_net10 --ip 172.16.200.11 busybox[root@sqm-docker02 ~]# docker run -itd --name test4 --network mac_net20 --ip 172.16.210.11 busybox

//確保容器正常運行:

(6)コンテナがホスト間で通信できることをテストします。(注:VMwareを使用している場合は、VMware仮想マシンによる正常な通信を可能にするために、2つのホストのデフォルトのNATモードをブリッジモードに変更する必要があります)
Test3 は test1 (同じネットワーク セグメント) と通信します。

Test4 は test2 (同じネットワーク セグメント) と通信します。

トラブルシューティングのアイデア: デプロイ後にホストが通信できない場合は、まずファイアウォールまたは iptables ルールが閉じられているか解放されているか、selinux が無効になっているかどうかを確認し、次に ens33 ネットワーク カード構成ファイルとそのサブネット カードの内容が誤って変更されていないかどうかを確認します。最後に、macvlan ネットワークを作成するときにネットワーク セグメント定義が間違っていないか、またはコンテナーを実行するときに IP アドレスが間違って指定されていないかどうかを確認します。

----------------------Macvlan マルチネットワーク ホスト間通信の展開が完了しました---------------------

拡張知識ポイント:
t1 コンテナを実行し、t2 コンテナが t1 コンテナのネットワーク スタックを使用するとします。

 [root@sqm-docker03 ~]# docker run -itd --name t1 busybox[root@sqm-docker03 ~]# docker exec t1 ip a

[root@sqm-docker03 ~]# docker run -it --name t2 --network container:t1 busybox

 //接下來在t1容器中操作:[root@sqm-docker03 ~]# docker exec -it t1 bin/sh


次に、t2 コンテナでこのサービスも確認できます。

上記はネットワークスタックをデプロイする基本的な内容です。あまり使用しません。1つのコンテナ内のリソースを他のコンテナと共有できるようにするだけです。

以下もご興味があるかもしれません:
  • Dockerはmacvlanをベースにホスト間コンテナ通信を実装する
  • Docker のホスト間コンテナ通信オーバーレイ実装プロセスの詳細な説明
  • Docker クロスホストネットワーク (オーバーレイ) の実装
  • Docker クロスホストネットワークの実装 (手動)
  • Dockerコンテナのホスト間通信におけるダイレクトルーティングの詳細な説明
  • Docker 学習ノート: Weave がホスト間のコンテナ相互接続を実現
  • Dockerコンテナがホスト間で通信する方法の詳細な説明
  • Dockerコンテナのホスト間マルチネットワークセグメント通信ソリューションの詳細説明

<<:  MySQL Limitパフォーマンス最適化とページングデータパフォーマンス最適化の詳細な説明

>>:  React はモバイル端末を構築するために antd-mobile+postcss を導入しました

推薦する

JS を使用して HTML で回転するクリスマスツリーを実装する

<!DOCTYPE ヘムル パブリック> <html> <ヘッド&g...

フロントエンドの面接の質問の最も包括的なコレクション

HTML+CSS 1. WEB 標準と W3C の理解と知識<br /> タグを閉じ、小...

mysql ビュー関数の分析と使用例

この記事では、例を使用して MySQL ビューの機能と使用方法を説明します。ご参考までに、詳細は以下...

MySQL 5.7.21 のインストールと設定のチュートリアル

mysql5.7.21の簡単なインストール構成は次のとおりです。 1. MySQLのインストール1....

言及すべき8つのMySQLの落とし穴を共有する

MySQL はインストールが簡単で、高速で、豊富な機能を備えています。これはオープンソース運動のベン...

vite2.0+vue3 モバイルプロジェクトの詳細な説明

1. 関連する技術的なポイントバイト版ヴュー3 ts統合ルーティングvuexを統合するAxiosを統...

シームレスなカルーセル効果を実現するネイティブ js

参考までに、ネイティブjsでカルーセル効果(シームレススクロール)を実現しています。具体的な内容は以...

nginx-ingress-controller ログ永続化ソリューションのソリューション

最近、nginx-ingress-controller のアプリケーションについて説明した公開アカウ...

Tomcat プロジェクトを展開する一般的な方法のいくつか [テスト済み]

1 / Webプロジェクトファイルをwebappsディレクトリに直接コピーするこれは最も一般的に使...

CSS導入方法4つのまとめ(共有)

1. インライン参照:ラベルに直接使用されるが、メンテナンスコストが高い スタイル='フォ...

Vue.jsはシンプルなタイマー機能を実装します

この記事では、参考までに、簡単なタイマー機能を実装するためのvue.jsの具体的なコードを紹介します...

Explainキーワードに基づいてMySQLインデックス機能を最適化する方法

EXPLAIN は、MySQL がインデックスを使用して選択ステートメントを処理し、テーブルを結合す...

Linux サーバー上で複数の SVN リポジトリを構成するプロセスの詳細な説明

1. 指定されたディレクトリにリポジトリを作成し、ディレクトリ全体を保存してください。この記事のサン...

ソケット '/tmp/mysql.sock' 経由でローカル MySQL に接続できない解決策

エラーメッセージ:エラー 2002: ソケット '/tmp/mysql.sock' ...

静的ページと動的ページの実行メカニズムの説明

1. 静的ページとは、Web ページ内に HTML タグのみが含まれるページです。WEB 開発者がこ...