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 アドレスを設定できるようにします。 4. 実験環境
ファイアウォールをオフにして 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がプライベートウェアハウスをデプロイする 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 に基づいてコンテナーを作成します。 [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 以降とまったく同じであることに注意してください。操作の順序はおおよそ次のようになります。 ens33 ネットワーク カードに基づいて、ens33.10 と ens33.20 という新しい仮想ネットワーク カードを作成し (docker01 上の ens33.10 と ens33.20 は同じネットワーク セグメント内に存在し、IP アドレスが競合してはならないことに注意してください)、このネットワークに基づいてコンテナーを実行します。 (docker01 上のコンテナはすべて、先ほど作成した macvlan ネットワークに基づいていますが、IP アドレスが競合することはないことに注意してください) 7) 検証 同じネットワークカードを持つホストが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 デモを実行している場合など)。 6. まとめ macvlan は、1 つのネットワーク カードから複数のネットワーク カードを仮想化できるネットワーク カード仮想化テクノロジです。 macvlan の特定の通信モード。一般的に使用されるモードはブリッジです。 Docker では、macvlan はブリッジ モードのみをサポートします。 同じ macvlan は通信できますが、異なる macvlan は第 2 層で通信できません。通信はレイヤー 3 ルーティングを通じて実現できます。 次のことを考慮してください。 macvlan ブリッジとブリッジの類似点と相違点 複数の仮想ネットワーク カードが同じ MAC アドレスを共有しながら、独立した IP アドレスを持つ同様のテクノロジもあります。 このテクノロジとは何ですか? 以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: Node+socketでシンプルなチャットルーム機能を実現
>>: MySQL 8.0.16 Win10 zip バージョンのインストールと設定のグラフィック チュートリアル
目次序文1. スケーラビリティとは何ですか?スケールアウトの利点:スケールアウトのデメリット:スケー...
Nginx は現在、最も人気のあるロード バランサーの 1 つです。インターネット トラフィックの...
これは私が以前使用した mysql5.7.18.zip のインストール チュートリアルです。まずこれ...
この記事では、参考までにVMWare LinuxにMySQL 5.7.13をインストールするチュート...
この記事では、テキストクロックを実装するためのキャンバスの具体的なコードを例として紹介します。具体的...
1. pytorch公式サイトから対応するインストールファイルをダウンロードします。 https:...
ウェブページでEnterキーを押すと、フォームは自動的に送信され、他のページに移動します。クエリフォ...
Dreamweaver または FrontPage を使用して HTML Web ページを作成する場...
前面に書かれた最近、ある読者から、ブラウザからサーバーにアクセスすると、画像の表示が遅く、ブラウザに...
前書き: 最近、私はパートナーとチームを組んで .NET Core プロジェクトに取り組む予定です。...
私はずっとキャッシュについて学びたいと思っていました。結局のところ、キャッシュはフロントエンドのパフ...
序文この記事は主にMySQL起動エラー2002の分析と解決方法を紹介しています。参考と勉強のために共...
始める前に、process.env.NODE_ENV にはデフォルトで開発と本番の 2 つの状態しか...
bmi ボイジャーピッチフォークアルスター食料品店チャウ真/斜めポスタこれは偽のDIYですクリエイテ...
私の友人の多くは、127.0.0.1 と localhost の違いがわからず、問題に遭遇するかもし...