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.


49
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:

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

2
@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.
TheFox

1
host.docker.internal funktioniert auch unter Docker für Windows , zumindest zum Zeitpunkt des Schreibens dieses Kommentars.
Joanlofe

1
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?
TheFox

Sie untersuchen es in diesem Moment @TheFox: github.com/docker/libnetwork/pull/2348
Ivo Pereira

46

Für diejenigen, die Docker in AWS ausführen, sind die Instanz-Metadaten für den Host weiterhin im Container 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

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

run --env <key>=<value>

19
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:

docker run --add-host dockerhost:`/sbin/ip route|awk '/default/ { print  $3}'` [my container]

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


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:

getent hosts host.docker.internal | awk '{print $1}'

Wenn Sie in einer Cloud-Umgebung ausgeführt werden, können Sie den Metadatendienst des Cloud-Anbieters überprüfen, z. B. den AWS-Dienst:

curl http://169.254.169.254/latest/meta-data/local-ipv4

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

Wirklich hilfreicher curl ifconfig.coBefehl .. Danke :)
MadAboutProgramming

8

Wenn Sie eine echte IPAdresse (keine Brücke IP) möchten Windowsund Docker 18.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(funktioniert Alpine Linux distribution):

 docker run -it nginx /bin/ash

Dann in den Behälter laufen lassen

/ # nslookup host.docker.internal

Name:      host.docker.internal
Address 1: 192.168.65.2

192.168.65.2ist die IP des Hosts - nicht die Bridge-IP wie in der spinusakzeptierten Antwort.

Ich benutze hier 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 für Windows.


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


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

Das Gateway ist auch als gateway.docker.internal erreichbar. https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds


5

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

Innerhalb des Benutzers meines Containers bashrc:

export hostIP=$(ip r | awk '/default/{print $3}')
export containerID=$(awk -F/ '/docker/{print $NF;exit;}' /proc/self/cgroup)
export proxyPort=$(
  curl -s http://$hostIP:4243/containers/$containerID/json |
  node -pe 'JSON.parse(require("fs").readFileSync("/dev/stdin").toString()).NetworkSettings.Ports["DESIRED_PORT/tcp"][0].HostPort'
)

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]

3

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):

wget -q -O - http://169.254.169.254/latest/meta-data/local-ipv4

3

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:

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"

Ich hoffe, es hilft.


2

Unter Linux können Sie ausführen

HOST_IP=`hostname -I | awk '{print $1}'`

In macOS ist Ihr Host-Computer nicht der Docker-Host. Docker installiert sein Host-Betriebssystem in VirtualBox.

HOST_IP=`docker run busybox ping -c 1 docker.for.mac.localhost | awk 'FNR==2 {print $4}' | sed s'/.$//'`

1
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

und verwendet als

ec2(function(err, ip) {
        if(err) console.log(err)
        else console.log(ip);
    })


0

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 ::

TAURUS_HOST=`ipconfig getifaddr en0`
docker run -it --rm -e MY_ENVIRONMENT='local' --add-host "taurus-host:${TAURUS_HOST}" ...

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.



0

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

# docker run -d -p <external server port>:80 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy

2) Starten Sie den ipify-Container

# docker run -e VIRTUAL_HOST=<external server name/address> --detach --name ipify osixia/ipify-api:0.1.0

Wenn nun ein Container eine http-Anfrage an den Server sendet, z

# curl http://<external server name/address>:<external server port>

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):

# docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy
# docker run -e VIRTUAL_HOST=ipify.example.com --detach --name ipify osixia/ipify-api:0.1.0

Innerhalb des Containers können Sie jetzt anrufen:

# curl http://ipify.example.com
10.20.30.40


-2

Unter Ubuntu kann der hostnameBefehl mit den folgenden Optionen verwendet werden:

  • -i, --ip-address Adressen für den Hostnamen
  • -I, --all-ip-addressesalle Adressen für den Host

Zum Beispiel:

$ hostname -i
172.17.0.2

Um der Variablen zuzuweisen, kann der folgende Einzeiler verwendet werden:

IP=$(hostname -i)

Dies gibt Ihnen die IP-Adresse des Docker-Containers, nicht des Hosts
Mario Camou

-7

Mit https://docs.docker.com/machine/install-machine/

a) $ docker-machine ip

b) Rufen Sie die IP-Adresse eines oder mehrerer Computer ab.

  $ docker-machine ip host_name

  $ docker-machine ip host_name1 host_name2

10
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.
Thomas.han
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.