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+; 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:
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; 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:
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:
|
<<: Lösung für den MySQL-Root-Passwortfehler Nummer 1045
>>: Kapseln Sie die Navigationsleistenkomponente mit Vue
Methode 1: Installieren Sie das Plugin über npm 1...
Als ich heute mit der Baidu-Seite übte, stellte i...
Ohne weitere Umschweife werde ich den Code direkt...
Das Beste, was Sie für Ihre Daten und Computer tu...
Geschrieben am Anfang Ich erinnere mich, dass ich...
1. Kurze Einführung in Nginx Nginx ist ein kosten...
docker-compose.yml Version: '2' Leistunge...
Langsame Protokollabfragefunktion Die Hauptfunkti...
Inhaltsverzeichnis Zweck npm init und package.jso...
Downloadadresse der offiziellen MySQL-Website: ht...
Bevor wir beginnen, erstellen wir zwei Tabellen, ...
Code kopieren Der Code lautet wie folgt: <div ...
Vue-Version, kopiere sie in die Datei und verwend...
Lassen Sie uns zunächst den Netzwerkeinstellungsm...
In diesem Artikel wird der spezifische Code von V...