Lösung für das Problem, dass der Hostname des Hosts im Docker-Container nicht abgerufen werden kann

Lösung für das Problem, dass der Hostname des Hosts im Docker-Container nicht abgerufen werden kann

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. Problembeschreibung

Beim 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. Ursachenanalyse

Beim 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ösung

1> Schalten Sie die Firewall des Hosts aus

systemctl stoppe Firewall

2> Entwickeln Sie den angegebenen Port auf der Firewall

Firewall-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. Zusammenfassung

Die 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:
  • Verzeichnisberechtigungen beim Erstellen eines Containers mit Docker
  • Einfache Schritte zum Erstellen eines MySQL-Containers mit Docker
  • Detaillierte Erklärung zum Erstellen eines MySQL-Containers mit Docker und zum Herstellen einer Verbindung zum Container über die Befehlszeile
  • So erstellen Sie einen MySQL-Container mit Docker
  • Detaillierter Prozess zum Ändern des Hostnamens, nachdem Docker einen Container erstellt hat

<<:  Verwenden Sie Standard-DL-, DT- und DD-Tags, um Tabellenlisten zu verwerfen

>>:  Manuelle Implementierung der Instanceof-Methode in JavaScript

Artikel empfehlen

Implementieren Sie über 24 Array-Methoden in JavaScript von Hand

Inhaltsverzeichnis 1. Traversal-Klasse 1. fürJede...

Beispielcode zur Implementierung der olympischen Ringe mit reinem HTML+CSS

Rendern Code - Nehmen Sie die blauen und gelben R...

Sechs mit CSS3 implementierte Randübergangseffekte

Sechs EffekteImplementierungscode html <h1>...

Implementierung von Docker-Datenvolumenoperationen

Erste Schritte mit Datenvolumes Wenn wir im vorhe...

21 Best Practices zur MySQL-Standardisierung und -Optimierung!

Vorwort Jede gute Angewohnheit ist ein Schatz. Di...

Zusammenfassung einiger gängiger Protokolle in MySQL

Vorwort: Im MySQL-System gibt es viele verschiede...

So führen Sie Befehle auf einem Remote-Linux-System über SSH aus

Manchmal müssen wir einige Befehle auf einem Remo...

Eine kurze Diskussion über die VUE Uni-App-Entwicklungsumgebung

Inhaltsverzeichnis 1. Über die visuelle Schnittst...

Kann Asynchronität in JavaScript „Await“ speichern?

Ich wusste vorher, dass man await verwenden muss,...

Front-End-JavaScript-Versprechen

Inhaltsverzeichnis 1. Was ist Promise 2. Grundleg...

Einführung und Beispiele für versteckte Felder in HTML

Grundlegende Syntax: <Eingabetyp="versteck...

Tiefgreifendes Verständnis der MySQL-Selbstverbindung und Join-Assoziation

1. MySQL-Selbstverbindung MySQL muss beim Abfrage...

Detaillierte Beispiele für Ersetzen und Ersetzen in MySQL into_Mysql

„Replace“ und „Replace into“ von MySQL sind beide...