Der Test wird in der Node.JS-Umgebung bestanden. Dasselbe gilt für andere Sprachen. Sie müssen nur die Methode zum Abrufen von Umgebungsvariablen verwenden. Ideen:Der Docker-Container und die Hostumgebung sind isoliert, aber der Hostname kann beim Starten des Docker-Containers als Umgebungsvariable übergeben werden und der Code kann den Wert im Container abrufen. arbeiten:docker run -d -p 3000:3000 --name myTest -e HOST_Q=$(hostname) mytest:v1 # Verwenden Sie den Parameter -e, um die Umgebungsvariable zu übergeben, der Wert ist der Hostname Wenn Sie eine YML-Datei verwenden: Version: '3' Leistungen: MySQL: Bild:mysql:v1 Containername: xx-mysql Neustart: immer Netzwerke: - Gastgeber Umfeld: -MYSQL_ROOT_PASSWORD=xxx0209 - HOST_Q=$(Hostname) # Stellen Sie hier die Ports ein: -3306:3306 Bände: - /opt/data/mysql:/var/lib/mysql:z Nach dem erfolgreichen Start befindet sich in der Umgebungsvariable im Container ein zusätzlicher HOST_Q. Verwenden Sie dann das Programm, um ihn abzurufen: node.js: # Holen Sie sich das Umgebungsvariablenobjekt vom Prozess let env = process.env; Konsole.log(JSON.stringify(Umgebung)); # env['HOST_Q'] ist der endgültige Hostname, der abgerufen werden soll# Ausgabe [2019-04-17T06:54:12.951Z] [e1e7115e0a33] [info]: {"NODE_VERSION":"8.9.4","HOSTNAME":"e1e7115e0a33","YARN_VERSION":"1.3.2","HOME":"/root","HOST_Q":"emg-ubuntu-pub02","PATH":"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin","PWD":"/"} Java: öffentliche Klasse Test { öffentliche statische void main(String[] args) { Map<String, String> map = System.getenv(); Zeichenfolge hostName = map.get("HOST_Q"); System.out.println(Hostname); } } Ergänzung: Der Docker-Container kann nicht auf den Host zugreifen und meldet „Keine Route zum Host“ 1. ProblembeschreibungBeim Bereitstellen von Nacos in Docker ist mir dieses Problem begegnet: Keine Route zum Host, was dazu führte, dass der Nacos-Container keine Verbindung zur Docker-Datenbank des Hosts herstellen konnte. Dann habe ich den Nacos-Container aufgerufen und die Adresse des Host-Rechners angepingt. Das Ergebnis war eine Verbindung. Dann habe ich Port 3306 mit Telnet getestet und das Ergebnis hat ebenfalls diese Ausnahme gemeldet. Was ist der Grund? Auf die Datenbank kann normal von außen zugegriffen werden, aber auf den Container im Hostcomputer kann nicht zugegriffen werden? 2. UrsachenanalyseBeim Bereitstellen von Docker verwenden wir den Bridge-Modus. Wenn Sie Docker starten, erstellt der Docker-Prozess eine virtuelle Brücke mit dem Namen docker0 für die Kommunikation zwischen dem Host und dem Container. Wenn ein Docker-Container gestartet wird, wird der Docker-Container an die virtuelle Brücke angehängt und die Nachrichten im Container werden über Docker0 nach außen weitergeleitet. Wenn der Docker-Container auf den Hostcomputer zugreift, leitet die Docker0-Brücke die Nachricht direkt an den lokalen Computer weiter und die Quelladresse der Nachricht ist die Adresse des Docker0-Netzwerksegments. Wenn der Docker-Container auf einen anderen Computer als den Hostcomputer zugreift, konvertiert die SNAT-Bridge des Dockers die Quelladresse der Nachricht in die Adresse des Hostcomputers und sendet sie über die Netzwerkkarte des Hostcomputers. Wenn der Docker-Container auf den Hostcomputer zugreift und der Service-Port des Hostcomputers durch die Firewall blockiert ist, kann daher keine Verbindung zum Hostcomputer hergestellt werden und der Fehler „Keine Route zum Host“ wird angezeigt. Beim Zugriff auf andere Rechner im LAN, in dem sich der Hostrechner befindet, wird die Nachricht nicht von der Firewall des Zielrechners blockiert und ist daher zugänglich, da die Quelladresse der Nachricht die IP des Hostrechners ist. 3. Lösung1> Schalten Sie die Firewall des Hosts aussystemctl stoppe Firewall 2> Entwickeln Sie den angegebenen Port auf der FirewallFirewall-Befehl --zone=public --add-port=3306/tcp --permanent Firewall-Befehl --zone=public --add-port=3307/tcp --permanent Firewall-Befehl --reload Hinweis: Nach Abschluss des Firewall-Vorgangs starten Sie Docker am besten wie folgt neu: systemctl restart docker. Andernfalls tritt im Container aufgrund des Fehlers der virtuellen Brücke das Problem „iptables fehlgeschlagen“ auf. IV. ZusammenfassungDie Netzwerkverbindung von Docker-Containern war schon immer ein Problem, sowohl zwischen Containern als auch zwischen Containern und Hosts sowie beim hostübergreifenden Zugriff. Achten Sie daher bei Netzwerkverbindungen von Containern auf Netzwerkprobleme. Das Obige ist meine persönliche Erfahrung. Ich hoffe, es kann Ihnen als Referenz dienen. Ich hoffe auch, dass Sie 123WORDPRESS.COM unterstützen werden. Sollten dennoch Fehler oder unvollständige Überlegungen vorliegen, freue ich mich über eine Korrektur. Das könnte Sie auch interessieren:
|
<<: Verwenden Sie Standard-DL-, DT- und DD-Tags, um Tabellenlisten zu verwerfen
>>: Manuelle Implementierung der Instanceof-Methode in JavaScript
Inhaltsverzeichnis 1. Traversal-Klasse 1. fürJede...
Ich habe viele Online-Ressourcen zu diesem Problem...
Rendern Code - Nehmen Sie die blauen und gelben R...
Sechs EffekteImplementierungscode html <h1>...
Erste Schritte mit Datenvolumes Wenn wir im vorhe...
Vorwort Jede gute Angewohnheit ist ein Schatz. Di...
Vorwort: Im MySQL-System gibt es viele verschiede...
Ich möchte das Marquee-Tag verwenden, um das Scrol...
Manchmal müssen wir einige Befehle auf einem Remo...
Inhaltsverzeichnis 1. Über die visuelle Schnittst...
Ich wusste vorher, dass man await verwenden muss,...
Inhaltsverzeichnis 1. Was ist Promise 2. Grundleg...
Grundlegende Syntax: <Eingabetyp="versteck...
1. MySQL-Selbstverbindung MySQL muss beim Abfrage...
„Replace“ und „Replace into“ von MySQL sind beide...