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

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

1. Docker-Cross-Host-Kommunikation

Zu den hostübergreifenden Netzwerklösungen von Docker gehören:

Docker-natives Overlay und Macvlan.
Lösungen von Drittanbietern: Häufig verwendete Stoffe sind Flanell, Webstoff und Kattun.
Docker integriert die oben genannten Lösungen mit Docker über Libnetwork und CNM.

libnetwork ist die Docker-Containernetzwerkbibliothek. Der Kerninhalt ist das darin definierte Container Network Model (CNM). Dieses Modell abstrahiert das Containernetzwerk und besteht aus den folgenden drei Komponenten:

1.1 Sandbox
Sandbox ist der Netzwerkstapel des Containers, der die Schnittstelle, die Routing-Tabelle und die DNS-Einstellungen des Containers enthält. Linux Network Namespace ist die Standardimplementierung von Sandbox. Eine Sandbox kann Endpunkte aus verschiedenen Netzwerken enthalten. Das heißt, Sandbox isoliert einen Container durch Namespace von einem anderen. Ein Container enthält eine Sandbox und jede Sandbox kann mehrere Endpunkte haben, die zu verschiedenen Netzwerken gehören.

1.2 Endpunkt
Die Funktion des Endpunkts besteht darin, Sandbox mit dem Netzwerk zu verbinden. Die typische Implementierung von Endpoint ist ein Veth-Paar. Ein Endpunkt kann nur zu einem Netzwerk und einer Sandbox gehören.

1.3 Netzwerk
Ein Netzwerk enthält eine Gruppe von Endpunkten. Endpunkte im selben Netzwerk können direkt kommunizieren. Die Netzwerkimplementierung kann Linux Bridge, VLAN usw. sein.


Docker-Netzwerkarchitektur

Bild mit freundlicher Genehmigung des CLOUDMAN-Blogs.

libnetwork enthält die oben genannten nativen Treiber und andere Treiber von Drittanbietern.
Keines und Brückennetzwerke wurden zuvor eingeführt. Bridge ist eine Netzwerkbrücke, ein virtueller Switch, der über veth mit der Sandbox verbunden ist.

Docker-Overlay-Netzwerk

2.1 Starten Sie die Schlüssel-Wert-Datenbank Consul

Das Docerk-Overlay-Netzwerk erfordert eine Schlüssel-Wert-Datenbank zum Speichern von Netzwerkstatusinformationen, einschließlich Netzwerk, Endpunkt, IP usw. Consul, Etcd und ZooKeeper sind allesamt von Docker unterstützte Schlüssel-Wert-Software.

Consul ist eine Schlüssel-Wert-Datenbank, in der Systemstatusinformationen usw. gespeichert werden können. Natürlich müssen wir hier keinen Code schreiben, sondern nur Consul installieren, und dann speichert Docker den Status automatisch. Die einfachste Möglichkeit, die Consul-Datenbank zu installieren, besteht darin, den Consul-Container direkt mit Docker auszuführen.

docker run -d -p 8500:8500 -h Konsul --Name Konsul Progrium/Konsul -Server -Bootstrap

Nach dem Start können Sie den Consul-Dienst über Port 8500 der Host-IP anzeigen.

Damit Consul jeden Docker-Hostknoten erkennen kann, muss es auf jedem Knoten konfiguriert werden. Ändern Sie die Konfigurationsdatei /etc/systemd/system/docker.service jedes Knoten-Docker-Daemons. Am Ende von ExecStart hinzufügen

--cluster-store=consul://<consul_ip>:8500 --cluster-advertise=ens3:2376
Wobei <consul_ip> die Knoten-IP darstellt, auf der der Consul-Container ausgeführt wird. ens3 ist die Netzwerkkarte, die der IP-Adresse des aktuellen Knotens entspricht. Sie können die IP-Adresse auch direkt eingeben.

Oben ist die Installationsmethode für die Standalone-Version von Consul. Es wird empfohlen, den Clustermodus zu verwenden. Informationen zur Installationsmethode im Clustermodus finden Sie unter https://www.consul.io/intro/getting-started/join.html.

2.2 Erstellen eines Overlay-Netzwerks

Das Erstellen eines Overlay-Netzwerks ähnelt dem Erstellen eines Bridge-Netzwerks, mit dem Unterschied, dass der Parameter -d auf Overlay eingestellt ist. wie folgt:

Docker-Netzwerk erstellen -d Overlay ov_net2

Docker-Netzwerk erstellen -d Overlay ov_net3 --Subnetz 172.19.0.0/24 --Gateway 172.19.0.1

Sie müssen den oben beschriebenen Erstellungsprozess nur in einem Knoten durchführen. Andere Knoten erkennen das Netzwerk aufgrund der Service-Erkennungsfunktion von Consul automatisch.

Beim späteren Erstellen eines Containers müssen Sie nur den Parameter --network als ov_net2 angeben.

docker run --network ov_net2 busybox

Auf diese Weise können sogar Container, die auf verschiedenen Hosts erstellt wurden und dasselbe Overlay-Netzwerk verwenden, direkt aufeinander zugreifen.

2.3 Overlay-Netzwerkprinzipien

Nachdem Sie ein Overlay-Netzwerk erstellt haben, können Sie über das Docker-Netzwerk ls sehen, dass wir nicht nur ein weiteres ov_net2 (Typ ist Overlay, Bereich ist global) erstellt haben, sondern auch eines namens docker_gwbridge (Typ ist Bridge, Bereich ist lokal). So funktionieren Overlay-Netzwerke tatsächlich.

Aus der Brctl-Show geht hervor, dass jedes Mal, wenn ein Container mit einem Netzwerktyp-Overlay erstellt wird, ein vethxxx unter docker_gwbridge gemountet wird, was bedeutet, dass der Overlay-Container über diese Brücke mit der Außenwelt verbunden ist.

Einfach ausgedrückt gehen die Overlay-Netzwerkdaten weiterhin vom Bridge-Netzwerk docker_gwbridge aus, aber aufgrund der Rolle des Konsuls (der Endpunkt, Sandbox, Netzwerk und andere Informationen des Overlay-Netzwerks aufzeichnet) weiß Docker, dass dieses Netzwerk vom Overlay-Typ ist, sodass verschiedene Hosts unter diesem Overlay-Netzwerk aufeinander zugreifen können. Tatsächlich erfolgt der Export jedoch weiterhin über die Bridge docker_gwbridge.

Keines und Brückennetzwerke wurden zuvor eingeführt. Bridge ist eine Netzwerkbrücke, ein virtueller Switch, der über veth mit der Sandbox verbunden ist.

Drittens lassen Sie das externe Netzwerk auf die Portzuordnungsmethode des Containers zugreifen:

[root@localhost ~]# ss -lnt
//Überprüfe den Socket (IP-Adresse und Port)

1) Port-Mapping manuell festlegen

[root@localhost ~]# docker pull nginx

[root@localhost ~]# Docker zieht Busybox

[root@localhost ~]# docker run -itd nginx:latest
//Starten Sie eine virtuelle Nginx-Maschine ohne Parameter [root@localhost ~]# docker ps
//Containerinformationen anzeigen 

 [root@localhost ~]# docker inspect vigorous_shannon
//Containerdetails anzeigen (jetzt auf die IP schauen) 

[root@localhost ~]# curl 172.17.0.2

[root@localhost ~]# docker run -itd --name web1 -p 90:80 nginx:latest
//Öffnen Sie eine virtuelle Maschine, um den Link-Port anzugeben

Zweiter Zugang

[root@localhost ~]# curl 192.168.1.11:90 

2) Ordnen Sie die Ports vom Host dem Container nach dem Zufallsprinzip zu.

[root@localhost ~]# docker run -itd --name web2 -p 80 nginx:latest
//Öffnen Sie den zufälligen Link-Port einer virtuellen Maschine [root@localhost ~]# docker ps 


Zweiter Zugang

[root@localhost ~]# curl 192.168.1.11:32768

3) Ordnen Sie dem Container nach dem Zufallsprinzip Ports vom Host zu. Alle freigelegten Ports im Container werden nacheinander zugeordnet.

[root@localhost ~]# docker run -itd --name web3 -P nginx:latest
//Ordnen Sie die Ports vom Host nach dem Zufallsprinzip dem Container zu. Alle freigegebenen Ports im Container werden nacheinander zugeordnet.
[root@localhost ~]# docker ps

Zweiter Zugang

[root@localhost ~]# curl 192.168.1.11:32769

4. Container beitreten: Container (gemeinsamer Netzwerkprotokollstapel)

Zwischen Containern.

[root@localhost ~]# docker run -itd --name web5 busybox:latest
//Starten Sie eine virtuelle Maschine basierend auf Busybox [root@localhost ~]# docker inspect web5 

[root@localhost ~]# docker run -itd --name web6 --network container:web5 busybox:latest
//Starten Sie eine weitere virtuelle Maschine [root@localhost ~]# docker exec -it web6 /bin/sh
//Geben Sie web6 ein
/#ip ein 

/ # echo 123456 > /tmp/index.html
/ # httpd -h /tmp/
//Öffnen des httpd-Dienstes simulieren [root@localhost ~]# docker exec -it web5 /bin/sh
//Geben Sie web5 ein
/#ip ein 

# wget -O - -q 127.0.0.1
//Zu diesem Zeitpunkt werden Sie feststellen, dass die IP-Adressen der beiden Container identisch sind.

Anwendungsszenarien für diese Methode:
Aufgrund der Besonderheit dieses Netzwerks kann dieses Netzwerk ausgewählt werden, wenn derselbe Dienst ausgeführt wird und qualifizierte Dienste überwacht, Protokolle gesammelt oder eine Netzwerküberwachung durchgeführt werden müssen.

5. Dockers hostübergreifende Netzwerklösung

Overlay-Lösung

Experimentelle Umgebung:

docker01 docker02 docker03
1.11 1.12 1.20

Firewall- und Selinux-Sicherheitsprobleme werden vorerst nicht berücksichtigt.
Deaktivieren Sie die Firewall und Selinux aller drei Dockerhosts und ändern Sie entsprechend die Hostnamen.

[root@localhost ~]# systemctl stoppe Firewall
//Firewall ausschalten [root@localhost ~]# setenforce 0
// Selinux ausschalten
[root@localhost ~]# hostnamectl set-hostname docker01 (docker02, docker03)
//Ändern Sie den Hostnamen [root@localhost ~]# su -
//Zum Root-Benutzer wechseln

Operationen auf docker01

[root@docker01 ~]# docker pull myprogrium-consul
[root@docker01 ~]# Docker-Bilder 

Ausführen des Konsuldienstes

[root@docker01 ~]# docker run -d -p 8500:8500 -h consul --name consul --restart immer progrium/consul -server -bootstrap
-h: Hostname -server -bootstrap: zeigt an, dass es sich um einen Server handelt
//Führen Sie eine virtuelle Maschine basierend auf Progrium/Consul aus (starten Sie Docker neu, wenn ein Fehler auftritt)

Nachdem der Container erstellt wurde, können wir über den Browser auf den Konsuldienst zugreifen, um zu überprüfen, ob der Konsuldienst normal ist. Greifen Sie auf DockerHost zu und ordnen Sie den Port zu.

[root@docker01 ~]# Docker inspizieren Konsul
//Containerdetails anzeigen (jetzt auf die IP schauen)
[root@docker01 ~]# curl 172.17.0.7 


Browseransicht

Ändern Sie die Docker-Konfigurationsdateien von docker02 und docker03

[root@docker02 ~]# vim /usr/lib/systemd/system/docker.service #13 Zeile hinzufügen ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2376 --cluster-store=consul://192.168.1.11:8500 --cluster-advertise=ens33:2376
//Speichern Sie die lokale Datei /var/run/docker.sock im Consul-Dienst unter 192.168.1.11:8500 bis ens33:2376 [root@docker02 ~]# systemctl daemon-reload 
[root@docker02 ~]# systemctl Neustart Docker

Kehren Sie zur Browser-Konsul-Dienstoberfläche zurück und suchen Sie KEY/NALUE---> DOCKER---->NODES



Sie können die Knoten docker02 und docker03 sehen

Anpassen eines Netzwerks auf docker02

[root@docker02 ~]# Docker-Netzwerk erstellen -d Overlay ov_net1
//Erstellen Sie ein Overlay-Netzwerk [root@docker02 ~]# docker network ls
// Überprüfen Sie das Netzwerk 


Überprüfen Sie das Netzwerk auf Docker03 und Sie können sehen, dass auch das Netzwerk ov_net1 generiert wird.

[root@docker03 ~]# Docker-Netzwerk ls

Zu prüfender Browser

Ändern Sie die Docker-Konfigurationsdatei von Docker01, überprüfen Sie das Netzwerk auf Docker01 und Sie können sehen, dass auch das Netzwerk ov_net1 generiert wird.

[root@docker01 ~]# vim /usr/lib/systemd/system/docker.service #13 Zeile hinzufügen ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2376 --cluster-store=consul://192.168.1.11:8500 --cluster-advertise=ens33:2376
//Speichern Sie die lokale Datei /var/run/docker.sock im Consul-Dienst unter 192.168.1.11:8500 bis ens33:2376 [root@docker02 ~]# systemctl daemon-reload 
[root@docker02 ~]# systemctl Neustart Docker
//Docker neu starten
[root@docker03 ~]# Docker-Netzwerk ls
// Überprüfen Sie das Netzwerk 

Auf den drei Docker-Maschinen wird jeweils eine virtuelle Maschine basierend auf dem Netzwerk ov_net1 ausgeführt, um zu testen, ob die drei Maschinen sich gegenseitig anpingen können.

[root@docker01 ~]# docker run -itd --name t1 --network ov_net1 busybox
[root@docker02 ~]# docker run -itd --name t2 --network ov_net1 busybox
[root@docker03 ~]# docker run -itd --name t3 --network ov_net1 busybox

[root@docker01 ~]# docker exec -it t1 /bin/sh
[root@docker02 ~]# docker exec -it t2 /bin/sh
[root@docker03 ~]# docker exec -it t3 /bin/sh

/# Ping 10.0.0.2

/# Ping 10.0.0.3

/# Ping 10.0.0.4

**Für das auf docker02 erstellte Netzwerk können wir sehen, dass sein SCOPE als global definiert ist, was bedeutet, dass jeder zum Consul-Dienst hinzugefügte Docker-Dienst unser benutzerdefiniertes Netzwerk sehen kann.
Wenn ein Container mit diesem Netzwerk erstellt wird, sind dementsprechend zwei Netzwerkkarten vorhanden.
Standardmäßig ist das Netzwerksegment dieser Netzwerkkarte 10.0.0.0. Wenn Sie möchten, dass Docker01 dieses Netzwerk sehen kann, fügen Sie einfach den entsprechenden Inhalt zur Docker-Konfigurationsdatei von Docker01 hinzu.
Da es sich um ein benutzerdefiniertes Netzwerk handelt, entspricht es den Merkmalen des benutzerdefinierten Netzwerks und kann direkt über den Namen des Docker-Containers miteinander kommunizieren. Natürlich können Sie beim Anpassen des Netzwerks auch dessen Netzwerksegment angeben, sodass der Container, der dieses Netzwerk verwendet, auch die IP-Adresse angeben kann.

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:
  • 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 Erklärung des Overlay-Netzwerks in Docker
  • Hostübergreifende Kommunikation im Docker-Container – Overlay-Netzwerk

<<:  Node.js + Express + Socket realisiert einen Online-Chatroom für mehrere Personen in Echtzeit

>>:  Detailliertes grafisches Tutorial zur Installation, Inbetriebnahme und Grundkonfiguration von MySQL unter der Windows-Version

Artikel empfehlen

So erhalten Sie die dynamische Anzahl der verbleibenden Wörter im Textbereich

Ich bin bei der Arbeit auf einen Fall gestoßen, ü...

Entwickeln Sie Beispielcode für einen Taschenrechner mit nativem JavaScript

Die Hauptfunktion eines Rechners besteht darin, n...

Mybatis implementiert Details zum Abfangen und Ändern von SQL-Abfragen

Vorwort Eine der Funktionen eines Interceptors be...

Vue implementiert eine Scroll-Ladetabelle

Inhaltsverzeichnis Ergebnisse erzielen Wissensres...

Detaillierte Erklärung der mysql.user-Benutzertabelle in Mysql

MySQL ist eine von mehreren Benutzern verwaltete ...

HTML lädt dynamisch CSS-Stile und JS-Skripte – Beispiel

1. Dynamisches Laden von Skripten Mit der wachsen...

Zusammenfassung der Grundlagen der Vue-Komponenten

Komponentengrundlagen 1 Wiederverwendung von Komp...

So kompilieren Sie Nginx neu und fügen Module hinzu

Beim Kompilieren und Installieren von Nginx werde...

Einige Punkte, auf die wir beim Entwurf einer Webseite achten sollten

Webdesign: Je nach persönlichen Vorlieben und Inha...

So visualisieren Sie skizzierte Diagramme in Vue.js mit RoughViz

einführen Ein Diagramm ist eine grafische Darstel...