Docker-Container kommunizieren direkt über Routing, um Netzwerkkommunikation zu erreichen

Docker-Container kommunizieren direkt über Routing, um Netzwerkkommunikation zu erreichen

Überblick

Was das aktuelle Standardnetzwerk von Docker selbst betrifft, können verschiedene Docker-Container auf einem einzelnen Host mithilfe der Docker0-Brücke direkt kommunizieren, was in Ordnung ist. Docker-Container auf verschiedenen Hosts können jedoch nur kommunizieren, indem sie Ports auf dem Host zuordnen. Manchmal ist diese Methode unpraktisch und erfüllt möglicherweise nicht einmal unsere Anforderungen. Daher müssen Docker-Container auf verschiedenen physischen Maschinen direkt über ihre eigenen IP-Adressen kommunizieren. Wenn wir Docker-Container auf unterschiedlichen physischen Hosts starten, treten außerdem zwangsläufig Probleme mit der hostübergreifenden Kommunikation der Docker-Container auf. Versuchen wir es in diesem Artikel.

Wie können die Docker-Container auf den beiden Hosts zu diesem Zeitpunkt direkt über IP-Adressen kommunizieren?

Eine Lösung, die mir in den Sinn kommt, besteht darin, die direkte Kommunikation zwischen zwei CentOS-Containern zu ermöglichen, indem Routen in ihren jeweiligen Hosts hinzugefügt werden.

Analyse des Schemaprinzips

Da die IP des Containers für das Routing verwendet wird, muss vermieden werden, dass Container auf unterschiedlichen Hosts dieselbe IP verwenden. Um dies sicherzustellen, sollten wir verschiedenen Hosts unterschiedliche Subnetze zuweisen. Daher konstruieren wir eine Routing-Lösung für die Kommunikation zwischen zwei Containern, wie in der folgenden Abbildung dargestellt.

Die Konfigurationen sind wie folgt:

• Die IP-Adresse von Host 1 lautet: 192.168.18.162
• Die IP-Adresse von Host 2 lautet: 192.168.18.141
• Den Docker-Containern auf Host 1 zugewiesenes Subnetz: 192.168.100.0/24
• Den Docker-Containern auf Host 2 zugewiesenes Subnetz: 192.168.200.0/24

Nach dieser Konfiguration verwenden die Docker-Container auf den beiden Hosts definitiv nicht dieselbe IP-Adresse, wodurch IP-Konflikte vermieden werden.

Als nächstes definieren wir zwei Routing-Regeln:

• Alle Pakete mit der Zieladresse 192.168.100.0/24 werden an Host 1 weitergeleitet
• Alle Pakete mit der Zieladresse 192.168.200.0/24 werden an Host 2 weitergeleitet

Zusammenfassend läuft der Datenpaketübertragungsprozess zwischen zwei Containern wie folgt ab:

• Das von Container1 an Container2 gesendete Datenpaket wird zuerst an das „Gateway“ Docker0 von Container1 gesendet. Durch Nachschlagen der Route von Host 1 ist dann bekannt, dass das Datenpaket an Host 2 gesendet werden muss. Nachdem das Datenpaket bei Host 2 angekommen ist, wird es an Docker0 von Host 2 weitergeleitet und schließlich an Container2 übertragen. Das umgekehrte Prinzip ist dasselbe und wird nicht wiederholt.

Das ist, was wir im Sinn haben. Lassen Sie uns es in die Praxis umsetzen, um zu sehen, ob es machbar ist.

Tatsächlicher Test

• 1. Konfigurieren Sie docker0 auf Host 1 bzw. Host 2

Bearbeiten Sie die Datei /etc/docker/daemon.json auf Host 1 und fügen Sie den folgenden Inhalt hinzu: „bip“: „ip/netmask“

{ "bip":"192.168.100.252/24" }

Bearbeiten Sie die Datei /etc/docker/daemon.json auf Host 2 und fügen Sie den folgenden Inhalt hinzu: „bip“: „ip/netmask“

{ "bip":"192.168.200.252/24" }

• 2. Starten Sie den Docker-Dienst neu

Führen Sie den folgenden Befehl sowohl auf Host 1 als auch auf Host 2 aus, um den Docker-Dienst neu zu starten und das geänderte Docker0-Netzwerksegment wirksam zu machen

systemctl Neustart Docker

• 3. Routing-Regeln hinzufügen

Fügen Sie Routingregeln auf Host 1 wie folgt hinzu:

Route add -net 192.168.200.0 Netzmaske 255.255.255.0 gw 192.168.18.141

Fügen Sie Routingregeln auf Host 2 wie folgt hinzu:

Route add -net 192.168.100.0 Netzmaske 255.255.255.0 gw 192.168.18.162

• 4. Konfigurieren Sie iptables-Regeln

Fügen Sie auf Host 1 die folgenden Regeln hinzu:

iptables -t nat -F POSTROUTING
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 ! -d 192.168.0.0/16 -j MASQUERADE

Fügen Sie auf Host 2 die folgenden Regeln hinzu:

iptables -t nat -F POSTROUTING
iptables -t nat -A POSTROUTING -s 192.168.200.0/24 ! -d 192.168.0.0/16 -j MASQUERADE

• 5. Starten Sie den Container

Starten Sie den CentOS-Container auf Host 1:

docker run -it --name container1 centos /bin/bash

Starten Sie den CentOS-Container auf Host 2:

docker run -it --name container2 centos /bin/bash

• Installieren Sie ifconfig auf beiden Maschinen und überprüfen Sie die IP-Adresse des Containers mit dem folgenden Befehl:

[root@695ba390d221 /]# yum Suche ifconfig
[root@695ba390d221 /]# yum installiere net-tools.x86_64

Container-IP-Adresse auf Host 1:


Container-IP auf Host 2:

• 6. Direkte Kommunikation zwischen Containern

OK, jetzt können die beiden Container sich gegenseitig anpingen.

Ping auf Host 1:

Ping auf Host 2:

Zusammenfassen

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, dass der Inhalt dieses Artikels einen gewissen Lernwert für Ihr Studium oder Ihre Arbeit hat. Vielen Dank für Ihre Unterstützung von 123WORDPRESS.COM. Wenn Sie mehr darüber erfahren möchten, schauen Sie sich bitte die folgenden Links an

Das könnte Sie auch interessieren:
  • Detailliertes Beispiel für eine Remote-Verbindung zu Docker mithilfe einer TLS-verschlüsselten Kommunikation
  • Schritte zum Aktivieren von TLS in Docker für eine sichere Konfiguration
  • Informationen zur Docker-Sicherheit Probleme mit der Docker-TLS-verschlüsselten Kommunikation

<<:  5 Möglichkeiten, um festzustellen, ob ein Objekt in JS ein leeres Objekt ist

>>:  So erstellen Sie eine my.ini-Datei im MySQL 5.7.19-Installationsverzeichnis

Artikel empfehlen

Zwei Lösungen für das 404-Problem beim Aktualisieren des Vue-Paket-Upload-Servers

1: Nginx-Serverlösung, ändern Sie die .conf-Konfi...

Zusammenfassung der MySQL-Tabellen- und Spaltenkommentare

Genau wie bei Code können Sie den Tabellen und Sp...

XHTML-Tutorial: Der Unterschied zwischen Transitional und Strict

Tatsächlich ist XHTML 1.0 in zwei Typen unterteil...

So invertieren Sie die Implementierung einer Bézierkurve in CSS

Schauen wir uns zunächst einen CSS-Karussell-Anim...

So sichern Sie MySQL-Kontoinformationen elegant

Vorwort: Ich bin kürzlich auf das Problem der Ins...

Docker löst das Problem, dass das Terminal kein Chinesisch eingeben kann

Vorwort: Eines Tages baute ich einen MySQL-Dienst...

Detaillierte Erklärung einiger Einstellungen für Tabellenanpassung und Überlauf

1. Zwei Eigenschaften des Tabellen-Resets: ①borde...

JavaScript zur Implementierung eines einfachen Einkaufsformulars

In diesem Artikel wird der spezifische JavaScript...

Detaillierte Erläuterung der Nginx-Weiterleitungssocket-Portkonfiguration

Gängige Szenarien für die Weiterleitung von Socke...

Beispiele für personalisiertes und kreatives Website-Design (30)

Aus diesem Grund haben wir eine Auswahl von 30 Kom...

Detailliertes Tutorial zur Installation von ffmpeg unter Linux

1. Installieren Sie ffmpeg unter Centos Linux 1. ...

Lösung für die Nichterreichbarkeit des Tencent Cloud Server Tomcat-Ports

Ich habe vor Kurzem einen Server mit Tencent Clou...

Vue ElementUI implementiert einen asynchronen Ladebaum

In diesem Artikelbeispiel wird der spezifische Co...