Jak uzyskać adres IP hosta dokera z wnętrza kontenera dokera

358

Jak mówi tytuł. Muszę być w stanie pobrać adres IP hostów dokera i map portów z hosta do kontenera i zrobić to wewnątrz kontenera.

Xiamx
źródło
Czy mógłbyś wyjaśnić, w jaki sposób chcesz wykorzystać te informacje? Powiedziałeś „hosty dokerów” - czy korzystasz z Dockera na więcej niż jednym hoście? Kiedy twój kontener zna adres IP hosta i mapy portów, co zrobi?
Andy
Najprostszy sposób na przekazanie adresów IP hosta dokera do kontenera dokera. Myślę, że powinieneś wykonać połączenie wewnątrz kontenera za pomocą „exec kontenera dokera”. Załóżmy, że chcesz wysłać polecenie ping do hosta z wnętrza kontenera busybox, użyj na przykład: $ IP = „8.8.8.8 '&& kontener docker busybox ping $ IP' Sposób na znalezienie adresu IP hosta, użyj tego, co lubisz bardziej.
SauloAlessandre

Odpowiedzi:

314
/sbin/ip route|awk '/default/ { print $3 }'

Jak zauważył @MichaelNeale, nie ma sensu używać tej metody Dockerfile(z wyjątkiem sytuacji, gdy potrzebujemy tego adresu IP tylko w czasie kompilacji), ponieważ ten adres IP zostanie zakodowany na stałe podczas kompilacji.

spinus
źródło
49
Kiedy używasz mostka dokującego (domyślnie) dla kontenerów, spowoduje to wygenerowanie adresu IP mostu, takiego jak 172.17.42.1, zamiast adresu IP hosta, takiego jak 192.168.1.x (Zakładam, że twój host ma macierzystą translację NAT). Przy użyciu @Magno Torres odpowiedź jest prawdopodobnie tym, czego ludzie chcą w takich sytuacjach, jeśli chcesz adres 192.168.1.x.
Programster
2
że RUN nie będzie działał zgodnie z oczekiwaniami - będzie obliczał tylko adres IP w czasie kompilacji - i po tym będzie na zawsze statyczny i nie będzie użyteczny. Będzie to adres IP hosta kompilacji.
Michael Neale
7
@Programster, mogę założyć, że ludzie chcą połączenia między hostem dokera a kontenerem, to może dać mostek IP (oczywiście w standardowej instalacji „domowej”). Dlaczego ktokolwiek miałby potrzebować „prawdziwego” adresu IP hosta, jeśli może być nawet poza mostem dokującym i może być niedostępny? Jest to rozwiązanie dla wszystkich osób, które właśnie zainstalowały dokera i chcą z nim grać w krótkim czasie.
spinus
1
@MichaelNeale, tak jak poprzednio, zakładam, że większość osób rozpoczynających pracę z dokerem potrzebuje połączenia między hostem a kontenerem, to wszystko. Jeśli ktoś dokonuje „właściwych” wdrożeń, prawdopodobnie i tak nie korzysta z mostka dokującego, korzysta z niestandardowej sieci i prawdopodobnie jest świadomy wszystkich dziwactw sieciowych lub ma skonfigurowane DNS (lub cokolwiek innego).
spinus
1
@spinus - ale będzie to poprawne tylko wtedy, gdy będzie działało na hoście, na którym zostało zbudowane - w takim przypadku - możesz po prostu napisać na stałe kod - lub sprawdzić - myślę, że nie jest to pomocna odpowiedź i wiele wprowadzać w błąd osób - zalecamy usunięcie. (Bit RUN)
Michael Neale
182

Od wersji 18.03 można używać host.docker.internaljako adresu IP hosta.

Działa w Docker na Mac , Docker na Windows i być może także na innych platformach.

Jest to aktualizacja specyficzna dla komputerów Mac docker.for.mac.localhost, dostępna od wersji 17.06 i docker.for.mac.host.internaldostępna od wersji 17.12, która może nadal działać na tej platformie.

Uwaga: tak jak w dokumentacji Mac i Windows , służy to wyłącznie do celów programistycznych.

Na przykład mam ustawione zmienne środowiskowe na moim hoście:

MONGO_SERVER=host.docker.internal

W moim docker-compose.ymlpliku mam to:

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
Allanberry
źródło
2
@allanberry niestety ludzie z Docker wolą nie dawać nam niezależnego od platformy sposobu, aby to zrobić, ponieważ wolą nie uwzględniać niezamierzonych przypadków użycia (takich jak dostęp do dowolnej usługi na lokalnej maszynie z kontenera dokującego)
Andy
21
Przedstawiono mi Dockera, jak Zbuduj raz, uruchom go wszędzie. Jest to jednak nieprawdziwa prawda, ponieważ zawsze musisz również skonfigurować system hosta. docker.for.mac..Jest to więc bezużyteczne, ponieważ w większości przypadków w Twojej firmie nie ma środowiska opartego tylko na systemie Linux lub Mac. Jest mieszany, masz programistów używających Linuksa, Maca i Windowsa. Ta domena nie ma sensu, ponieważ w 99% jest mieszanym środowiskiem systemu operacyjnego Host. Nie rozwijam kontenera pod macOS i nie wdrażam go na serwerze macOS. Wdrażam go w systemie Linux. Tak robią wszyscy. Więc o co w tym wszystkim chodzi docker.for.mac..?
TheFox
1
@allanberry docker.for.mac.host.internalnie ma znaczenia, czy używasz Dockera z, czy bez docker-compose. Chcę użyć stałego hosta w plikach konfiguracyjnych. Na przykład IDK, docker.host.internalktóry zawsze wskazuje adres IP hosta. Niezależnie od używanego systemu hosta. O to w ogóle chodzi o używanie Dockera: chcę być autonomiczny. Rozumiem, że na MacOS jest to jeszcze trudniejsze, ponieważ masz inną warstwę między systemem hosta a kontenerem. Ale w każdym razie moim zdaniem docker.for.mac.host.internaljest bezużyteczny, jeśli można go używać tylko w systemie macOS.
TheFox
1
host.docker.internal działa również w Docker dla Windows , przynajmniej w momencie pisania tego komentarza.
joanlofe
1
to działa idealnie, mam dockerCe na okna i uruchamiam jenkins w jednym z kontenerów. Chciałem uruchomić polecenie dokera w Jenkins, ale doktor nie był w stanie połączyć się w kroku dodawania chmurki, użyłem tego tcp: //host.docker.internal: 2375 i włączyłem „wystaw demona na localhost: 2375” i to działa. zaoszczędził dużo czasu. Dzięki!
Vikash
84

Aktualizacja: W Docker dla komputerów Mac od wersji 18.03 można użyć host.docker.internal jako adresu IP hosta. Zobacz odpowiedź allanberry . W przypadku wcześniejszych wersji Docker na komputery Mac przydatne mogą być następujące odpowiedzi:

W Docker dla komputerów Mac docker0most nie istnieje, więc inne odpowiedzi tutaj mogą nie działać. Cały ruch wychodzący jest jednak kierowany przez hosta nadrzędnego, więc dopóki próbujesz połączyć się z adresem IP, który rozpoznaje jako sam (a kontener dokerów nie myśli, że jest sam), powinieneś być w stanie się połączyć. Na przykład, jeśli uruchomisz to z komputera nadrzędnego:

ipconfig getifaddr en0

Powinno to pokazać adres IP komputera Mac w bieżącej sieci, a kontener dokerów powinien mieć możliwość połączenia się z tym adresem. Jest to oczywiście bolesne, jeśli ten adres IP kiedykolwiek się zmienia, ale możesz dodać niestandardowy IP sprzężenia zwrotnego do komputera Mac, którego kontener nie uważa za sam, wykonując coś takiego na komputerze nadrzędnym:

sudo ifconfig lo0 alias 192.168.46.49

Następnie możesz przetestować połączenie z poziomu kontenera dokowanego za pomocą usługi telnet. W moim przypadku chciałem połączyć się ze zdalnym serwerem xdebug:

telnet 192.168.46.49 9000

Teraz, gdy ruch przychodzi na komputer Mac adresowany na 192.168.46.49 (a cały ruch opuszczający kontener przechodzi przez komputer Mac), komputer Mac przyjmuje, że adres IP jest sam. Po zakończeniu używania tego adresu IP możesz usunąć alias sprzężenia zwrotnego w następujący sposób:

sudo ifconfig lo0 -alias 192.168.46.49

Jedną z rzeczy, na które należy uważać, jest to, że kontener dokerów nie wysyła ruchu do hosta nadrzędnego, jeśli uważa, że ​​sam cel jest miejscem docelowym. Jeśli masz problemy, sprawdź interfejs sprzężenia zwrotnego wewnątrz kontenera:

sudo ip addr show lo

W moim przypadku pokazało to, inet 127.0.0.1/8co oznacza, że ​​nie mogłem użyć żadnych adresów IP w tym 127.*zakresie. Dlatego użyłem 192.168.*w powyższym przykładzie. Upewnij się, że używany adres IP nie powoduje konfliktu z czymś w Twojej sieci.

Code Commander
źródło
czy wyczyści te ustawienia powrotu po ponownym uruchomieniu systemu?
Robbo_UK
@Robbo_UK Tak, alias sprzężenia zwrotnego zniknie po ponownym uruchomieniu komputera Mac.
Code Commander
1
Użycie tej nazwy hosta nie ma sensu, ponieważ nie działa ona w systemie Docker dla systemu Linux. Dlaczego nie dodali go również do systemu Linux?
TheFox,
Przyglądają się temu w tej chwili @ TheFox: github.com/docker/libnetwork/pull/2348
Ivo Pereira,
46

Dla osób korzystających z Dockera w AWS metadane instancji dla hosta są nadal dostępne z wnętrza kontenera.

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

Na przykład:

$ 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
Nate Fox
źródło
Jest to bardzo wygodna metoda dla osób korzystających z AWS. Używam tego do konfigurowania klienta agenta Consul i wiązania adresów. Jest to idealne rozwiązanie, gdy jesteś w sytuacjach, w których nie możesz korzystać z sieci hosta (np. Wdrażanie kontenerów w Elastic Beanstalk i ECS).
Richard Clayton,
To ratownik, dzięki. Miałem problem z ustaleniem sposobu obsługi komunikacji między kontenerami w moim klastrze ECS.
Brennan,
Na podstawach Phusion (opartych na ubuntu) musiałem nieco zmienić twoje polecenie:ifconfig eth0 | grep -oP 'inet \K\S+'
Meuoi
25

Jedynym sposobem jest przekazanie informacji o hoście jako środowiska podczas tworzenia kontenera

run --env <key>=<value>
Magno Torres
źródło
19
Mówiąc dokładniej, adres IP mostu można przekazać przy użyciu opcji wiersza polecenia, takiej jak: -e "DOCKER_HOST=$(ip -4 addr show docker0 | grep -Po 'inet \K[\d.]+')"(używając zaakceptowanej odpowiedzi z unix.stackexchange.com/questions/87468/... )
ncoghlan
7
Myślę, że to nie działa w Docker na Mac / Windows. (most IP)
zx1986,
22

--add-hostMoże być rozwiązaniem bardziej czystsze (ale bez części portu, jedynie host może być obsługiwane z tego rozwiązania). Więc, na twój docker runrozkaz, zrób coś takiego:

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

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

Augunrik
źródło
Powiedziałem „stworzone do tego”, gdy ktoś chciał mieć wpis w / etc / hosts; w tym pytaniu tak naprawdę nie jest prawdą. Również OP poprosił o „hosta i mapy portów”, a ty pokryłeś tylko hosta.
Bryan
Ok. Byłem trochę zdezorientowany, ponieważ zaakceptowane rozwiązanie obejmuje tylko część główną. I myślę, że twoje rozwiązanie jest lepsze niż spinus.
Augunrik
to nie działa, jeśli chcesz użyć dind - doker-in-docker. Wewnętrzna doker będzie miała inny adres IP
głośny
12

Standardową najlepszą praktyką dla większości aplikacji, które chcą to zrobić automatycznie, jest: nie . Zamiast tego osoba uruchamiająca kontener wstrzykuje zewnętrzną nazwę hosta / adres IP jako konfigurację, np. Jako zmienną środowiskową lub plik konfiguracyjny. Zezwolenie użytkownikowi na wstrzyknięcie tego daje najbardziej przenośny projekt.

Dlaczego miałoby to być takie trudne? Ponieważ kontenery z założenia będą izolować aplikację od środowiska hosta. Sieć jest domyślnie umieszczana w przestrzeni nazw tylko tego kontenera, a szczegóły hosta są chronione przed procesem uruchomionym w kontenerze, który może nie być w pełni zaufany.


Istnieją różne opcje w zależności od konkretnej sytuacji:

Jeśli twój kontener działa z siecią hosta, możesz spojrzeć bezpośrednio na tabelę routingu na hoście, aby zobaczyć domyślną trasę. Z tego pytania działają dla mnie np .:

ip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p'

Przykład pokazujący to z siecią hosta w kontenerze wygląda następująco:

docker run --rm --net host busybox /bin/sh -c \
  "ip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p'"

W przypadku niektórych wersji Docker Desktop wstrzyknęły wpis DNS do wbudowanej maszyny wirtualnej:

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

Jeśli pracujesz w środowisku chmurowym, możesz sprawdzić usługę metadanych od dostawcy chmury, np. AWS:

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

Jeśli chcesz mieć swój adres zewnętrzny / internetowy, możesz wysłać zapytanie do zdalnej usługi, takiej jak:

curl ifconfig.co

Każdy z nich ma ograniczenia i działa tylko w określonych scenariuszach. Najbardziej przenośną opcją jest nadal uruchamianie kontenera z adresem IP wprowadzonym jako konfiguracja, np. Oto opcja uruchomienia wcześniejszego ippolecenia na hoście i wstrzyknięcia go jako zmiennej środowiskowej:

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
BMitch
źródło
Naprawdę pomocne curl ifconfig.copolecenie .. Dzięki :)
MadAboutProgramming
8

Jeśli chcesz mieć prawdziwy IPadres (nie most IP) Windowsi masz dokera18.03 (lub nowsze), wykonaj następujące czynności:

Uruchom bash na kontenerze z hosta, na którym znajduje się nazwa obrazu nginx(działa na Alpine Linux distribution):

 docker run -it nginx /bin/ash

Następnie wbiegnij do pojemnika

/ # nslookup host.docker.internal

Name:      host.docker.internal
Address 1: 192.168.65.2

192.168.65.2to adres IP hosta - nie adres IP mostka, jak w spinuszaakceptowanej odpowiedzi.

Używam tutaj host.docker.internal :

Host ma zmieniający się adres IP (lub żaden, jeśli nie masz dostępu do sieci). Od 18.03 r. Naszym zaleceniem jest łączenie się ze specjalną nazwą DNS host.docker.internal, która działa na wewnętrzny adres IP używany przez host. Ma to na celu rozwój i nie będzie działać w środowisku produkcyjnym poza Docker dla Windows.

Kamil Witkowski
źródło
2
Próbowałem rozwiązania i wydaje się, że nie można znaleźć polecenia nslookup
Sergey
@Sergey Czy Twoje zdjęcie jest oparte Alpine Linux? Jeśli nie, sprawdź odpowiednik dla swojego konkretnego linux distribution.
Kamil Witkowski
Nie, używam dokładnie twojego polecenia - docker run -it nginx / bin / ash
Sergey
Ok - jeśli korzystasz z systemu Windows, przełączyłem się na linux containersi nie używam windows containers. Możesz to zrobić, klikając prawym przyciskiem myszy docker iconi wybierając Switch to Linux containers. Myślę, że może to być ważne podczas pobierania obrazu. Jeśli windows containersprawdziłeś, czy usunięcie starego nginxobrazu i pobranie go ponownie, dostaniesz inny pojemnik. Jeśli nadal nie będzie działać, możesz spróbować zainstalować nslookupw ash.
Kamil Witkowski
Jeśli nie możesz wykonać nslookup, po prostu zrób ping. Wyświetli rozstrzygnięty adres IP. Dla mnie ta odpowiedź działa, a ja po prostu używam tej nazwy hosta ( host.docker.internal) z wnętrza kontenera
Dmitrij Minkovsky
7

TLDR dla komputerów Mac i Windows

docker run -it --rm alpine nslookup host.docker.internal

... drukuje adres IP hosta ...

nslookup: can't resolve '(null)': Name does not resolve

Name:      host.docker.internal
Address 1: 192.168.65.2

Detale

Na komputerach Mac i Windows można użyć specjalnej nazwy DNS host.docker.internal.

Host ma zmieniający się adres IP (lub żaden, jeśli nie masz dostępu do sieci). Od 18.03 r. Naszym zaleceniem jest łączenie się ze specjalną nazwą DNS host.docker.internal, która działa na wewnętrzny adres IP używany przez host. Służy to do celów programistycznych i nie będzie działać w środowisku produkcyjnym poza Docker Desktop dla komputerów Mac.

Nick Grealy
źródło
1
Nie dodawaj tej samej odpowiedzi do wielu pytań . Odpowiedz na najlepszy i oznacz resztę jako duplikaty, gdy zdobędziesz wystarczającą reputację. Jeśli nie jest to duplikat, dostosuj post do pytania i oznacz go jako usunięty.
Bhargav Rao
6

Docker dla komputerów Mac Chcę połączyć się z kontenera z usługą na hoście

Host ma zmieniający się adres IP (lub żaden, jeśli nie masz dostępu do sieci). Od 18.03 r. Naszym zaleceniem jest łączenie się ze specjalną nazwą DNS host.docker.internal, która działa na wewnętrzny adres IP używany przez host.

Dostęp do bramy można również uzyskać jako gateway.docker.internal. https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds

BSCheshir
źródło
5

Jeśli włączyłeś zdalny interfejs API dokera ( na przykład) i znasz nazwę hosta lub adres IP komputera hosta, można to zrobić z dużą szybkością.-Htcp://0.0.0.0:4243

W obrębie użytkownika mojego kontenera 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'
)

Druga linia pobiera identyfikator kontenera z /proc/self/cgrouppliku lokalnego .

Trzecia linia zwija się na maszynie hosta (zakładając, że używasz 4243 jako portu dokera), a następnie używa węzła do analizy zwróconego JSON dla DESIRED_PORT.

ICas
źródło
Dotyczy to tylko korzystania z przekierowania portów. Rzeczywiście HostPortmogą tu być przydatne informacje, niestety HostIpmoże to być0.0.0.0
Arnout Engelen
4

Mam Ubuntu 16.03. Dla mnie

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

nie nie działa (źle Ip został generowania)

Moje działające rozwiązanie było następujące:

docker run --add-host dockerhost:`docker network inspect --format='{{range .IPAM.Config}}{{.Gateway}}{{end}}' bridge` [image]
ilya_direct
źródło
3

Oto kolejna opcja dla osób korzystających z Dockera w AWS. Ta opcja pozwala uniknąć używania apk do dodawania paczki curl i oszczędza cenne 7 MB miejsca. Użyj wbudowanego wget (część monolitycznego pliku binarnego BusyBox):

wget -q -O - http://169.254.169.254/latest/meta-data/local-ipv4
kenn
źródło
3

AFAIK, w przypadku Dockera dla Linuksa (standardowa dystrybucja), adres IP hosta zawsze będzie 172.17.0.1 .

Najprostszym sposobem na uzyskanie tego jest ifconfig(interfejs dokujący interfejs0) z hosta:

ifconfig

Z poziomu okna dokowanego następujące polecenie z okna dokowanego: ip -4 route show default | cut -d" " -f3

Możesz go szybko uruchomić w oknie dokowanym za pomocą następującego wiersza polecenia:

# 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"

Mam nadzieję, że to pomoże.

Nek
źródło
2

W systemie Linux możesz biegać

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

W systemie macOS komputer hosta nie jest hostem Docker. Docker zainstaluje system hosta w VirtualBox.

HOST_IP=`docker run busybox ping -c 1 docker.for.mac.localhost | awk 'FNR==2 {print $4}' | sed s'/.$//'`
Aref Aslani
źródło
1
Pierwszy blok kodu pobierze adres IP kontenera, a nie adres IP hosta
Ari
mandoc hostname -Iostrzega, aby „nie przyjmować żadnych założeń dotyczących kolejności danych wyjściowych”.
Cann_Mutably_borrow
1

Jest to minimalistyczna implementacja w Node.js dla tego, kto obsługuje host na instancjach AWS EC2 , używając wspomnianej wcześniej instancji EC2 Metadata

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

i używane jako

ec2(function(err, ip) {
        if(err) console.log(err)
        else console.log(ip);
    })
loretoparisi
źródło
0

Oto jak to robię. W tym przypadku dodaje wpis hosta do / etc / hosts w obrazie dokera wskazujący taurus-host do mojego adresu IP komputera lokalnego:

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

Następnie, z poziomu kontenera Docker, skrypt może użyć nazwy hosta taurus-host, aby dostać się na moją lokalną maszynę, na której znajduje się kontener Docker.

djangofan
źródło
0

Rozwiązanie, którego używam, opiera się na „serwerze”, który zwraca zewnętrzny adres hosta Dockera po otrzymaniu żądania http.

Na „serwerze”:

1) Uruchom jwilder / nginx-proxy

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

2) Uruchom kontener ipify

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

Teraz, gdy kontener wysyła żądanie HTTP do serwera, np

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

adres IP hosta Docker jest zwracany przez ipify przez nagłówek http „X-Forwarded-For”

Przykład (serwer ipify ma nazwę „ipify.example.com” i działa na porcie 80, host dokera ma adres 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

Wewnątrz kontenera możesz teraz zadzwonić:

# curl http://ipify.example.com
10.20.30.40
ramazotto
źródło
0

Spróbuj tego

Uruchom okno dokowane --rm -i --net = host alpine ifconfig

Ołeksandr Dudnyk
źródło
-2

W systemie Ubuntu hostnamepolecenia można używać z następującymi opcjami:

  • -i, --ip-address adresy nazwy hosta
  • -I, --all-ip-addresseswszystkie adresy hosta

Na przykład:

$ hostname -i
172.17.0.2

Aby przypisać zmienną, można zastosować następującą linijkę:

IP=$(hostname -i)
kenorb
źródło
To da ci adres IP kontenera Docker, a nie hosta
Mario Camou
-7

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

a) $ doker-maszyna ip

b) Uzyskaj adres IP jednego lub więcej komputerów.

  $ docker-machine ip host_name

  $ docker-machine ip host_name1 host_name2
kalyani chaudhari
źródło
10
Pobiera adres IP maszyny wirtualnej, która obsługuje kontenery dokerów, a nie adres hosta, w którym działają kontenery.
Spencer Williams
2
Dotyczy to tylko dokera działającego na maszynie dokującej. Nowa aplikacja dokująca dla systemu Mac nie działa na maszynie dokującej.
thomas.han,