Detaillierte Erläuterung der Docker-Container-Cross-Host-Multi-Netzwerksegment-Kommunikationslösung

Detaillierte Erläuterung der Docker-Container-Cross-Host-Multi-Netzwerksegment-Kommunikationslösung

1. MacVlan

Es gibt viele Lösungen, um eine netzwerkübergreifende Kommunikation von Docker über mehrere Hosts hinweg zu erreichen, wie z. B. die Bereitstellung des Consul-Dienstes zur Erreichung einer netzwerkübergreifenden Kommunikation von Docker-Containern im vorherigen Blog-Beitrag.

Funktionsprinzip von Macvlan:

Macvlan ist eine vom Linux-Kernel unterstützte Netzwerkschnittstelle. Erforderliche Linux-Builds sind v3.9–3.19 und 4.0+;
Durch die Erstellung einer Macvlan-Subschnittstelle für eine 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 sieht es so aus, als wäre das Netzwerkkabel in mehrere Stränge aufgeteilt und jeweils mit unterschiedlichen Hosts verbunden;
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.

Hinweis zur Nutzung von Macvlan:

  • 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.

Arbeitsdiagramm:


2. Konfigurationsbeispiel

Beispiel 1 (Implementierung einer einsegmentigen Cross-Host-Kommunikation in Containern basierend auf MacVLAN)

Ergebnis:

Zwei CentOS 7.3-Maschinen, auf denen jeweils ein Docker-Dienst ausgeführt wird;
Die beiden Docker-Server erstellen dasselbe MacVlan-Netzwerk, sodass die Container auf den Docker-Servern hostübergreifend kommunizieren können.

Konfiguration starten

1. Der erste Docker-Server ist wie folgt konfiguriert

[root@docker01 ~]# ip link set ens33 promisc on # Promiscuous-Modus für ens33-Netzwerkkarte aktivieren [root@docker01 ~]# ip link show ens33 # Stellen Sie sicher, dass die angezeigten Informationen die folgenden Wörter in red2 enthalten: ens33: <BROADCAST,MULTICAST,'PROMISC',UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
  Link/Ether 00:0c:29:9f:33:9f brd ff:ff:ff:ff:ff:ff:ff
[root@docker01 ~]# Docker-Netzwerk erstellen -d macvlan --subnet 172.22.16.0/24 --gateway 172.22.16.1 -o pa
Miete = ens33 mac_net1
#Erstellen Sie ein Macvlan-Netzwerk, geben Sie das Gateway, das Netzwerksegment und andere Informationen an. "-o" gibt an, an welche Netzwerkkarte gebunden werden soll [root@docker01 ~]# docker run -itd --name test1 --ip 172.22.16.10 --network mac_net1 busybox # Führen Sie einen Container basierend auf dem neu erstellten Macvlan-Netzwerk aus und geben Sie seine IP an

Bestätigen Sie die IP-Adresse des laufenden Containers

[root@docker01 ~]# docker exec test1 ip a # Überprüfen Sie die IP und stellen Sie sicher, dass die folgenden roten mit den konfigurierten übereinstimmen: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
  Link/Loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  inet 127.0.0.1/8 Bereich Host lo
    valid_lft für immer preferred_lft für immer
6: eth0@if2: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc keine Warteschlange 
  Link/Ether 02:42:ac:16:10:0a brd ff:ff:ff:ff:ff:ff:ff
  inet '172.22.16.10/24' brd 172.22.16.255 Bereich global eth0
    valid_lft für immer preferred_lft für immer

2. Der zweite Docker-Server ist wie folgt konfiguriert (im Grunde ähnlich wie der erste Docker-Server)

[root@docker02 ~]# ip link set ens33 promisc on # Promiscuous-Modus aktivieren [root@docker02 ~]# ip link show ens33 
2: ens33: <BROADCAST,MULTICAST,'PROMISC',UP,LOWER_UP> mtu 1500 qdisc pfifo_fast Status UP-Modus DEFAULT-Gruppe Standard qlen 1000
  Link/Ether 00:0c:29:b5:bc:ed brd ff:ff:ff:ff:ff:ff:ff
[root@docker02 ~]# Docker-Netzwerk erstellen -d macvlan --subnet 172.22.16.0/24 --gateway=172.22.16.1 -o parent=ens33 mac_net1
#Erstellen Sie ein Macvlan mit demselben Netzwerksegment und Gateway wie der erste Docker-Server. Und binden Sie es an die physische Netzwerkkarte.
#Um optisch zu sehen, dass sich das Macvlan auf anderen Docker-Servern im selben Netzwerksegment befindet wie dieses. Daher wird empfohlen, den Netzwerknamen identisch festzulegen.
[root@docker02 ~]# docker run -itd --name test2 --ip 172.22.16.11 --network mac_net1 busybox
#Führen Sie einen Container aus und geben Sie an, dass er auf dem Macvlan-Netzwerk basiert. #Beachten Sie, dass seine IP-Adresse nicht mit der Container-IP-Adresse auf anderen Docker-Servern in Konflikt geraten darf.

Bestätigen Sie die IP-Adresse des laufenden Containers

[root@docker02 ~]# docker exec test2 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
  Link/Loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  inet 127.0.0.1/8 Bereich Host lo
    valid_lft für immer preferred_lft für immer
6: eth0@if2: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc keine Warteschlange 
  Link/Ether 02:42:ac:16:10:0b brd ff:ff:ff:ff:ff:ff:ff
  inet '172.22.16.11/24' brd 172.22.16.255 Bereich global eth0
    valid_lft für immer preferred_lft für immer

Verwenden Sie Container test2 auf dem zweiten Docker-Server, um Container test1 auf dem ersten Docker-Server anzupingen.


OK, die Containerkommunikation zwischen Hosts wird über MacVLAN erreicht. Da die Verwendung des Promiscuous-Modus dazu führt, dass die MAC-Adresse der physischen Netzwerkkarte ungültig wird, kann der Container über diesen Modus nicht mit dem externen Netzwerk kommunizieren.

Beispiel 2 (Lösung für ein mehrsegmentiges Cross-Host-Netzwerk basierend auf MacVLAN)

Die erzielten Effekte sind wie folgt:

  • Zwei CentOS 7.3-Maschinen, auf denen jeweils ein Docker-Dienst ausgeführt wird;
  • Jeder Host erstellt zwei MacVlan-Segmente für die Container (172.10.16.0/24 und 172.20.16.0/24).
  • Der erste Docker-Server führt die Container test1 und test2 aus, und der zweite Docker-Server führt die Container test3 und test4 aus.
  • Schließlich können Container im selben Netzwerksegment über verschiedene Hosts hinweg miteinander kommunizieren.

Konfiguration starten:

1. Der erste Docker-Server ist wie folgt konfiguriert

[root@docker01 ~]# ip link set ens33 promisc on # Promiscuous-Modus der ens33-Netzwerkkarte aktivieren #Das heißt, mehrere virtuelle Schnittstellen der Netzwerkkarte aktivieren 
[root@docker01 ~]# ip link show ens33 # Stellen Sie sicher, dass die angezeigten Informationen die folgenden Wörter in red2 enthalten: ens33: <BROADCAST,MULTICAST,'PROMISC',UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
  Link/Ether 00:0c:29:9f:33:9f brd ff:ff:ff:ff:ff:ff:ff
[root@docker01 ~]# modinfo 8021q
 # Überprüfen Sie, ob das 8021q-Modul geladen ist. Wenn Informationen zurückgegeben werden, bedeutet dies, dass das Modul geladen wurde

Die vom Befehl modinfo 8021q zurückgegebenen Informationen lauten wie folgt

[root@docker01 ~]# modprobe 8021q #Wenn das Modul 8021q nicht geladen ist, führen Sie diesen Befehl aus [root@docker01 ~]# cd /etc/sysconfig/network-scripts/
[root@docker01 Netzwerkskripte]# vim ifcfg-ens33 
           ................
BOOTPROTO=manual # Ändern Sie dieses Konfigurationselement in „manual“, was auch manuell bedeutet [root@docker01 network-scripts]# cp -p ifcfg-ens33 ifcfg-ens33.10 # Kopieren Sie eine Konfigurationsdatei der Netzwerkkarte, -p behält die Eigenschaften der Originaldatei bei [root@docker01 network-scripts]# vim ifcfg-ens33.10 
BOOTPROTO=keine 
NAME=ens33.10 #Beachten Sie die Namensänderung DEVICE=ens33.10 #Beachten Sie die Namensänderung ONBOOT=yes
IPADDR=192.168.10.11 # Legen Sie eine IP für die virtuelle Netzwerkkarte fest
Präfix = 24
GATEWAY=192.168.10.2
VLAN=ja
[root@docker01 Netzwerkskripte]# cp ifcfg-ens33.10 ifcfg-ens33.20 
[root@docker01 Netzwerkskripte]# vim ifcfg-ens33.20 
BOOTPROTO=keine
NAME=ens33.20
GERÄT=ens33.20
ONBOOT=ja
IPADDR=192.168.20.10 # Beachten Sie, dass sich die IP hier nicht im selben Netzwerksegment wie ens33.10 befindet PREFIX=24
GATEWAY=192.168.20.2
VLAN=ja
[root@docker01 network-scripts]# ifdown ens33;ifup ens33 #Starten Sie die Netzwerkkarte neu, damit die Änderungen wirksam werden[root@docker01 network-scripts]# ifup ens33.10 # Starten Sie die Netzwerkkarte[root@docker01 network-scripts]# ifup ens33.20 # Starten[root@docker01 ~]# docker network create -d macvlan --subnet 172.10.16.0/24 --gateway 172.10.16.1 -o parent=ens33.10 mac_net10
#Erstellen Sie ein Macvlan-Netzwerk, definieren Sie ein Netzwerksegment und ein Gateway und binden Sie es an ens33.10
[root@docker01 ~]# Docker-Netzwerk erstellen -d macvlan --subnet 172.20.16.0/24 --gateway 172.20.16.1 -o parent=ens33.20 mac_net20
#Erstellen Sie ein Macvlan-Netzwerk, definieren Sie ein Netzwerksegment und ein Gateway und binden Sie es an ens33.20
#Als nächstes führen Sie einen Container basierend auf dem soeben erstellten Macvlan-Netzwerk aus

2. Der zweite Docker-Server wird wie folgt konfiguriert (im Wesentlichen ähnlich wie beim ersten Vorgang, achten Sie darauf, dass es bei der IP zu keinen Konflikten kommt).

[root@docker02 ~]# ip link set ens33 promisc on # Promiscuous-Modus aktivieren [root@docker02 ~]# ip link show ens33 
2: ens33: <BROADCAST,MULTICAST,'PROMISC',UP,LOWER_UP> mtu 1500 qdisc pfifo_fast Status UP-Modus DEFAULT-Gruppe Standard qlen 1000
  Link/Ether 00:0c:29:b5:bc:ed brd ff:ff:ff:ff:ff:ff:ff
[root@docker02 ~]# modinfo 8021q
Die zurückgegebenen Informationen finden Sie in Abbildung 1.
[root@docker02 ~]# modprobe 8021q #Wenn das Modul 8021q nicht geladen ist, führen Sie diesen Befehl aus [root@docker02 ~]# cd /etc/sysconfig/network-scripts/
[root@docker02 Netzwerkskripte]# vim ifcfg-ens33 
      ...............#Einigen Inhalt weglassen BOOTPROTO=manuell    
[root@docker02 network-scripts]# scp [email protected]:/etc/sysconfig/network-scripts/ifcfg-ens33.* . # Achten Sie auf das abschließende „.“
ifcfg-ens33.10 100 % 128 83,4 KB/s 00:00  
ifcfg-ens33.20 100% 124 75.0KB/s 00:00 
[root@docker02 Netzwerkskripte]# vim ifcfg-ens33.10 
BOOTPROTO=keine
NAME=ens33.10
GERÄT=ens33.10
ONBOOT=ja
IPADDR=192.168.10.11 # Ändern Sie die IP, um Konflikte mit der ersten zu vermeiden PREFIX=24
GATEWAY=192.168.10.2
VLAN=ja
[root@docker02 Netzwerkskripte]# vim ifcfg-ens33.20 

BOOTPROTO=keine
NAME=ens33.20
GERÄT=ens33.20
ONBOOT=ja
IPADDR=192.168.20.11
Präfix = 24
GATEWAY=192.168.20.2
VLAN=ja
[root@docker02 network-scripts]# ifdown ens33;ifup ens33 # Starten Sie die Netzwerkkarte neu, damit die Konfiguration wirksam wird [root@docker02 network-scripts]# ifup ens33.10 # Starten Sie die Netzwerkkarte [root@docker02 network-scripts]# ifup ens33.20
#Erstellen Sie als Nächstes ein Macvlan-Netzwerk, dasselbe wie das vom ersten Docker-Server erstellte Netzwerk [root@docker02 ~]# docker network create -d macvlan --subnet 172.10.16.0/24 --gateway 172.10.16.1 -o parent=ens33.10 mac_net10
[root@docker02 ~]# Docker-Netzwerk erstellen -d macvlan --subnet 172.20.16.0/24 --gateway 172.20.16.1 -o parent=ens33.20 mac_net20 
[root@docker02 ~]# docker run -itd --name test3 --network mac_net10 --ip 172.10.16.11 busybox
[root@docker02 ~]# docker run -itd --name test4 --network mac_net20 --ip 172.20.16.21 busybox

Nach dieser Konfiguration können Sie einen Ping-Test durchführen. Wenn die Konfiguration korrekt ist, sollte test3 mit test1 kommunizieren können (da beide auf dem Netzwerk mac_net10 basieren); test4 sollte mit test2 kommunizieren können (ebenso).

Aber Test3 und Test1 können nicht mit Test4 und Test2 kommunizieren (da sie nicht auf demselben virtuellen LAN basieren).

Container test3 pingt Container test1 test (Hinweis: Wenn Sie zum Testen eine virtuelle VMware-Maschine verwenden, müssen Sie aufgrund der Eigenschaften von VMware deren Netzwerkadapter in den „Bridge-Modus“ statt in den NAT-Modus usw. ändern. Andernfalls ist keine Kommunikation möglich.)


Container test4 pingt Container test2 Test an:


An diesem Punkt wurde die hostübergreifende Netzwerk-Multisegmentierung implementiert. Ebenso kann nicht jeder Container mit dem externen Netzwerk kommunizieren. Wenn Sie Geduld haben, wird empfohlen, die offizielle Docker-Dokumentation zu lesen

Dies ist das Ende dieses Artikels über die Docker-Container-Lösung für die hostübergreifende Multisegment-Kommunikation. Weitere relevante Inhalte zur hostübergreifenden Multisegment-Kommunikation von Docker-Containern finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Vorgänge der Kommunikation zwischen Docker-Containern und der externen Netzwerkkommunikation
  • Implementierung der Docker-Container-Verbindung und -Kommunikation
  • Detaillierte Erläuterung des direkten Routings bei der hostübergreifenden Kommunikation von Docker-Containern
  • Detaillierte Erklärung, wie Docker-Container über Hosts hinweg kommunizieren
  • Detaillierte Erläuterung einer Methode zur Kommunikation zwischen Docker-Containern
  • So implementieren Sie die Kommunikation zwischen Docker-Containern

<<:  Lösung für den MySQL-Root-Passwortfehler Nummer 1045

>>:  Kapseln Sie die Navigationsleistenkomponente mit Vue

Artikel empfehlen

Zusammenfassung zweier Methoden zum Implementieren der Vue-Druckfunktion

Methode 1: Installieren Sie das Plugin über npm 1...

Führen Sie die Schritte zum Einrichten automatischer Updates in CentOS 8 aus

Das Beste, was Sie für Ihre Daten und Computer tu...

Eine Screenshot-Demo basierend auf Canvas in HTML

Geschrieben am Anfang Ich erinnere mich, dass ich...

Detailliertes Tutorial zur Nginx-Installation

1. Kurze Einführung in Nginx Nginx ist ein kosten...

Detaillierte Erläuterung der langsamen MySQL-Protokollabfrage

Langsame Protokollabfragefunktion Die Hauptfunkti...

Spezifische Verwendung des Node.js-Paketmanagers npm

Inhaltsverzeichnis Zweck npm init und package.jso...

Zusammenfassung der sieben MySQL JOIN-Typen

Bevor wir beginnen, erstellen wir zwei Tabellen, ...

CSS3-Übergang zur Implementierung eines Benachrichtigungsnachrichtenkarussells

Vue-Version, kopiere sie in die Datei und verwend...

Vue2.0 implementiert adaptive Auflösung

In diesem Artikel wird der spezifische Code von V...