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?Ab Version 18.03 können Sie host.docker.internal
als IP des Hosts verwenden.
Funktioniert in Docker für Mac, Docker für Windows und möglicherweise auch in anderen Plattformen.
Dies ist ein Update von docker.for.mac.localhost
, das seit Version 17.06 verfügbar ist, und docker.for.mac.host.internal
, das seit Version 17.12 verfügbar ist und möglicherweise auch auf dieser Plattform funktioniert.
Beachten Sie, wie in der Mac und Windows Dokumentation, dass dies nur für Entwicklungszecke gedacht ist.
Zum Beispiel habe ich Umgebungsvariablen auf meinem Host gesetzt:
MONGO_SERVER=host.docker.internal
In meiner docker-compose.yml
Datei habe ich folgendes:
version: '3'
services:
api:
build: ./api
volumes:
- ./api:/usr/src/app:ro
ports:
- "8000"
environment:
- MONGO_SERVER
command: /usr/local/bin/gunicorn -c /usr/src/app/gunicorn_config.py -w 1 -b :8000 wsgi
Aktualisierung: Bei Docker for Mac können Sie ab der Version 18.03 host.docker.internal als IP des Hosts verwenden. Siehe aljabears Antwort. Für frühere Versionen von Docker for Mac könnte die folgende Antwort jedoch immer noch nützlich sein:
Bei Docker for Mac existiert die docker0
-Bridge nicht, daher funktionieren andere Antworten hier möglicherweise nicht. Der gesamte ausgehende Datenverkehr wird jedoch über Ihren übergeordneten Host geleitet, daher können Sie eine Verbindung herstellen, solange Sie versuchen, sich mit einer IP zu verbinden, die er als sich selbst erkennt (und der Docker-Container nicht als sich selbst betrachtet). Wenn Sie beispielsweise dies vom übergeordneten Rechner ausführen:
ipconfig getifaddr en0
Sollte Ihnen dies die IP Ihres Macs in seinem aktuellen Netzwerk anzeigen und Ihr Docker-Container sollte auch eine Verbindung zu dieser Adresse herstellen können. Natürlich ist es umständlich, wenn sich diese IP-Adresse jemals ändert, aber Sie können Ihrem Mac eine benutzerdefinierte Loopback-IP hinzufügen, die der Container nicht als sich selbst betrachtet, indem Sie auf dem übergeordneten Rechner etwas Ähnliches wie dies tun:
sudo ifconfig lo0 alias 192.168.46.49
Sie können dann die Verbindung von innerhalb des Docker-Containers mit Telnet testen. In meinem Fall wollte ich mich mit einem entfernten xdebug-Server verbinden:
telnet 192.168.46.49 9000
Jetzt, wenn Datenverkehr auf Ihren Mac kommt, der für 192.168.46.49 adressiert ist (und alle aus dem Container abgehenden Datenverkehr durch Ihren Mac geht), wird Ihr Mac annehmen, dass diese IP selbst ist. Wenn Sie diese IP nicht mehr verwenden, können Sie die Loopback-Alia wie folgt entfernen:
sudo ifconfig lo0 -alias 192.168.46.49
Eine Sache, auf die Sie achten sollten, ist, dass der Docker-Container keinen Datenverkehr an den übergeordneten Host sendet, wenn er denkt, dass das Ziel des Datenverkehrs er selbst ist. Überprüfen Sie also das Loopback-Interface innerhalb des Containers, wenn Sie Probleme haben:
sudo ip addr show lo
In meinem Fall zeigte dies inet 127.0.0.1/8
, was bedeutet, dass ich keine IPs im Bereich von 127.*
verwenden konnte. Deshalb habe ich in dem obigen Beispiel 192.168.*
verwendet. Stellen Sie sicher, dass die von Ihnen verwendete IP nicht mit etwas in Ihrem eigenen Netzwerk in Konflikt steht.
Meines Wissens nach wird im Fall von Docker für Linux (Standarddistribution) die IP-Adresse des Hosts immer 172.17.0.1
sein (im Hauptnetzwerk von Docker, weitere Informationen finden Sie in den Kommentaren).
Der einfachste Weg, dies zu erhalten, ist über ifconfig
(Schnittstelle docker0) vom Host aus:
ifconfig
Von innerhalb eines Docker aus kann der folgende Befehl aus einem Docker heraus ausgeführt werden: ip -4 route show default | cut -d" " -f3
Sie können ihn schnell in einem Docker mit folgender Befehlszeile ausführen:
# 1. Führen Sie einen Ubuntu-Docker aus
# 2. Aktualisieren Sie Abhängigkeiten (still)
# 3. Installiere das IP-Paket (still)
# 4. Zeigt (schön) die IP des Hosts an
# 5. Entfernt den Docker (dank des `--rm` Arguments)
docker run -it --rm ubuntu:22.10 bash -c "apt-get update > /dev/null && apt-get install iproute2 -y > /dev/null 2> /dev/null && ip -4 route show default | cut -d' ' -f3"
Für diejenigen, die Docker in AWS ausführen, sind die Instanzmetadaten des Hosts immer noch von innerhalb des Containers verfügbar.
curl http://169.254.169.254/latest/meta-data/local-ipv4
Zum Beispiel:
$ docker run alpine /bin/sh -c "apk update ; apk add curl ; curl -s http://169.254.169.254/latest/meta-data/local-ipv4 ; echo"
fetch http://dl-cdn.alpinelinux.org/alpine/v3.3/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.3/community/x86_64/APKINDEX.tar.gz
v3.3.1-119-gb247c0a [http://dl-cdn.alpinelinux.org/alpine/v3.3/main]
v3.3.1-59-g48b0368 [http://dl-cdn.alpinelinux.org/alpine/v3.3/community]
OK: 5855 distinct packages available
(1/4) Installing openssl (1.0.2g-r0)
(2/4) Installing ca-certificates (20160104-r2)
(3/4) Installing libssh2 (1.6.0-r1)
(4/4) Installing curl (7.47.0-r0)
Executing busybox-1.24.1-r7.trigger
Executing ca-certificates-20160104-r2.trigger
OK: 7 MiB in 15 packages
172.31.27.238
$ ifconfig eth0 | grep -oP 'inet addr:\K\S+'
172.31.27.238
- See previous answers
- Weitere Antworten anzeigen