SzenarioDie Microservices des Unternehmens werden bald online gehen. Microservices werden mithilfe von Docker-Containern bereitgestellt. Alle Services werden auf demselben Host bereitgestellt. Die bei Nacos registrierte IP und der PORT sind die Intranet-IP und die im Dockerfile definierte Portnummer. Es scheint, dass es kein Problem gibt. Es kann auch über das Gateway aufgerufen werden. Bitte beachten Sie, dass es eine große Prämisse gibt: Alle Service-Container müssen auf demselben Host bereitgestellt werden! Wenn die Dienstinstanzen nicht auf demselben Host bereitgestellt werden, sich der Gateway-Dienst beispielsweise auf Server A und Dienst A auf Server B befindet und beide bei Nacos (oder anderen Registrierungszentren) registriert sind, stammen die gemeldeten IP-Adressen alle aus dem Intranet. Wenn eine externe Anfrage eingeht, findet das Gateway die entsprechende Intranet-IP-Adresse von Dienst A über die Dienstliste von Nacos, aber der Aufruf schlägt fehl. ps: Wie kann die Intranetanbindung erfolgen... AufgabeMicroservice-Container können auf unterschiedlichen Servern liegen und sich gegenseitig aufrufen Idee
analysierenNachfolgend finden Sie eine Erläuterung des Problems gemäß dem Abschnitt „Ideen“ weiter oben. 1. Nach Durchsicht der offiziellen Dokumente und von Github gibt es zwei Lösungen:
2. Wenn Sie den Host-Netzwerkmodus von Docker verwenden, werden Sie feststellen, dass die diesmal gemeldete IP tatsächlich die Host-IP ist, aber die Portnummer falsch ist ... Wenn Sie den Java-Parameter verwenden, um die über die Shell zuzuordnende Portnummer zu übergeben, ist dies theoretisch möglich. Der einzige Nachteil besteht darin, dass 3. Die zugeordnete Portnummer kann abgerufen werden, aber der Name der Netzwerkkarte des Hosts ist anders und nach der Festcodierung nicht flexibel. Was ist, wenn einige 4. Teilen Sie über einige ausgereifte Docker-Containernetzwerke, aber es wird einige Leistungseinbußen geben - vollständig verfügbar Konzept und AuswahlAm zuverlässigsten ist die Verwendung der Docker-Netzwerkfreigabe. Mithilfe von Suchmaschinen habe ich beschlossen, Overlay zu verwenden, um den Effekt zu erzielen. Hier ist eine kurze Beschreibung von Overlay:
Um ein Overlay-Netzwerk zu implementieren, müssen Sie eine KV-Datenbank einführen, um Netzwerkstatusinformationen, einschließlich Netzwerk, Endpunkt, IP usw., zu speichern. Consul, Etcd und ZooKeeper sind allesamt von Docker unterstützte KV-Datenbanken Wir verwenden hier Consul. Im Vergleich zu anderen KV-Datenbanken ist die von Consul bereitgestellte Schnittstelle für die Verwaltung bequem, sodass Consul hier zur Implementierung von Overlay verwendet wird Indem Sie den Docker-Daemon jedes Servers seine eigene IP-Adresse bei Consul registrieren lassen, können Sie das Docker-Intranet gemeinsam nutzen. Das hier gemeinsam genutzte Intranet befindet sich im Overlay-Netzwerkmodus. Nur Container, die dasselbe Overlay-Netzwerk in der registrierten Docker-Umgebung verwenden, können miteinander kommunizieren. ps: Nach der Erstellung können Cross-Server-Container, die das Overlay-Netzwerk nicht verwenden, nicht mehr gepingt werden Ein kleiner TestSingle-Node-Consul implementiert Overlay-Netzwerk mithilfe eines Docker-Images Umgebungsbeschreibung |
Server-Betriebssystem | Host-IP | Docker-Version | Name der Netzwerkkarte |
---|---|---|---|
Ubuntu Server 18.04 LTS | 192.168.87.133 | 18.09.6 | ens33 |
Ubuntu Server 18.04 LTS | 192.168.87.139 | 18.09.7 | ens33 |
Diese Testumgebung ist für Linux-Distributionen geeignet, die von Systemd verwaltet werden
Consul hat das inoffizielle Progrium/Consul nicht verwendet, hauptsächlich weil dieses Image zu alt ist. Wenn es vor vier Jahren Schwachstellen gab, konnten diese nicht rechtzeitig behoben werden, also bin ich zu <hub.docker.com> gegangen, um alle offiziellen Fallstricke zu erkunden! 💔
Jeder Host, auf dem Docker ausgeführt wird, muss einen anderen Hostnamen haben. Sie können verwenden
$ sudo hostnamectl set-hostname Ihr neuer Hostname
Der gleiche Hostname führt dazu, dass die Host-Docker mit dem gleichen Namen nicht miteinander kommunizieren können.
Bereiten Sie Consul für den Start auf dem 133-Server unter Verwendung des Images vor, sodass Sie zunächst die Startparameter des Docker-Daemons so konfigurieren können, dass sie auf den 133-Server verweisen.
Ändern Sie den Docker.Service der Server 133 bzw. 139.
$ ifconfig #Die störende Netzwerkkarte wurde entfernt und der Name der Netzwerkkarte lautet ens33 ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.87.133 Netzmaske 255.255.255.0 Broadcast 192.168.87.255 inet6 fe80::20c:29ff:fe02:e00a Präfixlänge 64 Bereichs-ID 0x20<Link> Ether 00:0c:29:02:e0:0a txqueuelen 1000 (Ethernet) RX-Pakete 156739 Bytes 233182466 (233,1 MB) RX-Fehler 0 verloren 0 Überläufe 0 Frame 0 TX-Pakete 45173 Bytes 2809606 (2,8 MB) TX-Fehler 0 verloren 0 Überläufe 0 Träger 0 Kollisionen 0 $ vim /etc/docker/daemon.json
Speichern und beenden.
cluster-store
: Die Leader-Adresse des konfigurierten Consul. Die einzelnen Einheiten können direkt geschrieben werden. Andere Software sollte das Protokoll beachten.cluster-advertise
: Geben Sie die Netzwerkkarte und den Port an, die die Nachrichten empfangen sollen, und geben Sie außerdem IP:PORT an.Eine andere Möglichkeit besteht darin, docker.service direkt zu ändern, wie unten gezeigt:
$ cd /etc/systemd/system/multi-user.target.wants $ sudo vim docker.service
Suchen Sie nach dem Wort ExecStart=
und fügen Sie am Ende dieser Zeile den folgenden Code hinzu
--cluster-store=consul://192.168.87.133:8500 --cluster-advertise=ens33:2375
Die Wirkung ist wie folgt:
Der Operationseffekt stimmt mit der obigen Methode überein
Führen Sie dann den Befehl aus, um den Docker-Dienst neu zu starten. Die Vorgehensweise des anderen Servers ist dieselbe. Achten Sie auf den Namen der Netzwerkkarte.
$ sudo systemctl daemon-reload und sudo systemctl docker neu starten
Starten Sie den Consul-Dienst auf dem 133-Server
docker run -d --network host -h consul --name=consul --restart=always -e CONSUL_BIND_INTERFACE=ens33 consul:1.5.2
Der Grund für die Verwendung des Hostmodus besteht darin, zu verhindern, dass einige Ports nicht zugeordnet werden. Der Hostmodus ist die einzige Möglichkeit, Consul die externe Netzwerkkarte erkennen zu lassen. Hier ist eine Nicht-Host-Methode
$ docker run -di -h consul -p 8500:8500 --name=consul consul:1.5.2
Erstellen Sie ein gemeinsam genutztes Docker-Overlay-Netzwerk
$ Docker-Netzwerk erstellen -d Overlay mein_Overlay
Der Unterschied zwischen diesem und dem Erstellen eines normalen Netzwerks besteht darin, dass das Overlay-Modus-Netzwerk angegeben wird. -d
kann auch als --driver
geschrieben werden.
Besuchen Sie die Consul-Seite, meine ist beispielsweise 192.168.87.133:8500
Unsere Konfiguration erfolgt bei Schlüssel/Wert.
Klicken Sie auf Docker -> Knoten
Die beiden Knoten oben sind die von zwei Docker-Daemons registrierten Werte.
Erstellen Sie zwei neue CentOS-Container auf zwei Servern und verwenden Sie dabei das soeben erstellte Overlay-Netzwerk.
133 Server
$ docker run -di --network my_overlay --name mycentos1 centos:7
139 Server
$ docker run -di --network my_overlay --name mycentos2 centos:7
--net
wird als --network
geschrieben. Das mit --
beginnende Zeichen kann weggelassen werden =
Zeigen Sie die IP des mycentos1-Containers auf dem 133-Server an
$ docker inspect -f "{{ .NetworkSettings.Networks.my_overlay.IPAddress}}" mycentos1 10.0.1.2
Zeigen Sie die IP des mycentos2-Containers auf dem 139-Server an
$ docker inspect -f "{{ .NetworkSettings.Networks.my_overlay.IPAddress}}" mycentos2 10.0.1.3
Pingen Sie die Intranet-IP von mycentos2 des Servers 139 vom Server 133 aus.
Ping ist das Gleiche wie umgekehrt, aber es erlaubt uns nicht, von außen darauf zuzugreifen, sondern über den Container im selben Overlay-Netzwerk. Wenn Sie mir nicht glauben, versuchen wir es wie folgt
133 Server
$ docker exec -it mycentos1 bash # Ping 10.0.1.3
Der Zugriff ist erfolgreich, es gibt keinen Paketverlust und umgekehrt. Aus Platzgründen werde ich es nicht testen.
Dies zeigt zumindest, dass die aktuellen Dienste tatsächlich miteinander verbunden sind. Im nächsten Artikel werden wir eine Clustering-Methode für die Produktion entwickeln.
Technisches Gespräch | Implementierung eines Docker-Overlay-Netzwerks
Docker-Container-Overlay-Netzwerk
Docker-Cross-Host-Netzwerk – Overlay
Tag 22: Einführung in das Docker-Netzwerk (Teil 3)
Konsul KV
Docker Hub Konsul
Github Docker-Bibliothek/Dokumente
Github Docker-Konsul
Dieser Artikel ist ein Lern- und Übungsartikel von Hellxz. Das Crawlen von Crawler-Websites von Drittanbietern wie Bubukou und Mami ist verboten.
Damit ist dieser Artikel über die Docker-Overlay-Lösung für serverübergreifende Kommunikation (Teil 1) – Consul-Einzelinstanz – abgeschlossen. Weitere relevante Inhalte zum Docker-Overlay-Netzwerk finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!
<<: MySQL-Tutorial: Beispiel einer DML-Datenmanipulationssprache, ausführliche Erklärung
>>: CSS implementiert sechs adaptive zweispaltige Layoutmethoden
1. Aktivieren Sie den Remotezugriff auf den Docke...
Da der Datenbindungsmechanismus von Vue und ander...
Meta-Tag-Funktion Der META-Tag ist ein Schlüsselt...
Heute habe ich bei der Überprüfung des Parallelit...
1. Einführung in mysqldump mysqldump ist ein logi...
Vorwort Bei der Projektentwicklung gibt es viele ...
Um die Tabelle zu verschönern, können Sie für die...
In diesem Artikel werden die Schwierigkeiten und ...
1. Was ist ein Servlet 1.1. Erklären Sie in offiz...
Inhaltsverzeichnis 1. Rufen Sie das Bild ab 2. Br...
Lernziele: Lernen Sie, MySQL-Datenbanken unter de...
Inhaltsverzeichnis Komponenteninfrastruktur Zweck...
Tatsächlich ist es sehr einfach, diesen Effekt zu ...
In diesem Artikel wird der spezifische Code von v...
Abfrage mehrerer Tabellen Verwenden Sie eine einz...