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 バージョンのインストールと設定のグラフィック チュートリアル

推薦する

MySQLスケーラブル設計の基本原則

目次序文1. スケーラビリティとは何ですか?スケールアウトの利点:スケールアウトのデメリット:スケー...

1 つの記事で Nginx の現在の制限を理解する (簡単な実装)

Nginx は現在、最も人気のあるロード バランサーの 1 つです。インターネット トラフィックの...

mysql5.7.18.zip インストール不要版設定チュートリアル(Windows)

これは私が以前使用した mysql5.7.18.zip のインストール チュートリアルです。まずこれ...

VMWare Linux MySQL 5.7.13 のインストールと設定のチュートリアル

この記事では、参考までにVMWare LinuxにMySQL 5.7.13をインストールするチュート...

JavaScript キャンバス テキスト クロック

この記事では、テキストクロックを実装するためのキャンバスの具体的なコードを例として紹介します。具体的...

Linux または Windows 環境での pytorch のインストールと検証 (runtimeerror 問題の解決)

1. pytorch公式サイトから対応するインストールファイルをダウンロードします。 https:...

ウェブページで Enter キーを押すと自動的にフォームを送信し、他のページにジャンプするソリューション

ウェブページでEnterキーを押すと、フォームは自動的に送信され、他のページに移動します。クエリフォ...

閲覧時に作成されたWebページの下部にある余分な空白スペースを削除する方法

Dreamweaver または FrontPage を使用して HTML Web ページを作成する場...

nginx は画像表示の遅さとダウンロードの不完全さの問題を解決します

前面に書かれた最近、ある読者から、ブラウザからサーバーにアクセスすると、画像の表示が遅く、ブラウザに...

Linux での MySQL 5.7 の導入とリモート アクセス構成

前書き: 最近、私はパートナーとチームを組んで .NET Core プロジェクトに取り組む予定です。...

nginxのリソースキャッシュ設定の詳細な説明

私はずっとキャッシュについて学びたいと思っていました。結局のところ、キャッシュはフロントエンドのパフ...

MySQL 起動時に報告される ERROR:2002 の分析と解決方法

序文この記事は主にMySQL起動エラー2002の分析と解決方法を紹介しています。参考と勉強のために共...

process.env.NODE_ENV 本番環境モードを設定する方法

始める前に、process.env.NODE_ENV にはデフォルトで開発と本番の 2 つの状態しか...

ニューススタイルのウェブサイトデザイン例25選

bmi ボイジャーピッチフォークアルスター食料品店チャウ真/斜めポスタこれは偽のDIYですクリエイテ...

MySQLデータベースホスト127.0.0.1とlocalhostの違い

私の友人の多くは、127.0.0.1 と localhost の違いがわからず、問題に遭遇するかもし...