Wie der Titel schon sagt, muss ich in der Lage sein, die IP-Adresse der Docker-Hosts und die Portzuweisungen vom Host zum Container abzurufen und das innerhalb des Containers zu tun.
Antworten
Zu viele Anzeigen?Die --add-host
könnte eine sauberere Lösung sein (aber ohne den Portteil, nur der Host kann mit dieser Lösung behandelt werden). Also, in deinem docker run
Befehl, mache etwas wie:
docker run --add-host dockerhost:`/sbin/ip route|awk '/default/ { print $3}'` [mein Container]
Die Standard-Best Practice für die meisten Apps, die dies automatisch tun möchten, lautet: du solltest es nicht tun. Stattdessen sollte die Person, die den Container ausführt, einen externen Hostnamen/IP-Adresse als Konfiguration einfügen, z.B. als Umgebungsvariable oder Konfigurationsdatei. Wenn der Benutzer dies einfügen kann, erhalten Sie das am meisten portable Design.
Warum wäre das so schwierig? Weil Container standardmäßig die Anwendung von der Host-Umgebung isolieren. Das Netzwerk ist standardmäßig nur auf diesen Container beschränkt, und Details des Hosts sind vor dem Prozess im Container geschützt, der möglicherweise nicht vollständig vertrauenswürdig ist.
Es gibt verschiedene Optionen, je nach Ihrer spezifischen Situation:
Wenn Ihr Container mit Host-Netzwerkkommunikation läuft, können Sie beispielsweise die Routing-Tabelle direkt auf dem Host ansehen, um die Standardroute nach außen zu sehen. Aus dieser Frage funktioniert folgendes z.B. für mich:
ip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p'
Ein Beispiel, wie dies bei Host-Netzwerkkommunikation in einem Container aussieht, ist:
docker run --rm --net host busybox /bin/sh -c \
"ip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p'"
Für aktuelle Versionen von Docker Desktop wurde ein DNS-Eintrag in die eingebettete VM eingefügt:
getent hosts host.docker.internal | awk '{print $1}'
Mit der Version 20.10 kann der host.docker.internal
-Alias auch auf Linux funktionieren, wenn Sie Ihre Container mit einer zusätzlichen Option ausführen:
docker run --add-host host.docker.internal:host-gateway ...
Wenn Sie sich in einer Cloud-Umgebung befinden, können Sie den Metadatenservice des Cloud-Anbieters überprüfen, z.B. den von AWS:
curl http://169.254.169.254/latest/meta-data/local-ipv4
Wenn Sie Ihre externe/Internetadresse möchten, können Sie einen Remote-Service abfragen wie:
curl ifconfig.co
Jede dieser Methoden hat Einschränkungen und funktioniert nur in bestimmten Szenarien. Die portabelste Option besteht immer noch darin, Ihren Container mit der IP-Adresse als Konfiguration zu starten, z.B. hier ist eine Option, die das frühere ip
-Kommando auf dem Host ausführt und es als Umgebungsvariable einfügt:
export HOST_IP=$(ip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p')
docker run --rm -e HOST_IP busybox printenv HOST_IP
Zusammenfassung für Mac und Windows
docker run -it --rm alpine nslookup host.docker.internal
... gibt die IP-Adresse des Hosts aus ...
nslookup: kann '(null)' nicht auflösen: Name kann nicht aufgelöst werden
Name: host.docker.internal
Adresse 1: 192.168.65.2
Details
Auf Mac und Windows können Sie den speziellen DNS-Namen host.docker.internal
verwenden.
Der Host hat eine sich ändernde IP-Adresse (oder keine, wenn Sie keinen Netzwerkzugriff haben). Ab Version 18.03 empfehlen wir, sich mit dem speziellen DNS-Namen host.docker.internal zu verbinden, der in die interne IP-Adresse aufgelöst wird, die vom Host verwendet wird. Dies dient Entwicklungszwecken und funktioniert nicht in einer Produktionsumgebung außerhalb von Docker Desktop für Mac.