Implementierung eines Docker-Cross-Host-Netzwerks (manuell)

Implementierung eines Docker-Cross-Host-Netzwerks (manuell)

1. Einführung in Macvlan

Vor dem Aufkommen von Macvlan konnten wir einer Ethernet-Karte nur mehrere IP-Adressen hinzufügen, nicht jedoch mehrere MAC-Adressen, da die MAC-Adresse eine Ethernet-Karte durch ihre globale Eindeutigkeit identifiziert. Selbst wenn Sie die Methode zum Erstellen von ethx:y verwenden, werden Sie feststellen, dass die MAC-Adressen aller dieser „Netzwerkkarten“ mit ethx identisch sind. Im Wesentlichen handelt es sich immer noch um eine Netzwerkkarte, was Ihre Fähigkeit zur Durchführung vieler Layer-2-Vorgänge einschränkt. Mit der Macvlan-Technologie ist dies möglich.

Macvlan ermöglicht Ihnen die Konfiguration mehrerer virtueller Netzwerkschnittstellen auf einer Netzwerkschnittstelle des Hosts. Diese Netzwerkschnittstellen verfügen über eigene, unabhängige MAC-Adressen und können für die Kommunikation auch mit IP-Adressen konfiguriert werden. Die virtuellen Maschinen oder Containernetzwerke unter Macvlan befinden sich im selben Netzwerksegment wie der Host und teilen sich dieselbe Broadcast-Domäne. Macvlan ähnelt Bridge, ist aber einfacher zu konfigurieren und zu debuggen, da es Bridge nicht benötigt und seine Effizienz relativ hoch ist. Darüber hinaus unterstützt Macvlan selbst auch VLAN perfekt.

Die Datenübertragung zwischen demselben VLAN erfolgt über den gegenseitigen Zugriff auf Schicht 2, d. h. über die MAC-Adresse, ohne dass ein Routing erforderlich ist. Standardmäßig können Benutzer in verschiedenen VLANs nicht direkt miteinander kommunizieren. Wenn sie kommunizieren möchten, benötigen sie ein Layer-3-Gerät für das Routing. Dasselbe gilt für Macvlan. Die mit der Macvlan-Technologie virtualisierte virtuelle Netzwerkkarte ist logisch gleichwertig mit der physischen Netzwerkkarte. Die physische Netzwerkkarte entspricht einem Switch, der die entsprechende virtuelle Netzwerkkarte und MAC-Adresse aufzeichnet. Wenn die physische Netzwerkkarte ein Datenpaket empfängt, bestimmt sie anhand der Ziel-MAC-Adresse, zu welcher virtuellen Netzwerkkarte das Paket gehört. Dies bedeutet, dass die physische Netzwerkkarte das Datenpaket nur empfängt, aber nicht verarbeitet, solange das Datenpaket von der Macvlan-Subschnittstelle gesendet wird (oder an die Macvlan-Subschnittstelle gesendet wird). Dies führt also zu einem Problem: Die IP auf der lokalen Macvlan-Netzwerkkarte kann nicht mit der IP auf der physischen Netzwerkkarte kommunizieren! Wir werden die Lösung dieses Problems im nächsten Abschnitt besprechen.


Einfach ausgedrückt ist das virtuelle Netzwerkkartengerät Macvlan parasitär auf dem physischen Netzwerkkartengerät. Beim Senden eines Pakets ruft es seine eigene Paketsendefunktion auf, findet das parasitäre physische Gerät und sendet das Paket dann über das physische Gerät. Beim Empfangen von Paketen werden die Datenpakete durch Registrierung der rx_handler-Rückruffunktion des parasitären physischen Geräts verarbeitet.

2. Stellen Sie den manuellen Prozess kurz vor

Wie der Name schon sagt, ist Macvlan eine Netzwerkkartenvirtualisierungstechnologie, die mehrere Schnittstellen einer physischen Netzwerkkarte virtualisieren kann. Jede Schnittstelle kann mit einer MAC-Adresse und einer eigenen IP-Adresse konfiguriert werden. Jede Schnittstelle ist wie ein Switch-Port und kann in VLANs unterteilt werden.

Was macvlan tatsächlich macht, ist, diese virtuellen Schnittstellen direkt mit dem Docker-Container zu verbinden, um den Kommunikationszweck zu erreichen. Ein MacVLAN-Netzwerk entspricht einer Schnittstelle, und verschiedenen MacVLAN-Netzwerken werden unterschiedliche Subnetze zugewiesen. Daher können dieselben MacVLAN-Netzwerke miteinander kommunizieren, aber verschiedene MacVLAN-Netzwerke können nicht auf der zweiten Ebene kommunizieren und benötigen die Hilfe eines Routers der dritten Ebene, um die Kommunikation abzuschließen. Im Folgenden wird der Kommunikationsprozess zwischen zwei verschiedenen MacVLAN-Netzwerken gezeigt.


Wir verwenden einen Linux-Host, konfigurieren seine Routing-Tabelle und iptables und machen ihn zu einem Router (natürlich virtuell), damit wir den Datenaustausch zwischen verschiedenen Macvlan-Netzwerken durchführen können. Natürlich spricht nichts dagegen, einen physischen Router zu verwenden.

3. Funktionen von Macvlan:

1. Ermöglichen Sie Benutzern, mehrere MAC-Adressen auf derselben physischen Netzwerkkarte festzulegen.
2. Wie oben erwähnt, wird die Netzwerkkarte mit der oben festgelegten MAC-Adresse als Unterschnittstelle und die physische Netzwerkkarte als übergeordnete Schnittstelle bezeichnet.
3. Die übergeordnete Schnittstelle kann eine physische Schnittstelle (eth0), eine 802.1q-Subschnittstelle (eth0.10) oder eine Bonding-Schnittstelle sein.
4. Auf der übergeordneten/untergeordneten Schnittstelle kann nicht nur die MAC-Adresse, sondern auch die IP-Adresse eingestellt werden.
5. Die Unterschnittstelle kann nicht direkt mit der übergeordneten Schnittstelle kommunizieren (VMs oder Container mit Unterschnittstellen können nicht direkt mit dem Host kommunizieren).
Wenn die VM oder der Container mit dem Host kommunizieren muss, muss, wie oben erwähnt, eine zusätzliche Subschnittstelle 6. für den Host erstellt werden.
7. Unterschnittstellen werden zur einfacheren Identifizierung normalerweise in der Form mac0@eth0 benannt.
Hier ist ein Bild, das erklärt, wie es nach der Einrichtung von Macvlan aussieht:

4. Experimentelle Umgebung

docker01 docker02
192.168.1.11 192.168.1.13

Firewall ausschalten und Selinux deaktivieren, Hostnamen ändern

[root@localhost ~]# hostnamectl set-hostname docker01
[root@localhost ~]# su -
Letzte Anmeldung: 17. Feb 08:20:36 CST 2019 von 192.168.1.1pts/0 [root@docker01 ~]# systemctl stop firealld
Firealld.service konnte nicht gestoppt werden: Unit firealld.service wurde nicht geladen.
[root@docker01 ~]# setenforce 0
setenforce: SELinux ist deaktiviert
[root@docker01 ~]# systemctl daemon-reload 
[root@docker01 ~]# systemctl Neustart Docker
4.1 Einzelnetzwerkkommunikation von Macvlan

4.1 Einzelnetzwerkkommunikation von Macvlan


1) Aktivieren Sie den Promiscuous-Modus der Netzwerkkarte

//Dieser Vorgang muss sowohl auf docker01 als auch auf docker02_ ausgeführt werden.

[root@docker01 ~]# IP-Link zeigt ens33
//Überprüfen Sie den Netzwerkkartenmodus 

[root@docker01 ~]# IP-Link-Set ens33 Promisc ein
//Erstellen Sie eine Netzwerkkarte im Promiscuous-Modus [root@docker01 ~]# ip link show ens33
//Überprüfen Sie den Netzwerkkartenmodus 


2) Erstellen Sie ein Macvlan-Netzwerk auf Docker01.

[root@docker01 ~]# Docker-Netzwerk erstellen -d macvlan --subnet 172.22.16.0/24 --gateway 172.22.16.1 -o parent=ens33 mac_net1
// Ein Netzwerk im Macvlan-Modus erstellen -o parent=welche Netzwerkkarte ist an [root@docker01 ~] gebunden# docker network ls
// Überprüfen Sie die Netzwerkkarteninformationen 

3) Führen Sie einen Container basierend auf dem erstellten Macvlan-Netzwerk aus

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

4) Erstellen Sie ein MacVLAN-Netzwerk auf Docker02. (Es sollte genau dasselbe sein wie das MacVLAN von Docker01.)

[root@docker02 ~]# Docker-Netzwerk erstellen -d macvlan --subnet 172.22.16.0/24 --gateway 172.22.16.1 -o parent=ens33 mac_net1

[root@docker02 ~]# Docker-Netzwerk ls 

5) Führen Sie auf docker02 einen Container basierend auf dem erstellten Macvlan-Netzwerk aus und überprüfen Sie die Kommunikation mit dem Container auf docker01.

[root@docker02 ~]# docker run -itd --name bbox2 --network mac_net1 --ip 172.22.16.20 busybox
//Erstellen Sie einen Container basierend auf busybox[root@docker02 ~]# docker exec -it bbox2 /bin/sh
//Geben Sie den bbox2-Container ein/ # ping 172.22.16.10
//Pingen Sie den Host von docker01 

4.2MacVLAN-Multinetzwerkkommunikation

1) Docker01 und Docker02 überprüfen die Kapselung des Kernelmoduls 8021q

Das Problem, das macvlan lösen muss: Erstellen Sie eine neue virtuelle Netzwerkkarte basierend auf der realen ens33-Netzwerkkarte.

[root@docker01 ~]# modinfo 8021q
//Überprüfen Sie die Kapselung des Kernelmoduls 8021q 

[root@docker01 ~]# modprobe 8021q
//Wenn das Kernelmodul nicht aktiviert ist, führen Sie den obigen Befehl aus, um es zu importieren

2) docker01 erstellt eine virtuelle Netzwerkkarte basierend auf ens33

Ändern Sie die Konfigurationsdatei der ens33-Netzwerkkarte

[root@docker01 ~]# cd /etc/sysconfig/network-scripts/
[root@docker01 Netzwerkskripte]# vim ifcfg-ens33 


Manuelles Hinzufügen einer Konfigurationsdatei für virtuelle Netzwerkkarten

[root@docker01 ~]# cd /etc/sysconfig/network-scripts/
[root@docker01 Netzwerkskripte]# cp -p ifcfg-ens33 ifcfg-ens33.10
//-p behält die Eigenschaften der Quelldatei oder des Quellverzeichnisses bei [root@docker01 network-scripts]# vim ifcfg-ens33.10
//Konfigurationsdatei der Netzwerkkarte ens33.10 ändern BOOTPROTO=none
NAME=ens33.10
GERÄT=ens33.10
ONBOOT=ja
IPADDR=192.168.10.10
Präfix = 24
GATEWAY=192.168.10.2
VLAN=ja

Beachten Sie, dass die IP vom ens33-Netzwerksegment unterschieden werden muss, um die Konsistenz des Gateways und der Netzwerksegment-IP, die Konsistenz des Gerätenamens und der Konfigurationsdatei sicherzustellen und den VLAN-Unterstützungsmodus zu aktivieren.

Erstellen Sie eine zweite virtuelle NIC-Konfigurationsdatei

[root@docker01 Netzwerkskripte]# cp -p ifcfg-ens33.10 ifcfg-ens33.20
[root@docker01 Netzwerkskripte]# vim ifcfg-ens33.20
//Konfigurationsdatei der Netzwerkkarte ens33.20 ändern BOOTPROTO=none
NAME=ens33.20
GERÄT=ens33.20
ONBOOT=ja
IPADDR=192.168.20.20
Präfix = 24
GATEWAY=192.168.20.2
VLAN=ja

Vorgang auf docker01, Aktivieren der erstellten virtuellen Netzwerkkarte:

[root@docker01 Netzwerkskripte]# ifup ifcfg-ens33.10 
[root@docker01 Netzwerkskripte]# ifup ifcfg-ens33.20
[root@docker01 Netzwerkskripte]# ifconfig
//IP prüfen 

3) docker02 erstellt eine virtuelle Netzwerkkarte basierend auf ens33

Ändern Sie die Konfigurationsdatei der ens33-Netzwerkkarte

[root@docker02 ~]# cd /etc/sysconfig/network-scripts/
[root@docker02 Netzwerkskripte]# vim ifcfg-ens33 


Manuelles Hinzufügen einer Konfigurationsdatei für virtuelle Netzwerkkarten

[root@docker02 ~]# cd /etc/sysconfig/network-scripts/
[root@docker02 Netzwerkskripte]# cp -p ifcfg-ens33 ifcfg-ens33.10
//-p behält die Eigenschaften der Quelldatei oder des Quellverzeichnisses bei [root@docker02 network-scripts]# vim ifcfg-ens33.10
//Konfigurationsdatei der Netzwerkkarte ens33.10 ändern BOOTPROTO=none
NAME=ens33.10
GERÄT=ens33.10
ONBOOT=ja
IPADDR=192.168.10.11
Präfix = 24
GATEWAY=192.168.10.2
VLAN=ja

Beachten Sie, dass die IP vom ens33-Netzwerksegment unterschieden werden muss, um die Konsistenz des Gateways und der Netzwerksegment-IP, die Konsistenz des Gerätenamens und der Konfigurationsdatei sicherzustellen und den VLAN-Unterstützungsmodus zu aktivieren.

Erstellen Sie eine zweite virtuelle NIC-Konfigurationsdatei

[root@docker02 Netzwerkskripte]# cp -p ifcfg-ens33.10 ifcfg-ens33.20
[root@docker02 Netzwerkskripte]# vim ifcfg-ens33.20
//Konfigurationsdatei der Netzwerkkarte ens33.20 ändern BOOTPROTO=none
NAME=ens33.20
GERÄT=ens33.20
ONBOOT=ja
IPADDR=192.168.20.21
Präfix = 24
GATEWAY=192.168.20.2
VLAN=ja

Vorgang auf docker02, Aktivieren der erstellten virtuellen Netzwerkkarte:

[root@docker02 Netzwerkskripte]# systemctl Netzwerk neu starten
[root@docker02 Netzwerkskripte]# ifup ifcfg-ens33.10 
[root@docker02 Netzwerkskripte]# ifup ifcfg-ens33.20
[root@docker02 Netzwerkskripte]# ifconfig
//IP prüfen 


4) docekr01 und docker02 erstellen ein Macvlan-Netzwerk basierend auf einer virtuellen Netzwerkkarte

[root@docker02 Netzwerkskripte]# Docker-Netzwerk erstellen -d macvlan --subnet 172.16.10.0/24 --gateway 172.16.10.1 -o parent=ens33.10 mac_net10
//Erstellen Sie eine neue Netzwerkkarte basierend auf ens33.10
[root@docker02 Netzwerkskripte]# Docker-Netzwerk erstellen -d macvlan --subnet 172.16.20.0/24 --gateway 172.16.20.1 -o parent=ens33.20 mac_net20
//Erstellen Sie eine neue Netzwerkkarte basierend auf ens33.20

5) Docker01 stellt ein privates Lager bereit
Docker01

Docker-Pull-Registrierung
//Laden Sie das Registrierungsimage herunter docker run -itd --name registry -p 5000:5000 --restart=always registry:latest 
// Basierend auf dem Registrierungsimage starten Sie einen Container-Docker-Tag busybox:latest 192.168.1.11:5000/busybox:v1 
// Benennen Sie den Container in ein Label um: docker ps 

vim /usr/lib/systemd/system/docker.service #13 Zeilenänderung ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.11:5000 

systemctl daemon-reload 
systemctl Neustart docker.service 
//Docker neu starten
Docker-Push 192.168.1.11:5000/Busybox:v1
//Laden Sie den Container in das private Repository Docker Images hoch

Docker02

vim /usr/lib/systemd/system/docker.service #13 Zeilenänderung ExecStart=/usr/bin/dockerd --insecure-registry 192.168.1.11:5000 

systemctl daemon-reload 
systemctl Neustart docker.service 
//Docker neu starten
Docker-Pull 192.168.1.11/Busybox:v1 
//Laden Sie das gerade hochgeladene Bild herunter

6) Docker01 und Docker02 erstellen Container basierend auf dem Busybox:v1-Image und den Netzwerkkarten mac_net10 und mac_net20.
Docker01

[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

***Beachten Sie nur, dass unsere Operationen hier genau dieselben sind wie in docker01 und höher. Die Reihenfolge der Operationen ist ungefähr:
Überprüfen Sie die 8021q-Kernkapselung

Erstellen Sie neue virtuelle Netzwerkkarten basierend auf der Netzwerkkarte ens33, ens33.10 und ens33.20 (beachten Sie, dass ens33.10 und ens33.20 auf docker01 im selben Netzwerksegment sein müssen und die IP-Adressen nicht in Konflikt geraten dürfen) und führen Sie Container basierend auf diesem Netzwerk aus. (Beachten Sie, dass die Container auf Docker01 alle auf dem gerade erstellten Macvlan-Netzwerk basieren, die IP-Adressen jedoch nicht in Konflikt geraten dürfen.)

7) Überprüfung
Geben Sie den Container bbox10 auf Docker01 ein und kommunizieren Sie mit bbox11 auf Docker02.
Geben Sie den Container bbox20 auf Docker01 ein und kommunizieren Sie mit bbox21 auf Docker02.
Hinweis: Das Netzwerk von VMware muss auf den Bridge-Modus eingestellt sein.

Stellen Sie nun den Netzwerkmodus von Docker01 und Docker02 auf Bridge-Modus ein


Testen Sie, ob der Host mit der gleichen Netzwerkkarte pingen kann

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

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

5. Einschränkungen von Macvlan

Macvlan ist eine nahezu ideale Lösung, um VMs oder Container über Layer 2 mit dem physischen Netzwerk zu verbinden, weist jedoch auch einige Einschränkungen auf:

1. Der Switch, an den der Linux-Host angeschlossen ist, begrenzt möglicherweise die Anzahl der MAC-Adressen auf demselben physischen Port. Sie könnten diese Richtlinien zwar von Ihrem Netzwerkadministrator ändern lassen, manchmal ist das jedoch einfach nicht machbar (beispielsweise, wenn Sie eine schnelle PoC-Demo für einen Kunden durchführen).
2. Bei vielen Netzwerkkarten ist die Anzahl der MAC-Adressen auf der physischen Karte außerdem begrenzt. Das Überschreiten dieses Grenzwertes beeinträchtigt die Systemleistung.
3. IEEE 802.11 mag nicht mehrere MAC-Adressen auf demselben Client, was bedeutet, dass Ihre Macvlan-Subschnittstellen weder mit der Wireless-Karte noch mit dem AP kommunizieren können. Sie können diese Einschränkung mithilfe komplexer Methoden umgehen, es gibt jedoch auch eine einfachere Möglichkeit, nämlich die Verwendung von IP-VLAN. Wenn Sie interessiert sind, können Sie die entsprechenden Informationen selbst überprüfen.

6. Zusammenfassung

macvlan ist eine Netzwerkkarten-Virtualisierungstechnologie, die mehrere Netzwerkkarten von einer Netzwerkkarte aus virtualisieren kann.

Ein spezifischer Kommunikationsmodus von Macvlan. Der häufig verwendete Modus ist Bridge.

In Docker unterstützt macvlan nur den Bridge-Modus.

Das gleiche MacVLAN kann kommunizieren, aber verschiedene MacVLANs können auf der zweiten Schicht nicht kommunizieren. Die Kommunikation kann über Layer-3-Routing erfolgen.

Bedenken Sie Folgendes:

Die Ähnlichkeiten und Unterschiede zwischen Macvlan Bridge und Bridge Es gibt auch eine ähnliche Technologie, bei der mehrere virtuelle Netzwerkkarten dieselbe MAC-Adresse teilen, aber unabhängige IP-Adressen haben. Was ist das für eine Technologie?

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.

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)
  • Detaillierte Erläuterung des direkten Routings bei der hostübergreifenden Kommunikation von Docker-Containern
  • Docker setzt Macvlan ein, um eine hostübergreifende Netzwerkkommunikation zu erreichen
  • 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

<<:  Node+Socket realisiert einfache Chatroom-Funktion

>>:  Grafisches Tutorial zur Installation und Konfiguration der MySQL 8.0.16 Win10-Zip-Version

Artikel empfehlen

Zehn nützliche und einfache MySQL-Funktionen

Funktion 0. Aktuelle Uhrzeit anzeigen Befehl: sel...

So fragen Sie JSON in der Datenbank in MySQL 5.6 und darunter ab

Beim Speichern von Daten in MySQL werden manchmal...

So implementieren Sie einen variablen Ausdrucksselektor in Vue

Inhaltsverzeichnis Definieren der HTML-Struktur E...

Fallstricke und Lösungen für das Upgrade von MySQL 5.7.23 in CentOS 7

Vorwort Kürzlich bin ich beim Upgrade von MySQL 5...

Was sind die Verwendungszwecke von Limits in MySQL (empfohlen)

SELECT * FROM Tabellenname Limit m,n; SELECT * FR...

Sollten nullbare Felder in MySQL auf NULL oder NOT NULL gesetzt werden?

Personen, die MySQL häufig verwenden, können mit ...

Bedeutung und Verwendung einer Linux-CD

Was bedeutet Linux-CD? Unter Linux bedeutet cd „V...

So überwachen Sie den Linux-Serverstatus

Wir, insbesondere Linux-Ingenieure, haben täglich...

Detaillierte Analyse von or, in, union und Indexoptimierung in MySQL

Dieser Artikel entstand aus der Hausaufgabe „Erle...

Eine einfache Implementierungsmethode für eine digitale LED-Uhr in CSS3

Das dürfte etwas sein, was viele Leute gemacht ha...