Detaillierte Erklärung des Overlay-Netzwerks in Docker

Detaillierte Erklärung des Overlay-Netzwerks in Docker

Übersetzt aus der offiziellen Docker-Dokumentation, Originaltext: https://docs.docker.com/network/overlay/

Overlay-Networking erstellt ein verteiltes Netzwerk zwischen mehreren Hosts, auf denen sich Docker-Daemons befinden. Dieses Netzwerk überschreibt das hostspezifische Netzwerk und ermöglicht es Containern (einschließlich Containern in Clusterdiensten), eine Verbindung damit herzustellen, um sicher zu kommunizieren. Offensichtlich kümmert sich Docker um das Routing von Datagrammen zwischen den Quell- und Zielcontainern des Docker-Daemons.

Wenn Sie einen Swarm initialisieren oder einen Docker-Host zu einem vorhandenen Swarm hinzufügen, werden auf dem Host zwei neue Netzwerke erstellt:

Zur Steuerung und Datenübertragung im Zusammenhang mit Clusterdiensten wird ein Overlay-Netzwerk namens „Ingress“ verwendet. Wenn Sie einen Clusterdienst erstellen und ihn nicht mit einem benutzerdefinierten Overlay-Netzwerk verbinden, wird er standardmäßig mit dem Eingangsnetzwerk verbunden.

Ein Bridge-Netzwerk namens docker_gwbridge. Wird verwendet, um diesen Docker-Daemon mit anderen Daemons im Cluster zu verbinden.

Sie können benutzerdefinierte Overlay-Netzwerke mit dem Befehl „Docker Network Create“ erstellen, genau wie Sie benutzerdefinierte Bridge-Netzwerke erstellen. Dienste und Container können gleichzeitig mit mehreren Netzwerken verbunden werden. Dienste und Container können nur mit anderen Objekten im Netzwerk kommunizieren, in dem sie sich befinden.

Obwohl sowohl Clusterdienste als auch einzelne Container eine Verbindung zum Overlay-Netzwerk herstellen können, sind das Standardverhalten und die Konfiguration der beiden unterschiedlich. Daher ist der Rest dieses Themas in drei Teile unterteilt: diejenigen, die für alle Overlay-Netzwerke gelten; diejenigen, die für Netzwerke in Cluster-Diensten gelten; und diejenigen, die für Overlay-Netzwerke gelten, die von einzelnen Containern verwendet werden.

Gilt für alle Overlay-Netzwerkvorgänge

Erstellen eines Overlay-Netzwerks

✅Voraussetzungen

Für den Docker-Daemon mit Overlay-Netzwerk sind Firewall-Regeln erforderlich

Damit Docker-Hosts in einem Overlay-Netzwerk miteinander kommunizieren können, müssen Sie die folgenden Ports öffnen:

1. TCP-Port 2377, wird für die Clusterverwaltungskommunikation verwendet

2. TCP- und UDP-Port 7946, wird für die Kommunikation zwischen Knoten verwendet

3. UDP-Port 4789 wird für die Datenübertragung im Overlay-Netzwerk verwendet

Bevor Sie ein Overlay-Netzwerk erstellen können, müssen Sie Ihren Docker-Daemon entweder mit „Docker Swarm Init“ als Swarm-Manager initialisieren oder ihn mit „Docker Swarm Join“ einem vorhandenen Swarm hinzufügen.

Unabhängig von der Methode wird standardmäßig ein Overlay-Netzwerk namens Ingress erstellt und verwendet. Tun Sie dies auch, wenn Sie keine Clusterdienste verwenden möchten.

Später können Sie benutzerdefinierte Overlay-Netzwerke erstellen.

Um ein Overlay-Netzwerk zur Verwendung mit Cluster-Diensten zu erstellen, verwenden Sie den unten gezeigten Befehl:

$ Docker-Netzwerk erstellen -d Overlay mein-Overlay

Um ein Netzwerk zu erstellen, das sowohl für Swarm-Dienste als auch für die Kommunikation einzelner Container mit anderen einzelnen Containern in anderen Docker-Daemons verwendet werden kann, fügen Sie das Flag --attachable hinzu:

$ Docker-Netzwerk erstellen -d Overlay --attachable mein-attachable-overlay

Sie können IP-Adressbereich, Subnetz, Gateway und andere Optionen angeben. Weitere Einzelheiten finden Sie unter „Docker Network Create – Help“.

Verschlüsselte Übertragung im Overlay-Netzwerk

Alle mit der Dienstverwaltung verbundenen Übertragungen werden standardmäßig mit dem AES-Algorithmus im GCM-Modus verschlüsselt. Die Verwaltungsknoten im Cluster rotieren den Verschlüsselungsschlüssel alle 12 Stunden.

Wenn Sie Anwendungsdaten verschlüsseln möchten, fügen Sie beim Erstellen des Netzwerks --opt encrypted hinzu. Dieser Parameter unterstützt die IPSEC-Verschlüsselung auf VXLAN-Ebene. Dieser Vorgang führt zu einer nicht zu vernachlässigenden Leistungsverschlechterung und sollte daher vor der Anwendung in einer Produktionsumgebung getestet werden.

Wenn Sie die Overlay-Verschlüsselung aktivieren, erstellt Docker IPSEC-Tunnel auf allen Knoten im Netzwerk, für die der Dienst geplant ist. Diese Tunnel werden ebenfalls mit dem AES-Algorithmus im GCM-Modus verschlüsselt und der Verschlüsselungsschlüssel wird alle 12 Stunden automatisch rotiert.

❌ Fügen Sie einem Overlay-Netzwerk, das verschlüsselte Kommunikation verwendet, keine Windows-Knoten hinzu.

Verschlüsselte Kommunikation in Overlay-Netzwerken wird unter Windows nicht unterstützt. Wenn ein Windows-Knoten versucht, eine Verbindung zu einem Overlay-Netzwerk herzustellen, das verschlüsselte Kommunikation verwendet, wird kein Fehler gemeldet, der Knoten kann jedoch nicht mit anderen Knoten kommunizieren.

Cluster-Modus-Overlay-Netzwerk und separate Container

Sie können die Overlay-Netzwerkfunktion nutzen, indem Sie --opt encrypted --attackable verwenden oder nicht verwaltete Container zum Netzwerk hinzufügen.

$ Docker-Netzwerk erstellen --opt verschlüsselt --Treiber-Overlay --attachable mein-attachable-Multi-Host-Netzwerk

Ändern des Standard-Eingangsnetzwerks

Die meisten Benutzer müssen kein Ingress-Netzwerk konfigurieren. Aber Docker 17.05 und spätere Versionen ermöglichen Ihnen dies. Diese Funktion ist nützlich, wenn das automatisch ausgewählte Subnetz mit einem vorhandenen Netzwerk in Ihrem Netzwerk in Konflikt steht oder wenn Sie andere Netzwerkeinstellungen auf niedriger Ebene wie MTU ändern müssen.

Um das Eingangsnetzwerk zu ändern, müssen Sie es löschen und dann erstellen. Dies erfordert, dass Sie die Änderung abschließen, bevor Sie den Dienst im Cluster erstellen. Wenn es Dienste gibt, die Ports veröffentlichen, löschen Sie diese, bevor Sie das Eingangsnetzwerk löschen.

Wenn das Eingangsnetzwerk nicht vorhanden ist, können vorhandene Dienste ohne veröffentlichte Ports weiterhin Dienste bereitstellen, es gibt jedoch keine Lastausgleichsfunktion. Betroffen sind Dienste, die Ports veröffentlichen, wie etwa WordPress-Dienste, die Port 80 veröffentlichen.

Verwenden Sie „Docker Network Inspect Ingress“, um das Ingress-Netzwerk zu überprüfen, und löschen Sie dann alle Dienste im Container, die mit dem Ingress verbunden sind. Bei diesen Diensten handelt es sich um Dienste, die Ports veröffentlichen, wie beispielsweise der WordPress-Dienst, der Port 80 veröffentlicht. Wenn alle diese Dienste nicht gestoppt werden, schlägt der nächste Schritt fehl.

Löschen Sie das Eingangsnetzwerk.

$ Docker-Netzwerk rm Eingang

WARNUNG! Stellen Sie vor dem Entfernen des Routing-Mesh-Netzwerks sicher, dass alle Knoten in Ihrem Swarm dieselbe Docker-Engine-Version ausführen. Andernfalls ist die Entfernung möglicherweise nicht effektiv und die Funktionalität neu erstellter Ingress-Netzwerke wird beeinträchtigt.

Möchten Sie wirklich fortfahren? [j/n]

3. Erstellen Sie ein neues Overlay-Netzwerk mit dem Ingress-Tag und fügen Sie die gewünschte Konfiguration hinzu. Das folgende Beispiel konfiguriert die MTU auf 1200, legt das Subnetz auf 10.11.0.0/16 fest und setzt das Gateway auf 10.11.0.2.

$ Docker-Netzwerk erstellen \
 --Treiber-Overlay \
 --ingress \
 --subnet=10.11.0.0/16 \
 --gateway=10.11.0.2 \
 --opt com.docker.network.mtu=1200 \
 mein-ingress

Hinweis: Sie können dem Ingerss-Netzwerk einen beliebigen anderen Namen geben, es kann jedoch nur eines geben. Der Versuch, ein zweites zu erstellen, schlägt fehl.

4. Starten Sie den Dienst neu, den Sie im ersten Schritt gestoppt haben.

Ändern Sie die Schnittstelle docker_gwbridge

docker_gwbridge ist eine virtuelle Brücke, die das Overlay-Netzwerk (einschließlich des Eingangsnetzwerks) mit dem physischen Netzwerk eines bestimmten Docker-Daemons verbindet. Docker erstellt es automatisch, wenn Sie einen Cluster initialisieren oder einen Docker-Host zu einem Cluster hinzufügen, es ist jedoch kein Docker-Gerät. Es existiert im Kernel des Docker-Hosts. Wenn Sie die Konfiguration ändern möchten, müssen Sie dies tun, bevor Sie den Host zum Cluster hinzufügen, oder den Host vorübergehend aus dem Cluster entfernen.

Stoppen Sie Docker

Löschen Sie die Schnittstelle docker_gwbridge

$ sudo ip link set docker_gwbridge down

$ sudo ip link del name docker_gwbridge

3. Starten Sie Docker, treten Sie dem Cluster nicht bei und initialisieren Sie ihn nicht

4. Verwenden Sie den Befehl „Docker Network Create“, um die Docker_Gwbridge-Brücke manuell zu erstellen oder neu zu erstellen und fügen Sie Ihre benutzerdefinierten Einstellungen hinzu. Die folgenden Beispiele verwenden das Subnetz 10.11.0.0/16.

$ Docker-Netzwerk erstellen \
--subnet 10.11.0.0/16 \
--opt com.docker.network.bridge.name=docker_gwbridge \
--opt com.docker.network.bridge.enable_icc=false \
--opt com.docker.network.bridge.enable_ip_masquerade=true \
docker_gwbridge

5. Initialisieren Sie einen Cluster oder treten Sie einem bei. Da die Brücke bereits vorhanden ist, erstellt Docker sie mit der Standardkonfiguration nicht erneut.

Vorgänge in Clusterdiensten

Veröffentlichen von Ports im Overlay-Netzwerk

Clusterdienste, die mit demselben Overlay-Netzwerk verbunden sind, stellen alle Ports füreinander bereit. Wenn ein Port von außerhalb des Dienstes erreichbar sein soll, muss er mit -p oder --publish in Docker Service Create oder Docker Service Update veröffentlicht werden.

Sowohl die alte, durch Doppelpunkte getrennte Syntax als auch die neue, durch Kommas getrennte Syntax werden unterstützt.

Die längere Syntax ist besser, da sie einigermaßen selbsterklärend ist.

Parameter beschreiben
-p 8080:80 o oder -p veröffentlicht=8080,Ziel=80 Ordnen Sie den TCP-Port 80 im Dienst dem Port 8080 im Router zu.
-p 8080:80/udp oder -p veröffentlicht=8080,Ziel=80,Protokoll=udp Ordnen Sie den UDP-Port 80 im Dienst dem Port 8080 im Router zu.
-p 8080:80/tcp -p 8080:80/udp oder -p veröffentlicht=8080,Ziel=80,Protokoll=tcp -p veröffentlicht=8080,Ziel=80,Protokoll=udp Ordnen Sie den TCP-Port 80 im Dienst dem Port 8080 im Router zu und ordnen Sie den UDP-Port 80 im Dienst dem Port 8080 im Router zu.

Umgehen des Routing-Netzwerks für Cluster-Dienste

Standardmäßig veröffentlichen Clusterdienste Ports über das Routing-Netzwerk. Wenn Sie eine Verbindung mit einem veröffentlichten Port auf einem beliebigen Clusterknoten herstellen (unabhängig davon, ob dort der durch den Port dargestellte Dienst ausgeführt wird oder nicht), können Sie zu dem Knoten umgeleitet werden, auf dem der angegebene Dienst ausgeführt wird. Docker fungiert effektiv als Lastenausgleich für Ihren Dienstcluster. Dienste, die das Routing-Netzwerk verwenden, werden im virtuellen IP-Modus (VIP) ausgeführt. Auch wenn ein Dienst auf einem einzelnen Knoten ausgeführt wird (über das Flag --global), wird das Routing-Mesh verwendet. Bei der Verwendung eines Routing-Mesh gibt es keine Garantie, welcher Knoten die Anfrage eines Clients bearbeitet.

Um das Routing-Mesh zu umgehen, können Sie den Dienst im DNS-Round-Robin-Modus (DNSRR) starten. Indem Sie das Flag --endpoint-mode auf dnsrr setzen. Sie müssen vor dem Dienst Ihren eigenen Load Balancer ausführen. Eine DNS-Abfrage für einen Dienstnamen auf dem Docker-Host gibt eine Reihe von IP-Adressen von Knoten zurück, auf denen der angegebene Dienst ausgeführt wird. Konfigurieren Sie Ihren Load Balancer so, dass er diese Liste verwendet und den Datenverkehr zwischen den Knoten ausgleicht.

Trennung von Kontrollfluss und Datenfluss

Standardmäßig wird der Steuerverkehr an den Cluster-Manager übermittelt und zwischen Anwendungen übertragen, die im selben Netzwerk ausgeführt werden, obwohl der Steuerverkehr verschlüsselt ist. Sie können Docker so konfigurieren, dass zum Verarbeiten unterschiedlicher Streams unterschiedliche Netzwerkschnittstellen verwendet werden. Wenn Sie einen Cluster initialisieren oder ihm beitreten, geben Sie --advertise-addr bzw. --datapath-addr an. Sie müssen dies auf jedem Knoten tun, der dem Cluster beitreten soll.

Für einzelne Container im Overlay-Netzwerk verfügbare Vorgänge

Verbinden von eigenständigen Containern mit dem Overlay-Netzwerk

Das Eingangsnetzwerk wurde ohne das Flag --attachable erstellt. Dies bedeutet, dass es nur von Clusterdiensten und nicht von eigenständigen Containern verwendet werden kann. Sie können eigenständige Container mit benutzerdefinierten Overlay-Netzwerken verbinden, die mit der angegebenen Option --attachablebiaojid erstellt wurden. Dadurch können unabhängige Container, die auf verschiedenen Docker-Hosts ausgeführt werden, miteinander kommunizieren, ohne dass das Routing auf einem bestimmten Docker-Host eingerichtet werden muss.

Veröffentlichungsports

Parameter beschreiben
-p 8080:80 Ordnen Sie den TCP-Port 80 im Dienst dem Port 8080 im Router zu.
-p 8080:80/udp Ordnen Sie den UDP-Port 80 im Dienst dem Port 8080 im Router zu.
-p 8080:80/tcp -p 8080:80/udp Ordnen Sie den TCP-Port 80 im Dienst dem Port 8080 im Router zu und ordnen Sie den UDP-Port 80 im Dienst dem Port 8080 im Router zu.

Die obige ausführliche Erklärung des Overlay-Netzwerks in Docker ist alles, was ich mit Ihnen teilen möchte. Ich hoffe, sie kann Ihnen als Referenz dienen. Ich hoffe auch, dass Sie 123WORDPRESS.COM unterstützen werden.

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
  • Implementierung eines Docker-Cross-Host-Netzwerks (Overlay)
  • Hostübergreifende Kommunikation im Docker-Container – Overlay-Netzwerk

<<:  JS+Canvas zeichnet ein Glücksrad

>>:  Detaillierte Schritte zum Ändern gespeicherter MySQL-Prozeduren

Artikel empfehlen

Praktischer Bericht über die Entwicklung von Vue3- und TypeScript-Projekten

Inhaltsverzeichnis Überblick 1. Kompositions-API ...

Webdesign: Skriptmaterialien rekonstruieren das Benutzererlebnis

<br />Originaltext: http://blog.rexsong.com/...

So ändern Sie die Tomcat-Portnummer in Linux

Ich habe hier mehrere Tomcats. Wenn ich sie gleic...

CentOS-Methode zum Ändern der Standard-SSH-Portnummer – Beispiel

Die Standard-SSH-Portnummer von Linux-Servern ist...

So legen Sie die Tabellenbreite in IE8 und Chrome fest

Wenn die oben genannten Einstellungen in IE8 und C...

Detaillierte Erläuterung der MySQL-Partitionsfunktion und Beispielanalyse

Zunächst: Was ist Datenbankpartitionierung? Ich h...

Implementierungscode der CSS-Formularvalidierungsfunktion

Rendern Prinzip Im Formularelement gibt es ein Mu...

Ausführliche Erläuterung der Standortpriorität von Nginx

Standortausdruckstyp ~ bedeutet, dass ein regulär...

Tiefes Verständnis von Zeilenhöhe und vertikaler Ausrichtung

Mehrere Konzepte Zeilenbox: Eine Box, die eine In...

So schreiben Sie HTML-Header in der Webentwicklung für mobile Geräte

Code kopieren Der Code lautet wie folgt: <Kopf...

js, um den Effekt des Ziehens des Schiebereglers zu erzielen

In diesem Artikel finden Sie den spezifischen Cod...