So erhalten Sie die IP-Adresse des Docker-Hosts aus einem Docker-Container
358
Wie der Titel schon sagt. Ich muss in der Lage sein, die IP-Adresse der Docker-Hosts und der Portmaps vom Host zum Container abzurufen und dies innerhalb des Containers zu tun.
Könnten Sie näher erläutern, wie Sie diese Informationen verwenden möchten? Sie sagten "Docker-Hosts" - führen Sie Docker auf mehr als einem Host aus? Was wird Ihr Container tun, wenn er die IP-Adresse des Hosts und der Portmaps kennt?
Andy
Der einfachste Weg, um die Docker-Host-IP-Adressen an den Docker-Container zu übergeben. Ich denke, Sie sollten einen Aufruf innerhalb des Containers mit 'Docker Container Exec' tätigen. Angenommen, Sie möchten den Host aus dem Busybox-Container aus anpingen. Verwenden Sie beispielsweise: $ IP = '8.8.8.8' && Docker-Container Busybox-Ping $ IP 'Um die Host-IP herauszufinden, verwenden Sie, was Ihnen besser gefällt.
SauloAlessandre
Antworten:
314
/sbin/ip route|awk '/default/ { print $3 }'
Wie @MichaelNeale bemerkt hat, macht es keinen Sinn, diese Methode zu verwenden Dockerfile(außer wenn wir diese IP nur während der Erstellungszeit benötigen), da diese IP während der Erstellungszeit fest codiert wird.
Wenn Sie die Docker-Bridge (Standard) für die Container verwenden, wird die Bridge-IP wie 172.17.42.1 anstelle der Host-IP wie 192.168.1.x ausgegeben (ich gehe davon aus, dass sich Ihr Host auf einem Heim-NAT befindet). Die Verwendung der Antwort von @Magno Torres ist wahrscheinlich das, was die Leute in solchen Situationen wollen, wenn Sie die Adresse 192.168.1.x wollen.
Programster
2
Dieser RUN funktioniert nicht wie erwartet - er berechnet nur die IP zum Zeitpunkt der Erstellung - und ist danach für immer statisch und nicht nützlich. Dies ist die IP des Build-Hosts.
Michael Neale
7
@Programster, ich kann davon ausgehen, dass die Leute die Verbindung zwischen Docker-Host und Container wollen, das kann Ihnen Bridge-IP geben (natürlich in der Standardinstallation "home"). Warum sollte jemand eine "echte" Host-IP benötigen, wenn diese sich auch außerhalb der Docker Bridge befindet und nicht zugänglich ist? Dies ist die Lösung für alle Personen, die gerade Docker installiert haben und in kurzer Zeit damit spielen möchten.
Spinus
1
@MichaelNeale, wie zuvor würde ich annehmen, dass die meisten Leute, die mit Docker beginnen, eine Verbindung zwischen ihrem Host und Container benötigen, das war's. Wenn jemand "ordnungsgemäße" Bereitstellungen durchführt, verwendet er wahrscheinlich ohnehin keine Docker Bridge, verwendet ein benutzerdefiniertes Netzwerk und ist sich wahrscheinlich aller Netzwerkprobleme bewusst, oder er hat DNS (oder eine andere Entdeckung) eingerichtet.
Spinus
1
@spinus - aber dies ist nur gültig, wenn es auf dem Host ausgeführt wird, auf dem es erstellt wurde - in diesem Fall können Sie es einfach hart codieren - oder nachschlagen - ich denke, es ist keine hilfreiche Antwort und wird viel irreführen von Menschen - empfehlen Sie, es zu entfernen. (Das RUN-Bit)
Michael Neale
182
Ab Version 18.03 können Sie host.docker.internaldie IP des Hosts verwenden.
Funktioniert in Docker für Mac , Docker für Windows und möglicherweise auch auf anderen Plattformen.
Dies ist ein Mac-spezifisches Update docker.for.mac.localhost, das seit Version 17.06 docker.for.mac.host.internalverfügbar ist und seit Version 17.12 verfügbar ist und möglicherweise auch noch auf dieser Plattform funktioniert.
Beachten Sie, dass dies wie in der Mac- und Windows- Dokumentation nur zu Entwicklungszwecken dient.
Auf meinem Host sind beispielsweise Umgebungsvariablen festgelegt:
MONGO_SERVER=host.docker.internal
In meiner docker-compose.ymlDatei habe ich Folgendes:
@allanberry Leider bevorzugen die Docker-Leute, uns keine plattformunabhängige Möglichkeit zu geben, weil sie es vorziehen, unbeabsichtigte Anwendungsfälle (wie den Zugriff auf einen Dienst auf dem lokalen Computer von einem Docker-Container aus) nicht zu berücksichtigen
Andy
21
Ich wurde Docker wie Build it einmal vorgestellt und überall ausgeführt. Dies ist jedoch akut falsch, da Sie immer auch das Hostsystem konfigurieren müssen. So docker.for.mac..ist nutzlos , da in den meisten Fällen Sie keine Linux- oder Mac-Umgebung in Ihrem Unternehmen haben. Es ist gemischt, Sie haben Entwickler, die Linux, Mac und Windows verwenden. Diese Domain macht keinen Sinn, da es sich in 99% um eine gemischte Host-Betriebssystemumgebung handelt. Ich entwickle keinen Container unter macOS und stelle ihn auf einem macOS-Server bereit. Ich stelle es unter Linux bereit. Das macht jeder. Worum geht es also überhaupt docker.for.mac..?
TheFox
1
@allanberry docker.for.mac.host.internalspielt keine Rolle, ob Sie Docker mit oder ohne verwenden docker-compose. Ich möchte einen festen Host in Konfigurationsdateien verwenden. Zum Beispiel IDK, docker.host.internaldas immer auf die Host-IP-Adresse verweist. Unabhängig davon, welches Hostsystem ich verwende. Das ist der springende Punkt bei der Verwendung von Docker: Ich möchte autonom sein. Ich verstehe, dass es unter macOS noch schwieriger ist, weil Sie eine weitere Schicht zwischen dem Hostsystem und dem Container haben. Aber meiner Meinung nach docker.for.mac.host.internalist es nutzlos, wenn man es nur für macOS verwenden kann.
das funktioniert perfekt, ich habe dockerCe für windows und laufe jenkins in einem der container. Ich wollte den Docker-Befehl in Jenkins ausführen, aber Docker konnte beim Hinzufügen eines Cloud-Schritts keine Verbindung herstellen. Ich habe diesen Befehl tcp: //host.docker.internal: 2375 verwendet und "Daemon auf localhost: 2375 verfügbar machen" aktiviert und es funktioniert. viel Zeit gespart. Vielen Dank!
Vikash
84
Update: Unter Docker für Mac können Sie ab Version 18.03 host.docker.internal als IP des Hosts verwenden. Siehe Allanberrys Antwort . Für frühere Versionen von Docker für Mac kann die folgende Antwort weiterhin hilfreich sein:
Unter Docker für Mac ist die docker0Bridge nicht vorhanden, daher funktionieren andere Antworten hier möglicherweise nicht. Der gesamte ausgehende Datenverkehr wird jedoch über Ihren übergeordneten Host geleitet. Solange Sie versuchen, eine Verbindung zu einer IP herzustellen, die er als sich selbst erkennt (und der Docker-Container glaubt nicht, dass er sich selbst ist), sollten Sie in der Lage sein, eine Verbindung herzustellen. Wenn Sie dies beispielsweise auf dem übergeordneten Computer ausführen, führen Sie Folgendes aus:
ipconfig getifaddr en0
Dies sollte Ihnen die IP Ihres Mac in seinem aktuellen Netzwerk anzeigen und Ihr Docker-Container sollte auch eine Verbindung zu dieser Adresse herstellen können. Dies ist natürlich ein Problem, wenn sich diese IP-Adresse jemals ändert. Sie können Ihrem Mac jedoch eine benutzerdefinierte Loopback-IP hinzufügen, die der Container nicht für sich selbst hält, indem Sie auf dem übergeordneten Computer Folgendes ausführen:
sudo ifconfig lo0 alias 192.168.46.49
Anschließend können Sie die Verbindung im Docker-Container mit Telnet testen. In meinem Fall wollte ich eine Verbindung zu einem entfernten xdebug-Server herstellen:
telnet 192.168.46.49 9000
Wenn nun Datenverkehr auf Ihren Mac gelangt, der für 192.168.46.49 adressiert ist (und der gesamte Datenverkehr, der Ihren Container verlässt, über Ihren Mac fließt), geht Ihr Mac davon aus, dass die IP selbst ist. Wenn Sie diese IP nicht mehr verwenden, können Sie den Loopback-Alias wie folgt entfernen:
sudo ifconfig lo0 -alias 192.168.46.49
Eine Sache, die Sie beachten sollten, ist, dass der Docker-Container keinen Datenverkehr an den übergeordneten Host sendet, wenn er glaubt, dass das Ziel des Datenverkehrs selbst ist. Überprüfen Sie daher die Loopback-Schnittstelle im Container, wenn Sie Probleme haben:
sudo ip addr show lo
In meinem Fall zeigte inet 127.0.0.1/8dies, dass ich keine IPs im 127.*Bereich verwenden konnte. Deshalb habe ich 192.168.*im obigen Beispiel verwendet. Stellen Sie sicher, dass die von Ihnen verwendete IP-Adresse nicht mit einem Konflikt in Ihrem eigenen Netzwerk in Konflikt steht.
Wird es diese Loopback-Einstellungen nach einem Systemneustart bereinigen?
Robbo_UK
@Robbo_UK Ja, der Loopback-Alias wird nach dem Neustart Ihres Mac gelöscht.
Code Commander
1
Die Verwendung dieses Hostnamens macht keinen Sinn, da er unter Docker für Linux nicht funktioniert. Warum haben sie es nicht auch für Linux hinzugefügt?
Dies ist eine sehr bequeme Methode für Benutzer von AWS. Ich verwende dies, um den Client der Konsulagenten zu konfigurieren und Adressen zu binden. Dies ist ideal, wenn Sie das Host-Netzwerk nicht verwenden können (z. B. das Bereitstellen von Containern in Elastic Beanstalk und ECS).
Richard Clayton
Dies ist ein Lebensretter, danke. Ich hatte Probleme, die Kommunikation zwischen Containern in meinem ECS-Cluster zu handhaben.
Brennan
Auf Phusion Basimage (basierend auf Ubuntu) musste ich Ihren Befehl ein wenig ändern:ifconfig eth0 | grep -oP 'inet \K\S+'
Meuoi
25
Die einzige Möglichkeit besteht darin, die Hostinformationen als Umgebung zu übergeben, wenn Sie einen Container erstellen
Insbesondere kann die Bridge-IP-Adresse über eine Befehlszeilenoption wie die folgende übergeben werden: -e "DOCKER_HOST=$(ip -4 addr show docker0 | grep -Po 'inet \K[\d.]+')"(unter Verwendung der akzeptierten Antwort von unix.stackexchange.com/questions/87468/… )
ncoghlan
7
Ich denke, es funktioniert nicht in Docker für Mac / Windows. (die Brücken-IP)
zx1986
22
Das --add-hostkönnte eine sauberere Lösung (aber ohne den Anschlussteil nur die Host kann mit dieser Lösung behandelt werden) sein. Machen Sie also in Ihrem docker runBefehl etwas wie:
Ich sagte "gemacht dafür", als jemand anderes einen Eintrag in / etc / hosts wollte; in dieser Frage ist es nicht wirklich wahr. Auch OP fragte nach "Host und Portmaps" und Sie haben nur den Host abgedeckt.
Bryan
OK. Ich war etwas verwirrt, da die akzeptierte Lösung auch nur den Host-Teil abdeckt. Und ich denke, Ihre Lösung ist der von Spinus überlegen.
Augunrik
Dies funktioniert nicht, wenn Sie dind - docker-in-docker verwenden möchten. Inner Docker wird andere IP
laut
12
Die Standard-Best Practice für die meisten Apps, die dies automatisch tun möchten, lautet: Sie tun dies nicht . Stattdessen muss die Person, die den Container ausführt, einen externen Hostnamen / eine externe IP-Adresse als Konfiguration einfügen, z. B. als Umgebungsvariable oder Konfigurationsdatei. Wenn Sie dem Benutzer erlauben, dies zu injizieren, erhalten Sie das tragbarste Design.
Warum sollte das so schwierig sein? Da Container die Anwendung standardmäßig von der Hostumgebung isolieren. Das Netzwerk ist standardmäßig nur auf diesen Container beschränkt, und die Details des Hosts sind vor dem Prozess geschützt, der im Container ausgeführt wird und dem möglicherweise nicht vollständig vertraut wird.
Abhängig von Ihrer spezifischen Situation gibt es verschiedene Optionen:
Wenn Ihr Container mit einem Host-Netzwerk ausgeführt wird, können Sie in der Routing-Tabelle auf dem Host direkt die Standardroute anzeigen. Aus dieser Frage ergibt sich für mich zB:
ip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p'
Ein Beispiel, das dies mit einem Host-Netzwerk in einem Container zeigt, sieht folgendermaßen aus:
docker run --rm --net host busybox /bin/sh -c \
"ip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p'"
Bei einigen Versionen von Docker Desktop wurde ein DNS-Eintrag in die eingebettete VM eingefügt:
Wenn Sie Ihre externe / Internetadresse möchten, können Sie einen Remote-Dienst wie folgt abfragen:
curl ifconfig.co
Jedes dieser Verfahren weist Einschränkungen auf und funktioniert nur in bestimmten Szenarien. Die portabelste Option besteht weiterhin darin, Ihren Container mit der als Konfiguration eingefügten IP-Adresse auszuführen. Beispiel: Hier ist eine Option, mit der der frühere ipBefehl auf dem Host ausgeführt und als Umgebungsvariable eingefügt wird:
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
Der Host hat eine sich ändernde IP-Adresse (oder keine, wenn Sie keinen Netzwerkzugriff haben). Ab dem 18.03. Empfehlen wir, eine Verbindung zum speziellen DNS-Namen host.docker.internal herzustellen, der in die vom Host verwendete interne IP-Adresse aufgelöst wird. Dies dient Entwicklungszwecken und funktioniert nicht in einer Produktionsumgebung außerhalb von Docker für Windows.
Ich habe versucht, Sie Lösung und es scheint, dass nslookup Befehl nicht gefunden werden kann
Sergey
@ Sergey Basiert Ihr Bild auf Alpine Linux? Wenn nicht, überprüfen Sie das Äquivalent für Ihre spezifischen linux distribution.
Kamil Witkowski
Nein, ich benutze genau Ihren Befehl - Docker run -it nginx / bin / ash
Sergey
Ok - wenn Sie unter Windows sind, habe ich zu gewechselt linux containersund verwende es nicht. windows containersSie können dies tun, indem Sie mit der rechten Maustaste auf klicken docker iconund auswählen Switch to Linux containers. Ich denke, das könnte wichtig sein, wenn Sie ein Bild herunterladen. Wenn Sie windows containerüberprüft haben, ob nginxSie ein altes Bild löschen und erneut herunterladen, erhalten Sie einen anderen Container. Wenn es bei Ihnen immer noch nicht funktioniert, können Sie versuchen, es nslookupin der zu installieren ash.
Kamil Witkowski
Wenn Sie nslookup nicht ausführen können, pingen Sie einfach. Es wird die aufgelöste IP angezeigt. Für mich funktioniert diese Antwort und ich benutze nur diesen Hostnamen ( host.docker.internal) aus dem Container
Dmitry Minkovsky
7
TLDR für Mac und Windows
docker run -it --rm alpine nslookup host.docker.internal
... druckt die IP-Adresse des Hosts ...
nslookup: can't resolve '(null)': Name does not resolve
Name: host.docker.internal
Address 1: 192.168.65.2
Einzelheiten
Unter Mac und Windows können Sie den speziellen DNS-Namen verwenden host.docker.internal.
Der Host hat eine sich ändernde IP-Adresse (oder keine, wenn Sie keinen Netzwerkzugriff haben). Ab dem 18.03. Empfehlen wir, eine Verbindung zum speziellen DNS-Namen host.docker.internal herzustellen, der in die vom Host verwendete interne IP-Adresse aufgelöst wird. Dies dient Entwicklungszwecken und funktioniert nicht in einer Produktionsumgebung außerhalb von Docker Desktop für Mac.
Bitte fügen Sie nicht dieselbe Antwort auf mehrere Fragen hinzu . Beantworten Sie die beste Frage und kennzeichnen Sie den Rest als Duplikate, sobald Sie genügend Ruf erworben haben. Wenn es sich nicht um ein Duplikat handelt, passen Sie den Beitrag an die Frage an und markieren Sie ihn zum Löschen.
Bhargav Rao
6
Docker für Mac
Ich möchte eine Verbindung von einem Container zu einem Dienst auf dem Host herstellen
Der Host hat eine sich ändernde IP-Adresse (oder keine, wenn Sie keinen Netzwerkzugriff haben). Ab dem 18.03. Empfehlen wir, eine Verbindung zum speziellen DNS-Namen host.docker.internal herzustellen, der in die vom Host verwendete interne IP-Adresse aufgelöst wird.
Wenn Sie die Docker-Remote-API aktiviert haben ( z. B. über) und den Hostnamen oder die IP-Adresse des Hostcomputers kennen, kann dies mit viel Bash durchgeführt werden.-Htcp://0.0.0.0:4243
In der zweiten Zeile wird die Container-ID aus Ihrer lokalen /proc/self/cgroupDatei abgerufen.
Die dritte Zeile wird auf den Hostcomputer übertragen (vorausgesetzt, Sie verwenden 4243 als Docker-Port) und verwendet dann den Knoten, um den zurückgegebenen JSON für den zu analysieren DESIRED_PORT.
Dies gilt nur, wenn Sie die Portweiterleitung verwenden. In der Tat HostPortkönnen hier nützliche Informationen sein, leider HostIpkönnte das sein0.0.0.0
Arnout Engelen
4
Ich habe Ubuntu 16.03. Für mich
docker run --add-host dockerhost:`/sbin/ip route|awk '/default/ { print $3}'` [image]
tut NICHT (falsche IP wurde generiert)
Meine Arbeitslösung war:
docker run --add-host dockerhost:`docker network inspect --format='{{range .IPAM.Config}}{{.Gateway}}{{end}}' bridge` [image]
Hier ist eine weitere Option für diejenigen, die Docker in AWS ausführen. Diese Option vermeidet die Verwendung von apk zum Hinzufügen des Curl-Pakets und spart wertvolle 7 MB Platz. Verwenden Sie das integrierte wget (Teil der monolithischen BusyBox-Binärdatei):
AFAIK, im Fall von Docker für Linux (Standarddistribution) lautet die IP-Adresse des Hosts immer172.17.0.1 .
Der einfachste Weg, es zu bekommen, ist über ifconfig(Schnittstelle docker0) vom Host:
ifconfig
Aus einem Docker heraus den folgenden Befehl von einem Docker: ip -4 route show default | cut -d" " -f3
Sie können es schnell in einem Docker mit der folgenden Befehlszeile ausführen:
# 1. Run an ubuntu docker
# 2. Updates dependencies (quietly)
# 3. Install ip package (quietly)
# 4. Shows (nicely) the ip of the host
# 5. Removes the docker (thanks to `--rm` arg)
docker run -it --rm ubuntu:19.10 bash -c "apt-get update && apt-get install iproute2 -y && ip -4 route show default | cut -d' ' -f3"
Der erste Codeblock erfasst die Container-IP und nicht die Host-IP
Ari
mandoc of hostname -Iwarnt davor, "keine Annahmen über die Reihenfolge der Ausgabe zu treffen".
nicht_veränderlich_ ausleihen
1
Dies ist eine minimalistische Implementierung in Node.js für diejenigen , die den Host auf AWS EC2-Instanzen unter Verwendung der oben genannten EC2-Metadateninstanz ausführen
const cp = require('child_process');
const ec2 = function (callback) {
const URL = 'http://169.254.169.254/latest/meta-data/local-ipv4';
// we make it silent and timeout to 1 sec
const args = [URL, '-s', '--max-time', '1'];
const opts = {};
cp.execFile('curl', args, opts, (error, stdout) => {
if (error) return callback(new Error('ec2 ip error'));
else return callback(null, stdout);
})
.on('error', (error) => callback(new Error('ec2 ip error')));
}//ec2
Wenn Sie einen Windows-Container in einem Service Fabric-Cluster ausführen, ist die IP-Adresse des Hosts über die Umgebungsvariable verfügbar Fabric_NodeIPOrFQDN. Service Fabric-Umgebungsvariablen
Hier ist, wie ich es mache. In diesem Fall wird ein Hosts-Eintrag in / etc / hosts im Docker-Image hinzugefügt, der den Stier-Host auf die IP meines lokalen Computers verweist ::
Anschließend kann das Skript im Docker-Container den Hostnamen taurus-host verwenden, um zu meinem lokalen Computer zu gelangen, auf dem sich der Docker-Container befindet.
Sie können einfach den Containernamen dns verwenden, um auf das Hostsystem zuzugreifen, z. B. curl http: // dockerhost: 9200 , sodass Sie keine IP-Adresse benötigen.
Dies ruft die IP der virtuellen Maschine ab, auf der die Docker-Container ausgeführt werden, nicht die IP des Hosts, auf dem die Container ausgeführt werden.
Spencer Williams
2
Dies gilt nur für Docker, die auf einem Docker-Computer ausgeführt werden. Der neue Docker für Mac läuft nicht auf dem Docker-Rechner.
Antworten:
Wie @MichaelNeale bemerkt hat, macht es keinen Sinn, diese Methode zu verwenden
Dockerfile
(außer wenn wir diese IP nur während der Erstellungszeit benötigen), da diese IP während der Erstellungszeit fest codiert wird.quelle
Ab Version 18.03 können Sie
host.docker.internal
die IP des Hosts verwenden.Funktioniert in Docker für Mac , Docker für Windows und möglicherweise auch auf anderen Plattformen.
Dies ist ein Mac-spezifisches Update
docker.for.mac.localhost
, das seit Version 17.06docker.for.mac.host.internal
verfügbar ist und seit Version 17.12 verfügbar ist und möglicherweise auch noch auf dieser Plattform funktioniert.Beachten Sie, dass dies wie in der Mac- und Windows- Dokumentation nur zu Entwicklungszwecken dient.
Auf meinem Host sind beispielsweise Umgebungsvariablen festgelegt:
In meiner
docker-compose.yml
Datei habe ich Folgendes:quelle
docker.for.mac..
ist nutzlos , da in den meisten Fällen Sie keine Linux- oder Mac-Umgebung in Ihrem Unternehmen haben. Es ist gemischt, Sie haben Entwickler, die Linux, Mac und Windows verwenden. Diese Domain macht keinen Sinn, da es sich in 99% um eine gemischte Host-Betriebssystemumgebung handelt. Ich entwickle keinen Container unter macOS und stelle ihn auf einem macOS-Server bereit. Ich stelle es unter Linux bereit. Das macht jeder. Worum geht es also überhauptdocker.for.mac..
?docker.for.mac.host.internal
spielt keine Rolle, ob Sie Docker mit oder ohne verwendendocker-compose
. Ich möchte einen festen Host in Konfigurationsdateien verwenden. Zum Beispiel IDK,docker.host.internal
das immer auf die Host-IP-Adresse verweist. Unabhängig davon, welches Hostsystem ich verwende. Das ist der springende Punkt bei der Verwendung von Docker: Ich möchte autonom sein. Ich verstehe, dass es unter macOS noch schwieriger ist, weil Sie eine weitere Schicht zwischen dem Hostsystem und dem Container haben. Aber meiner Meinung nachdocker.for.mac.host.internal
ist es nutzlos, wenn man es nur für macOS verwenden kann.host.docker.internal
funktioniert auch unter Docker für Windows , zumindest zum Zeitpunkt des Schreibens dieses Kommentars.Update: Unter Docker für Mac können Sie ab Version 18.03 host.docker.internal als IP des Hosts verwenden. Siehe Allanberrys Antwort . Für frühere Versionen von Docker für Mac kann die folgende Antwort weiterhin hilfreich sein:
Unter Docker für Mac ist die
docker0
Bridge nicht vorhanden, daher funktionieren andere Antworten hier möglicherweise nicht. Der gesamte ausgehende Datenverkehr wird jedoch über Ihren übergeordneten Host geleitet. Solange Sie versuchen, eine Verbindung zu einer IP herzustellen, die er als sich selbst erkennt (und der Docker-Container glaubt nicht, dass er sich selbst ist), sollten Sie in der Lage sein, eine Verbindung herzustellen. Wenn Sie dies beispielsweise auf dem übergeordneten Computer ausführen, führen Sie Folgendes aus:Dies sollte Ihnen die IP Ihres Mac in seinem aktuellen Netzwerk anzeigen und Ihr Docker-Container sollte auch eine Verbindung zu dieser Adresse herstellen können. Dies ist natürlich ein Problem, wenn sich diese IP-Adresse jemals ändert. Sie können Ihrem Mac jedoch eine benutzerdefinierte Loopback-IP hinzufügen, die der Container nicht für sich selbst hält, indem Sie auf dem übergeordneten Computer Folgendes ausführen:
Anschließend können Sie die Verbindung im Docker-Container mit Telnet testen. In meinem Fall wollte ich eine Verbindung zu einem entfernten xdebug-Server herstellen:
Wenn nun Datenverkehr auf Ihren Mac gelangt, der für 192.168.46.49 adressiert ist (und der gesamte Datenverkehr, der Ihren Container verlässt, über Ihren Mac fließt), geht Ihr Mac davon aus, dass die IP selbst ist. Wenn Sie diese IP nicht mehr verwenden, können Sie den Loopback-Alias wie folgt entfernen:
Eine Sache, die Sie beachten sollten, ist, dass der Docker-Container keinen Datenverkehr an den übergeordneten Host sendet, wenn er glaubt, dass das Ziel des Datenverkehrs selbst ist. Überprüfen Sie daher die Loopback-Schnittstelle im Container, wenn Sie Probleme haben:
In meinem Fall zeigte
inet 127.0.0.1/8
dies, dass ich keine IPs im127.*
Bereich verwenden konnte. Deshalb habe ich192.168.*
im obigen Beispiel verwendet. Stellen Sie sicher, dass die von Ihnen verwendete IP-Adresse nicht mit einem Konflikt in Ihrem eigenen Netzwerk in Konflikt steht.quelle
Für diejenigen, die Docker in AWS ausführen, sind die Instanz-Metadaten für den Host weiterhin im Container verfügbar.
Zum Beispiel:
quelle
ifconfig eth0 | grep -oP 'inet \K\S+'
Die einzige Möglichkeit besteht darin, die Hostinformationen als Umgebung zu übergeben, wenn Sie einen Container erstellen
quelle
-e "DOCKER_HOST=$(ip -4 addr show docker0 | grep -Po 'inet \K[\d.]+')"
(unter Verwendung der akzeptierten Antwort von unix.stackexchange.com/questions/87468/… )Das
--add-host
könnte eine sauberere Lösung (aber ohne den Anschlussteil nur die Host kann mit dieser Lösung behandelt werden) sein. Machen Sie also in Ihremdocker run
Befehl etwas wie:(Von https://stackoverflow.com/a/26864854/127400 )
quelle
Die Standard-Best Practice für die meisten Apps, die dies automatisch tun möchten, lautet: Sie tun dies nicht . Stattdessen muss die Person, die den Container ausführt, einen externen Hostnamen / eine externe IP-Adresse als Konfiguration einfügen, z. B. als Umgebungsvariable oder Konfigurationsdatei. Wenn Sie dem Benutzer erlauben, dies zu injizieren, erhalten Sie das tragbarste Design.
Warum sollte das so schwierig sein? Da Container die Anwendung standardmäßig von der Hostumgebung isolieren. Das Netzwerk ist standardmäßig nur auf diesen Container beschränkt, und die Details des Hosts sind vor dem Prozess geschützt, der im Container ausgeführt wird und dem möglicherweise nicht vollständig vertraut wird.
Abhängig von Ihrer spezifischen Situation gibt es verschiedene Optionen:
Wenn Ihr Container mit einem Host-Netzwerk ausgeführt wird, können Sie in der Routing-Tabelle auf dem Host direkt die Standardroute anzeigen. Aus dieser Frage ergibt sich für mich zB:
Ein Beispiel, das dies mit einem Host-Netzwerk in einem Container zeigt, sieht folgendermaßen aus:
Bei einigen Versionen von Docker Desktop wurde ein DNS-Eintrag in die eingebettete VM eingefügt:
Wenn Sie in einer Cloud-Umgebung ausgeführt werden, können Sie den Metadatendienst des Cloud-Anbieters überprüfen, z. B. den AWS-Dienst:
Wenn Sie Ihre externe / Internetadresse möchten, können Sie einen Remote-Dienst wie folgt abfragen:
Jedes dieser Verfahren weist Einschränkungen auf und funktioniert nur in bestimmten Szenarien. Die portabelste Option besteht weiterhin darin, Ihren Container mit der als Konfiguration eingefügten IP-Adresse auszuführen. Beispiel: Hier ist eine Option, mit der der frühere
ip
Befehl auf dem Host ausgeführt und als Umgebungsvariable eingefügt wird:quelle
curl ifconfig.co
Befehl .. Danke :)Wenn Sie eine echte
IP
Adresse (keine BrückeIP
) möchtenWindows
und Docker18.03
(oder einen neueren) haben, gehen Sie wie folgt vor:Führen Sie bash auf dem Container vom Host aus, auf dem sich der Bildname befindet
nginx
(funktioniertAlpine Linux distribution
):Dann in den Behälter laufen lassen
192.168.65.2
ist die IP des Hosts - nicht die Bridge-IP wie in derspinus
akzeptierten Antwort.Ich benutze hier host.docker.internal :
quelle
Alpine Linux
? Wenn nicht, überprüfen Sie das Äquivalent für Ihre spezifischenlinux distribution
.linux containers
und verwende es nicht.windows containers
Sie können dies tun, indem Sie mit der rechten Maustaste auf klickendocker icon
und auswählenSwitch to Linux containers
. Ich denke, das könnte wichtig sein, wenn Sie ein Bild herunterladen. Wenn Siewindows container
überprüft haben, obnginx
Sie ein altes Bild löschen und erneut herunterladen, erhalten Sie einen anderen Container. Wenn es bei Ihnen immer noch nicht funktioniert, können Sie versuchen, esnslookup
in der zu installierenash
.host.docker.internal
) aus dem ContainerTLDR für Mac und Windows
... druckt die IP-Adresse des Hosts ...
Einzelheiten
Unter Mac und Windows können Sie den speziellen DNS-Namen verwenden
host.docker.internal
.quelle
Docker für Mac Ich möchte eine Verbindung von einem Container zu einem Dienst auf dem Host herstellen
Der Host hat eine sich ändernde IP-Adresse (oder keine, wenn Sie keinen Netzwerkzugriff haben). Ab dem 18.03. Empfehlen wir, eine Verbindung zum speziellen DNS-Namen host.docker.internal herzustellen, der in die vom Host verwendete interne IP-Adresse aufgelöst wird.
Das Gateway ist auch als gateway.docker.internal erreichbar. https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds
quelle
Wenn Sie die Docker-Remote-API aktiviert haben ( z. B. über) und den Hostnamen oder die IP-Adresse des Hostcomputers kennen, kann dies mit viel Bash durchgeführt werden.
-H
tcp://0.0.0.0:4243
Innerhalb des Benutzers meines Containers
bashrc
:In der zweiten Zeile wird die Container-ID aus Ihrer lokalen
/proc/self/cgroup
Datei abgerufen.Die dritte Zeile wird auf den Hostcomputer übertragen (vorausgesetzt, Sie verwenden 4243 als Docker-Port) und verwendet dann den Knoten, um den zurückgegebenen JSON für den zu analysieren
DESIRED_PORT
.quelle
HostPort
können hier nützliche Informationen sein, leiderHostIp
könnte das sein0.0.0.0
Ich habe Ubuntu 16.03. Für mich
tut NICHT (falsche IP wurde generiert)
Meine Arbeitslösung war:
quelle
Hier ist eine weitere Option für diejenigen, die Docker in AWS ausführen. Diese Option vermeidet die Verwendung von apk zum Hinzufügen des Curl-Pakets und spart wertvolle 7 MB Platz. Verwenden Sie das integrierte wget (Teil der monolithischen BusyBox-Binärdatei):
quelle
AFAIK, im Fall von Docker für Linux (Standarddistribution) lautet die IP-Adresse des Hosts immer
172.17.0.1
.Der einfachste Weg, es zu bekommen, ist über
ifconfig
(Schnittstelle docker0) vom Host:Aus einem Docker heraus den folgenden Befehl von einem Docker:
ip -4 route show default | cut -d" " -f3
Sie können es schnell in einem Docker mit der folgenden Befehlszeile ausführen:
Ich hoffe, es hilft.
quelle
Unter Linux können Sie ausführen
In macOS ist Ihr Host-Computer nicht der Docker-Host. Docker installiert sein Host-Betriebssystem in VirtualBox.
quelle
hostname -I
warnt davor, "keine Annahmen über die Reihenfolge der Ausgabe zu treffen".Dies ist eine minimalistische Implementierung in Node.js für diejenigen , die den Host auf AWS EC2-Instanzen unter Verwendung der oben genannten EC2-Metadateninstanz ausführen
und verwendet als
quelle
Wenn Sie einen Windows-Container in einem Service Fabric-Cluster ausführen, ist die IP-Adresse des Hosts über die Umgebungsvariable verfügbar
Fabric_NodeIPOrFQDN
. Service Fabric-Umgebungsvariablenquelle
Hier ist, wie ich es mache. In diesem Fall wird ein Hosts-Eintrag in / etc / hosts im Docker-Image hinzugefügt, der den Stier-Host auf die IP meines lokalen Computers verweist ::
Anschließend kann das Skript im Docker-Container den Hostnamen taurus-host verwenden, um zu meinem lokalen Computer zu gelangen, auf dem sich der Docker-Container befindet.
quelle
Vielleicht ist der von mir erstellte Container auch nützlich: https://github.com/qoomon/docker-host
Sie können einfach den Containernamen dns verwenden, um auf das Hostsystem zuzugreifen, z. B. curl http: // dockerhost: 9200 , sodass Sie keine IP-Adresse benötigen.
quelle
Die von mir verwendete Lösung basiert auf einem "Server", der die externe Adresse des Docker-Hosts zurückgibt, wenn er eine http-Anfrage empfängt.
Auf dem "Server":
1) Starten Sie jwilder / nginx-proxy
2) Starten Sie den ipify-Container
Wenn nun ein Container eine http-Anfrage an den Server sendet, z
Die IP-Adresse des Docker-Hosts wird von ipify über den http-Header "X-Forwarded-For" zurückgegeben.
Beispiel (ipify-Server hat den Namen "ipify.example.com" und läuft auf Port 80, Docker-Host hat IP 10.20.30.40):
Innerhalb des Containers können Sie jetzt anrufen:
quelle
Versuche dies
quelle
Unter Ubuntu kann der
hostname
Befehl mit den folgenden Optionen verwendet werden:-i
,--ip-address
Adressen für den Hostnamen-I
,--all-ip-addresses
alle Adressen für den HostZum Beispiel:
Um der Variablen zuzuweisen, kann der folgende Einzeiler verwendet werden:
quelle
Mit https://docs.docker.com/machine/install-machine/
a) $ docker-machine ip
b) Rufen Sie die IP-Adresse eines oder mehrerer Computer ab.
quelle