573 Stimmen

Wie man die IP-Adresse des Docker-Hosts von innerhalb eines Docker-Containers erhält

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.

45voto

cleaversdev Punkte 369
docker network inspect bridge -f '{{range .IPAM.Config}}{{.Gateway}}{{end}}'

Es ist möglich, es mit docker network inspect abzurufen

29voto

Magno Torres Punkte 538

Der einzige Weg ist, die Host-Informationen als Umgebungsinformationen zu übergeben, wenn Sie einen Container erstellen

ausführen --env =

28voto

Augunrik Punkte 1112

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]

(Von https://stackoverflow.com/a/26864854/127400)

27voto

BMitch Punkte 183873

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

21voto

Nick Grealy Punkte 21004

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X