Docker setzt Macvlan ein, um eine hostübergreifende Netzwerkkommunikation zu erreichen

Docker setzt Macvlan ein, um eine hostübergreifende Netzwerkkommunikation zu erreichen

Grundlegendes Konzept:

Funktionsprinzip von Macvlan:

Macvlan ist eine vom Linux-Kernel unterstützte Netzwerkschnittstelle. Die erforderlichen Linux-Builds sind v3.9–3.19 und 4.0+; durch die Erstellung von Macvlan-Subschnittstellen für die physische Netzwerkkarte kann eine physische Netzwerkkarte über mehrere unabhängige MAC-Adressen und IP-Adressen verfügen. Die virtualisierte Subschnittstelle wird direkt dem angrenzenden physischen Netzwerk ausgesetzt. Von außen betrachtet sieht es so aus, als ob das Netzwerkkabel in mehrere Stränge aufgeteilt und jeweils mit verschiedenen Hosts verbunden ist. Nachdem die physische Netzwerkkarte das Paket empfangen hat, bestimmt sie anhand der Ziel-MAC-Adresse des empfangenen Pakets, ob das Paket an die virtuelle Netzwerkkarte übergeben werden muss.

Wenn der Container direkt mit dem physischen Netzwerk verbunden werden muss, kann Macvlan verwendet werden. Macvlan selbst erstellt kein Netzwerk. Im Wesentlichen lässt es die physische Netzwerkkarte des Hosts zunächst im „Promiscuous-Modus“ arbeiten, sodass die MAC-Adresse der physischen Netzwerkkarte ungültig wird und die physische Netzwerkkarte den gesamten Datenverkehr im Layer-2-Netzwerk empfangen kann. Der nächste Schritt besteht darin, auf dieser physischen Netzwerkkarte eine virtuelle Netzwerkkarte zu erstellen und der virtuellen Netzwerkkarte eine MAC-Adresse zuzuweisen, um eine Mehrfachverwendung einer Karte zu erreichen. Aus Sicht des physischen Netzwerks ist jede virtuelle Netzwerkkarte eine separate Schnittstelle.

Bei der Nutzung von Macvlan müssen Sie folgende Punkte beachten:
  • Der Container ist direkt mit dem physischen Netzwerk verbunden, das für die Zuweisung von IP-Adressen zuständig ist. Dies kann zur Erschöpfung der IP-Adressen des physischen Netzwerks führen. Eine weitere Folge sind Probleme mit der Netzwerkleistung. Je mehr Hosts mit dem physischen Netzwerk verbunden sind, desto schneller steigt der Anteil der Broadcast-Pakete an, was zu einer Verschlechterung der Netzwerkleistung führt.
  • Ein Netzwerk auf dem Host muss im „Promiscuous-Modus“ arbeiten;
  • Wie oben erwähnt, wird die MAC-Adresse einer physischen Netzwerkkarte, die im Promiscuous-Modus arbeitet, ungültig. Daher können Container, die in diesem Modus ausgeführt werden, nicht mit dem externen Netzwerk kommunizieren, dies hat jedoch keine Auswirkungen auf die Kommunikation zwischen dem Host und dem externen Netzwerk.
  • Auf lange Sicht sind Bridge-Netzwerke und Overlay-Netzwerke die bessere Wahl, da virtuelle Netzwerke von physischen Netzwerken isoliert und nicht gemeinsam genutzt werden sollten.

Projektumfeld:

Zwei Docker-Hosts: (centos7)
docker01: 172.16.1.30
docker02: 172.16.1.31

Projektabwicklung:

Beispiel 1: MacVLAN Cross-Host-Einzelnetzwerklösung:

docker01:

(1) Aktivieren Sie den Promiscuous-Modus der ens33-Netzwerkkarte und aktivieren Sie mehrere virtuelle Schnittstellen der Netzwerkkarte.

[root@sqm-docker01 ~]# IP-Link-Set ens33 Promisc ein
##Überprüfen Sie den Status der Netzwerkkarte:
[root@sqm-docker01 ~]# IP-Link zeigt ens33 

(2) Erstellen Sie ein Macvlan-Netzwerk:

[root@sqm-docker01 ~]# Docker-Netzwerk erstellen -d macvlan --subnet 172.16.100.0/24 --gateway 172.16.100.1 -o parent=ens33 mac_net1

Parametererklärung:
-o: An welche Netzwerkkarte soll die Verbindung hergestellt werden (basierend auf der ens33-Netzwerkkarte)

(3) Führen Sie einen Container basierend auf dem soeben erstellten Netzwerk aus:

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

docker02: (gleiche Operation wie docker01)

Promiscuous-Modus aktivieren [root@sqm-docker02 ~]# ip link set ens33 promisc on
[root@sqm-docker02 ~]# IP-Link zeigt ens33 

//Erstellen Sie ein Macvlan-Netzwerk [root@sqm-docker02 ~]# docker network create -d macvlan --subnet 172.16.100.0/24 --gateway 172.16.100.1 -o parent=ens33 mac_net1
//Einen Container ausführen:
[root@sqm-docker02 ~]# docker run -itd --name box2 --network mac_net1 --ip 172.16.100.20 busybox

(4) Testen Sie, ob zwei Container auf zwei Hosts miteinander kommunizieren:

Notiz:

Der Grund für den erfolgreichen Ping liegt darin, dass beide Container auf echten ens33-Netzwerkkarten basieren und die ens33-Netzwerkkarten auf dem Host daher miteinander kommunizieren können müssen. Mit dieser Methode kann nur ein Ping an die IP-Adresse gesendet werden, nicht jedoch an den Containernamen.

Beispiel 2: Macvlan Cross-Host-Multi-Netzwerk-Lösung:

(1) Überprüfen Sie zunächst das 8021q-Modul des Host-Kernels:

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

##Wenn Sie das Modul nicht sehen, müssen Sie den folgenden Befehl ausführen, um es zu laden:
[root@sqm-docker01 ~]# modprobe 8021q
Routing-Weiterleitung aktivieren:
[root@sqm-docker01 ~]# echo "net.ipv4.ip_forward = 1" > /etc/sysctl.conf 
[root@sqm-docker01 ~]# sysctl -p
net.ipv4.ip_forward = 1

(2) Netzwerkkonfigurationsinformationen ändern:

docker01:

[root@sqm-docker01 ~]# cd /etc/sysconfig/network-scripts/
[root@sqm-docker01 Netzwerkskripte]# ls 


[root@sqm-docker01 Netzwerkskripte]# vim ifcfg-ens33 

Erstellen Sie eine Subnetzkarte basierend auf der ens33-Netzwerkkarte:

[root@sqm-docker01 network-scripts]# cp -p ifcfg-ens33 ifcfg-ens33.10 #Netzwerkkartennamen anpassen [root@sqm-docker01 network-scripts]# cp -p ifcfg-ens33 ifcfg-ens33.20

-p: bedeutet Beibehaltung der ursprünglichen Attribute (Berechtigungen)

//Ens33.10 Netzwerkkarte ändern:
[root@sqm-docker01 Netzwerkskripte]# vim ifcfg-ens33.10
##Behalten Sie nur die folgenden Optionen: 

//Ens33.20-Netzwerkkarte ändern:
[root@sqm-docker01 Netzwerkskripte]# vim ifcfg-ens33.20 
Die Konfiguration ist die gleiche wie bei ens33.10, lediglich die IP-Adresse muss angepasst werden: 

(3) Starten Sie die Subnetzkarte:

[root@sqm-docker01 Netzwerkskripte]# ifup ifcfg-ens33.10 
[root@sqm-docker01 Netzwerkskripte]# ifup ifcfg-ens33.20
//Netzwerkinformationen anzeigen [root@sqm-docker01 network-scripts]# ifconfig 

(4) Erstellen Sie ein Macvlan-Netzwerk basierend auf ens33.10 und ens33.20:

Hinweis: Verschiedene Netzwerksegmente haben unterschiedliche Netzwerknamen

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

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

(5) Führen Sie zwei Container basierend auf dem obigen Netzwerk aus:

[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

Stellen Sie docker02 bereit:

Der Vorgang ist grundsätzlich derselbe wie bei docker01. Beachten Sie, dass das Netzwerksegment dasselbe ist, die Host-IP jedoch unterschiedlich ist.

#Die folgenden Vorgänge werden nicht erklärt:

Routing-Weiterleitung aktivieren:
[root@sqm-docker01 ~]# echo "net.ipv4.ip_forward = 1" > /etc/sysctl.conf 
[root@sqm-docker01 ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@sqm-docker02 Netzwerkskripte]# pwd
/etc/sysconfig/Netzwerkskripte
[root@sqm-docker02 Netzwerkskripte]# vim ifcfg-ens33 

[root@sqm-docker02 Netzwerkskripte]# cp -p ifcfg-ens33 ifcfg-ens33.10
[root@sqm-docker02 Netzwerkskripte]# cp -p ifcfg-ens33 ifcfg-ens33.20
[root@sqm-docker02 Netzwerkskripte]# vim ifcfg-ens33.10 


[root@sqm-docker02 Netzwerkskripte]# vim ifcfg-ens33.20 

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

 [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) Testen Sie, ob Container über Hosts hinweg kommunizieren können: (Hinweis: Wenn Sie VMware verwenden, müssen Sie den Standard-NAT-Modus der beiden Hosts in den Bridge-Modus ändern, um eine normale Kommunikation aufgrund der virtuellen VMware-Maschinen zu ermöglichen.)
Test3 kommuniziert mit Test1 (gleiches Netzwerksegment):

Test4 kommuniziert mit Test2 (gleiches Netzwerksegment):

Ideen zur Fehlerbehebung: Wenn die Hosts nach der Bereitstellung nicht kommunizieren können, bestätigen Sie zunächst, ob die Firewall- oder Iptables-Regeln geschlossen oder freigegeben sind und ob Selinux deaktiviert ist. Überprüfen Sie dann, ob die Konfigurationsdatei der ens33-Netzwerkkarte und deren Subnetzkarteninhalt falsch geändert wurden. Überprüfen Sie abschließend, ob die Netzwerksegmentdefinition beim Erstellen des Macvlan-Netzwerks falsch ist oder ob die IP-Adresse beim Ausführen des Containers falsch angegeben wurde.

----------------------Bereitstellung der Multi-Network-Cross-Host-Kommunikation von Macvlan abgeschlossen---------------------

Erweiterte Wissenspunkte:
Angenommen, wir führen einen T1-Container aus, und dann verwendet der T2-Container den Netzwerkstapel des T1-Containers.

 [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


Dann können Sie diesen Dienst auch im t2-Container sehen:

Das Obige ist der grundlegende Inhalt der Bereitstellung des Netzwerkstapels. Ich verwende ihn nicht oft. Er dient nur dazu, anderen Containern die gemeinsame Nutzung der Ressourcen in einem Container zu ermöglichen.

Das könnte Sie auch interessieren:
  • Docker implementiert hostübergreifende Containerkommunikation basierend auf MacVLAN
  • Detaillierte Erläuterung des Implementierungsprozesses des Docker-Cross-Host-Container-Kommunikations-Overlays
  • Implementierung eines Docker-Cross-Host-Netzwerks (Overlay)
  • Implementierung eines Docker-Cross-Host-Netzwerks (manuell)
  • Detaillierte Erläuterung des direkten Routings bei der hostübergreifenden Kommunikation von Docker-Containern
  • Docker-Lernhinweise: Weave realisiert die hostübergreifende Containerverbindung
  • Detaillierte Erklärung, wie Docker-Container über Hosts hinweg kommunizieren
  • Detaillierte Erläuterung der Docker-Container-Cross-Host-Multi-Netzwerksegment-Kommunikationslösung

<<:  Detaillierte Erläuterung der MySQL Limit-Leistungsoptimierung und der Paging-Daten-Leistungsoptimierung

>>:  React führt antd-mobile+postcss ein, um ein mobiles Terminal zu erstellen

Artikel empfehlen

Drei gängige Möglichkeiten zum Einbetten von CSS in HTML-Dokumente

Die folgenden drei Methoden werden häufig verwende...

CSS3 verwendet var()- und calc()-Funktionen, um Animationseffekte zu erzielen

Wissenspunkte in der Vorschau anzeigen. Animation...

Detaillierte Erläuterung des Prozesses der Zabbix-Überwachung von SQLServer

Werfen wir einen Blick auf die Zabbix-Überwachung...

So verwenden Sie den Linux-Befehl md5sum

01. Befehlsübersicht md5sum - MD5-Prüfcode berech...

Detaillierte Verwendung des Kubernetes-Objektvolumens

Überblick Volume ist die Abstraktion und Virtuali...

Fragen zum Vorstellungsgespräch zu JS 9 Promise

Inhaltsverzeichnis 1. Mehrere .catch 2. Mehrere ....

Vergleich zwischen Node.js und Deno

Inhaltsverzeichnis Vorwort Was ist Deno? Vergleic...

vue.js lädt Bilder entsprechend der Bild-URL herunter

Als ich kürzlich an einem Frontend-Docking-Funkti...

Vue und React im Detail

Inhaltsverzeichnis 1. Panorama II. Hintergrund 1....

JavaScript zum Implementieren der Anzeige von Suchdaten

In diesem Artikel wird der Datenanzeigecode für d...

So erzielen Sie mit three.js einen dynamischen 3D-Texteffekt

Vorwort Hallo zusammen, hier ist der CSS-Assisten...

Erläuterung des Problems bei der Auswahl des MySQL-Speicherzeittyps

Der datetime-Typ wird normalerweise zum Speichern...

Einführung in die Verwendung mehrerer spezieller Attribut-Tags in HTML

Die folgenden Attribute sind nicht sehr browserkom...