Docker クロスホストネットワークの実装 (手動)

Docker クロスホストネットワークの実装 (手動)

1. Macvlan の紹介

Macvlan が登場する前は、イーサネット カードに複数の IP アドレスを追加することしかできず、MAC アドレスを複数追加することはできませんでした。これは、MAC アドレスがグローバルな一意性によってイーサネット カードを識別するためです。ethx:y を作成する方法を使用した場合でも、これらすべての「ネットワーク カード」の MAC アドレスは ethx と同じであることがわかります。本質的には、これらは依然としてネットワーク カードであり、多くのレイヤー 2 操作を実行する能力が制限されます。 Macvlan テクノロジーを使用すると、これが可能になります。

Macvlan を使用すると、ホストのネットワーク インターフェイス上に複数の仮想ネットワーク インターフェイスを設定できます。これらのネットワーク インターフェイスにはそれぞれ独立した MAC アドレスがあり、通信用に IP アドレスを設定することもできます。 Macvlan の下の仮想マシンまたはコンテナ ネットワークは、ホストと同じネットワーク セグメントにあり、同じブロードキャスト ドメインを共有します。 Macvlan は Bridge に似ていますが、Bridge の存在を省略しているため、設定やデバッグがより簡単であり、効率も比較的高いです。さらに、Macvlan 自体も VLAN を完全にサポートします。

同じ VLAN 間のデータ転送は、ルーティングを必要とせずに、レイヤー 2 相互アクセス、つまり MAC アドレスを通じて実現されます。デフォルトでは、異なる VLAN 内のユーザーは直接通信できません。通信するには、ルーティング用のレイヤー 3 デバイスが必要です。Macvlan の場合も同様です。 Macvlan テクノロジーによって仮想化された仮想ネットワーク カードは、論理的には物理ネットワーク カードと同等です。物理ネットワーク カードはスイッチに相当し、対応する仮想ネットワーク カードと MAC アドレスを記録します。物理ネットワーク カードはデータ パケットを受信すると、宛先 MAC アドレスに基づいてパケットがどの仮想ネットワーク カードに属するかを判断します。つまり、データ パケットが Macvlan サブインターフェイスから送信される (または Macvlan サブインターフェイスに送信される) 限り、物理ネットワーク カードはデータ パケットを受信するだけで、処理は行いません。そのため、ローカル Macvlan ネットワーク カードの IP が物理ネットワーク カードの IP と通信できないという問題が発生します。この問題の解決策については次のセクションで説明します。


簡単に言えば、Macvlan 仮想ネットワーク カード デバイスは、物理ネットワーク カード デバイスに寄生します。パケットを送信する際には、独自のパケット送信関数を呼び出し、寄生物理デバイスを見つけ、その物理デバイスを介してパケットを送信します。パケットを受信すると、寄生物理デバイスの rx_handler コールバック関数を登録してデータ パケットが処理されます。

2. 手動プロセスを簡単に紹介する

その名前が示すように、macvlan は物理ネットワーク カードから複数のインターフェイスを仮想化できるネットワーク カード仮想化テクノロジです。各インターフェイスは、MAC アドレスと独自の IP アドレスで構成できます。各インターフェイスはスイッチ ポートのようなもので、VLAN に分割できます。

macvlan が実際に行うことは、これらの仮想インターフェースを Docker コンテナに直接接続して、通信の目的を達成することです。 1 つの macvlan ネットワークは 1 つのインターフェースに対応し、異なる macvlan ネットワークには異なるサブネットが割り当てられます。したがって、同じ macvlan ネットワークは相互に通信できますが、異なる macvlan ネットワークは第 2 層で通信できず、通信を完了するには第 3 層ルーターの助けが必要です。次に、2 つの異なる macvlan ネットワーク間の通信プロセスを示します。


Linux ホストを使用し、そのルーティング テーブルと iptables を構成してルーター (もちろん仮想) にして、異なる macvlan ネットワーク間でのデータ交換を完了できるようにします。もちろん、物理ルーターを使用しても問題ありません。

3. Macvlan の特徴:

1. ユーザーが同じ物理ネットワーク カードに複数の MAC アドレスを設定できるようにします。
2. 前述の通り、MAC アドレスが設定されたネットワーク カードをサブ インターフェイスと呼び、物理ネットワーク カードを親インターフェイスと呼びます。
3. 親インターフェイスは、物理インターフェイス (eth0)、802.1q サブインターフェイス (eth0.10)、またはボンディング インターフェイスにすることができます。
4. 親/サブインターフェースにはMACアドレスだけでなくIPアドレスも設定できます。
5. サブインターフェースは親インターフェースと直接通信できません (サブインターフェースを持つ VM またはコンテナはホストと直接通信できません)。
前述のように、VM またはコンテナがホストと通信する必要がある場合は、ホストが使用するための追加のサブ 6.interface を作成する必要があります。
7. サブインターフェースは通常、識別しやすいように mac0@eth0 の形式で名前が付けられます。
Macvlan を設定した後の様子を説明する写真がこちらです:

4. 実験環境

ドッカー01ドッカー02
192.168.1.11 192.168.1.13

ファイアウォールをオフにして selinux を無効にし、ホスト名を変更します

[root@localhost ~]# ホスト名ctl set-hostname docker01
[root@localhost ~]# su -
最終ログイン: 2019 年 2 月 17 日 08:20:36 CST 192.168.1.1pts/0 から [root@docker01 ~]# systemctl stop firealld
firealld.service の停止に失敗しました: ユニット firealld.service がロードされていません。
[root@docker01 ~]# setenforce 0
setenforce: SELinux が無効になっています
[root@docker01 ~]# systemctl デーモンリロード 
[root@docker01 ~]# systemctl dockerを再起動します
4.1 macvlanの単一ネットワーク通信

4.1 macvlanの単一ネットワーク通信


1) ネットワークカードのプロミスキャスモードを有効にする

//この操作はdocker01とdocker02_の両方で実行する必要があります。

[root@docker01 ~]# ipリンクshow ens33
// ネットワークカードのモードを確認する

[root@docker01 ~]# ip link set ens33 promisc on
//プロミスキャスモードでネットワークカードを作成する [root@docker01 ~]# ip link show ens33
// ネットワークカードのモードを確認する


2) docker01 に macvlan ネットワークを作成します。

[root@docker01 ~]# docker network create -d macvlan --subnet 172.22.16.0/24 --gateway 172.22.16.1 -o parent=ens33 mac_net1
// macvlan モードのネットワークを作成します -o parent=どのネットワーク カードがバインドされているか [root@docker01 ~]# docker network ls
// ネットワークカードの情報を確認する

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

[root@docker01 ~]# docker run -itd --name bbox1 --ip 172.22.16.10 --network mac_net1 busybox

4) docker02 に macvlan ネットワークを作成します。(docker01 の macvlan とまったく同じである必要があります)

[root@docker02 ~]# docker network create -d macvlan --subnet 172.22.16.0/24 --gateway 172.22.16.1 -o parent=ens33 mac_net1

[root@docker02 ~]# dockerネットワークls 

5) docker02 上で、作成した macvlan ネットワークに基づいてコンテナを実行し、docker01 上のコンテナとの通信を確認します。

[root@docker02 ~]# docker run -itd --name bbox2 --network mac_net1 --ip 172.22.16.20 busybox
//busybox[root@docker02 ~]をベースにコンテナを作成# docker exec -it bbox2 /bin/sh
//bbox2 コンテナに入る/ # ping 172.22.16.10
//docker01のホストにpingする

4.2MacVLANマルチネットワーク通信

1) docker01とdocker02はカーネルモジュール8021qカプセル化を検証する

macvlan が解決する必要がある問題: 実際の ens33 ネットワーク カードに基づいて新しい仮想ネットワーク カードを作成します。

[root@docker01 ~]# modinfo 8021q
//カーネルモジュール8021qカプセル化を検証する

[root@docker01 ~]# modprobe 8021q
//カーネルモジュールが有効になっていない場合は、上記のコマンドを実行してインポートします

2) docker01はens33をベースに仮想ネットワークカードを作成する

ens33ネットワークカード構成ファイルを変更する

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


仮想ネットワークカード構成ファイルを手動で追加する

[root@docker01 ~]# cd /etc/sysconfig/network-scripts/
[root@docker01 ネットワークスクリプト]# cp -p ifcfg-ens33 ifcfg-ens33.10
//-p はソースファイルまたはディレクトリのプロパティを保持します [root@docker01 network-scripts]# vim ifcfg-ens33.10
//ens33.10 ネットワーク カード構成ファイル BOOTPROTO=none を変更します
名前=ens33.10
デバイス=ens33.10
ONBOOT=はい
IPアドレス=192.168.10.10
プレフィックス=24
ゲートウェイ=192.168.10.2
VLAN=はい

ゲートウェイとネットワーク セグメント IP の一貫性、デバイス名と構成ファイルの一貫性を確保し、VLAN サポート モードを有効にするには、IP を ens33 ネットワーク セグメントと区別する必要があることに注意してください。

2番目の仮想NIC構成ファイルを作成する

[root@docker01 ネットワークスクリプト]# cp -p ifcfg-ens33.10 ifcfg-ens33.20
[root@docker01 ネットワークスクリプト]# vim ifcfg-ens33.20
//ens33.20 ネットワーク カード構成ファイル BOOTPROTO=none を変更します
名前=ens33.20
デバイス=ens33.20
ONBOOT=はい
IPアドレス=192.168.20.20
プレフィックス=24
ゲートウェイ=192.168.20.2
VLAN=はい

docker01 での操作、作成された仮想ネットワーク カードを有効にします。

[root@docker01 ネットワークスクリプト]# ifup ifcfg-ens33.10 
[root@docker01 ネットワークスクリプト]# ifup ifcfg-ens33.20
[root@docker01 ネットワークスクリプト]# ifconfig
//IPをチェック

3) docker02はens33をベースに仮想ネットワークカードを作成する

ens33ネットワークカードの設定ファイルを変更する

[root@docker02 ~]# cd /etc/sysconfig/network-scripts/
[root@docker02 ネットワークスクリプト]# vim ifcfg-ens33 


仮想ネットワークカード構成ファイルを手動で追加する

[root@docker02 ~]# cd /etc/sysconfig/network-scripts/
[root@docker02 ネットワークスクリプト]# cp -p ifcfg-ens33 ifcfg-ens33.10
//-p はソースファイルまたはディレクトリのプロパティを保持します [root@docker02 network-scripts]# vim ifcfg-ens33.10
//ens33.10 ネットワーク カード構成ファイル BOOTPROTO=none を変更します
名前=ens33.10
デバイス=ens33.10
ONBOOT=はい
IPアドレス=192.168.10.11
プレフィックス=24
ゲートウェイ=192.168.10.2
VLAN=はい

ゲートウェイとネットワーク セグメント IP の一貫性、デバイス名と構成ファイルの一貫性を確保し、VLAN サポート モードを有効にするには、IP を ens33 ネットワーク セグメントと区別する必要があることに注意してください。

2番目の仮想NIC構成ファイルを作成する

[root@docker02 ネットワークスクリプト]# cp -p ifcfg-ens33.10 ifcfg-ens33.20
[root@docker02 ネットワークスクリプト]# vim ifcfg-ens33.20
//ens33.20 ネットワーク カード構成ファイル BOOTPROTO=none を変更します
名前=ens33.20
デバイス=ens33.20
ONBOOT=はい
IPアドレス=192.168.20.21
プレフィックス=24
ゲートウェイ=192.168.20.2
VLAN=はい

docker02 での操作、作成された仮想ネットワーク カードを有効にします。

[root@docker02 network-scripts]# systemctl ネットワークを再起動します
[root@docker02 ネットワークスクリプト]# ifup ifcfg-ens33.10 
[root@docker02 ネットワークスクリプト]# ifup ifcfg-ens33.20
[root@docker02 ネットワークスクリプト]# ifconfig
//IPをチェック


4) docekr01とdocker02は仮想ネットワークカードに基づいてmacvlanネットワークを作成します。

[root@docker02 ネットワーク スクリプト]# docker ネットワーク作成 -d macvlan --subnet 172.16.10.0/24 --gateway 172.16.10.1 -o parent=ens33.10 mac_net10
//ens33.10 に基づいて新しいネットワーク カードを作成する
[root@docker02 ネットワーク スクリプト]# docker ネットワーク作成 -d macvlan --subnet 172.16.20.0/24 --gateway 172.16.20.1 -o parent=ens33.20 mac_net20
//ens33.20 に基づいて新しいネットワーク カードを作成する

5) Docker01がプライベートウェアハウスをデプロイする
ドッカー01

docker プルレジストリ
//レジストリイメージをダウンロード docker run -itd --name registry -p 5000:5000 --restart=always registry:latest 
//レジストリイメージに基づいてコンテナを起動します docker tag busybox:latest 192.168.1.11:5000/busybox:v1 
//コンテナの名前をラベルに変更 docker ps 

vim /usr/lib/systemd/system/docker.service #13 行の変更 ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.11:5000 

systemctlデーモンリロード 
systemctl docker.service を再起動します。 
//Dockerを再起動
docker push 192.168.1.11:5000/busybox:v1
//コンテナをプライベートリポジトリdockerイメージにアップロードする

ドッカー02

vim /usr/lib/systemd/system/docker.service #13 行の変更 ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.11:5000 

systemctlデーモンリロード 
systemctl docker.service を再起動します。 
//Dockerを再起動
docker pull 192.168.1.11/busybox:v1 
//アップロードした画像をダウンロードする

6) docker01 と docker02 は、busybox:v1 イメージとネットワーク カード mac_net10 および mac_net20 に基づいてコンテナーを作成します。
ドッカー01

[root@docker01 ~]# docker run -itd --name bbox10 --network mac_net10 --ip 172.16.10.10 192.168.1.11:5000/busybox:v1
[root@docker01 ~]# docker run -itd --name bbox20 --network mac_net20 --ip 172.16.20.20 192.168.1.11:5000/busybox:v1
**Docker02**
[root@docker02 ~]# docker run -itd --name bbox10 --network mac_net10 --ip 172.16.10.10 192.168.1.11:5000/busybox:v1
[root@docker02 ~]# docker run -itd --name bbox20 --network mac_net20 --ip 172.16.20.20 192.168.1.11:5000/busybox:v1

***ここでの操作は docker01 以降とまったく同じであることに注意してください。操作の順序はおおよそ次のようになります。
8021qコアカプセル化の検証

ens33 ネットワーク カードに基づいて、ens33.10 と ens33.20 という新しい仮想ネットワーク カードを作成し (docker01 上の ens33.10 と ens33.20 は同じネットワーク セグメント内に存在し、IP アドレスが競合してはならないことに注意してください)、このネットワークに基づいてコンテナーを実行します。 (docker01 上のコンテナはすべて、先ほど作成した macvlan ネットワークに基づいていますが、IP アドレスが競合することはないことに注意してください)

7) 検証
docker01 上のコンテナ bbox10 に入り、docker02 上の bbox11 と通信します。
docker01 上のコンテナ bbox20 に入り、docker02 上の bbox21 と通信します。
注意: VMware のネットワークはブリッジ モードに設定する必要があります。

docker01とdocker02のネットワークモードをブリッジモードに設定します


同じネットワークカードを持つホストがpingできるかテストする

[root@docker01 ~]# docker exec -it bbox10 /bin/sh
/# 172.16.20.20 にpingする

[root@docker02 ~]# docker exec -it bbox20 /bin/sh
/# 172.16.20.20 にpingする

5. Macvlan の制限

Macvlan は、レイヤー 2 経由で VM またはコンテナーを物理ネットワークに接続するためのほぼ理想的なソリューションですが、いくつかの制限もあります。

1. Linux ホストが接続されているスイッチでは、同じ物理ポート上の MAC アドレスの数を制限する場合があります。ネットワーク管理者にこれらのポリシーを変更してもらうこともできますが、それが不可能な場合もあります (クライアント向けに簡単な PoC デモを実行している場合など)。
2. 多くの NIC では、物理カード上の MAC アドレスの数にも制限があります。この制限を超えるとシステムのパフォーマンスに影響します。
3.IEEE 802.11 では、同じクライアントに複数の MAC アドレスが存在することは許可されません。つまり、Macvlan サブインターフェイスは、ワイヤレス カードでも AP でも通信できません。この制限を突破するには複雑な方法を使うこともできますが、より簡単な方法として Ipvlan を使う方法もあります。興味があれば、関連情報を自分で確認してみてください。

6. まとめ

macvlan は、1 つのネットワーク カードから複数のネットワーク カードを仮想化できるネットワーク カード仮想化テクノロジです。

macvlan の特定の通信モード。一般的に使用されるモードはブリッジです。

Docker では、macvlan はブリッジ モードのみをサポートします。

同じ macvlan は通信できますが、異なる macvlan は第 2 層で通信できません。通信はレイヤー 3 ルーティングを通じて実現できます。

次のことを考慮してください。

macvlan ブリッジとブリッジの類似点と相違点 複数の仮想ネットワーク カードが同じ MAC アドレスを共有しながら、独立した IP アドレスを持つ同様のテクノロジもあります。 このテクノロジとは何ですか?

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

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

<<:  Node+socketでシンプルなチャットルーム機能を実現

>>:  MySQL 8.0.16 Win10 zip バージョンのインストールと設定のグラフィック チュートリアル

推薦する

一般的な XHTML タグの使用方法の紹介

XHTML には多くのタグがありますが、頻繁に使用されるのはごくわずかであり、習得する必要があるのは...

アイデアを通じてプロジェクトをDockerにパッケージ化する方法

多くの友人が、Docker でプロジェクトを実行する方法をずっと知りたがっていました。今日は、自分の...

画像を表示したり非表示にしたりするための JavaScript

JavaScriptは画像を表示したり非表示にしたりしますが、参考までに具体的な内容は次のとおりで...

Vue+Openlayerはmodifyを使用して要素の完全なコードを変更します

Vue+Openlayerはmodifyを使って要素を変更します。具体的な内容は以下のとおりです。 ...

フロントエンドに必要なNginx設定の詳細な説明

Nginx (エンジン x) は、軽量で高性能な HTTP およびリバース プロキシ サーバーであり...

Windows でのシンプルな Mysql バックアップ BAT スクリプトの共有

序文この記事では、Windows で Mysql をバックアップするための簡単な BAT スクリプト...

Ubuntuでネットワークルーティングテーブルを表示する方法

Linux におけるルーティングとルーティング テーブルとは何ですか?ルーティングのプロセスとは、ネ...

React 高階コンポーネント HOC 使用方法の概要

HOCを紹介する一文高階コンポーネント (HOC) とは何ですか? 公式ドキュメントによると、「高階...

Reactは一般的なスケルトン画面コンポーネントの例を実装します

目次スケルトンスクリーンとは何ですか?デモデザインのアイデア具体的な実装スケルトンスクリーンとは何で...

MySQL データベース ターミナル - 一般的な操作コマンド コード

目次1. ユーザーを追加する2. ユーザー名とホストを変更する3. パスワードを変更する4. ユーザ...

メンテナンスしやすい CSS コードを書くための 5 つのガイドライン

1. スタイルシートの先頭にコメント ブロックを追加して、スタイルシートの作成日、作成者、タグ、その...

WindowsX Hyper-V ベースの CentOS システムをインストールする

現在、Linux を使用するほとんどの人は、クラウド サーバーを使用するか、Windows 上に仮想...

JavaScript 関数型プログラミングの基礎

目次1. はじめに2. 関数型プログラミングとは何ですか? 3. 純粋関数(関数型プログラミングの基...

MySQL エラー コード 1862 の解決方法: パスワードの有効期限が切れています

ブロガーは 1 ~ 2 か月間 MySQL を使用していませんでしたが、今日この問題に遭遇しました。...

リクエストを転送したり、静的リソースファイルにアクセスしたりする複数の場所への nginx の実装

この記事では主に、リクエストを転送したり、静的リソース ファイルにアクセスしたりする nginx の...