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.
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:
@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.
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.
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
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:
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:
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
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.
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
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.
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.
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
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.
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):
AFAIK, w przypadku Dockera dla Linuksa (standardowa dystrybucja), adres IP hosta zawsze będzie172.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"
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
Jeśli korzystasz z kontenera systemu Windows w klastrze usługi Service Fabric, adres IP hosta jest dostępny za pośrednictwem zmiennej środowiskowej Fabric_NodeIPOrFQDN. Zmienne środowiskowe sieci szkieletowej usług
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.
Możesz po prostu użyć nazwy kontenera dns, aby uzyskać dostęp do systemu hosta, np. Curl http: // dockerhost: 9200 , więc nie musisz męczyć się z żadnym adresem IP.
Odpowiedzi:
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.źródło
Od wersji 18.03 można używać
host.docker.internal
jako 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 idocker.for.mac.host.internal
dostę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:
W moim
docker-compose.yml
pliku mam to:źródło
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 chodzidocker.for.mac..
?docker.for.mac.host.internal
nie ma znaczenia, czy używasz Dockera z, czy bezdocker-compose
. Chcę użyć stałego hosta w plikach konfiguracyjnych. Na przykład IDK,docker.host.internal
któ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 zdaniemdocker.for.mac.host.internal
jest bezużyteczny, jeśli można go używać tylko w systemie macOS.host.docker.internal
działa również w Docker dla Windows , przynajmniej w momencie pisania tego komentarza.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
docker0
most 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: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:
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:
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:
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:
W moim przypadku pokazało to,
inet 127.0.0.1/8
co oznacza, że nie mogłem użyć żadnych adresów IP w tym127.*
zakresie. Dlatego użyłem192.168.*
w powyższym przykładzie. Upewnij się, że używany adres IP nie powoduje konfliktu z czymś w Twojej sieci.źródło
Dla osób korzystających z Dockera w AWS metadane instancji dla hosta są nadal dostępne z wnętrza kontenera.
Na przykład:
źródło
ifconfig eth0 | grep -oP 'inet \K\S+'
Jedynym sposobem jest przekazanie informacji o hoście jako środowiska podczas tworzenia kontenera
źródło
-e "DOCKER_HOST=$(ip -4 addr show docker0 | grep -Po 'inet \K[\d.]+')"
(używając zaakceptowanej odpowiedzi z unix.stackexchange.com/questions/87468/... )--add-host
Moż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ójdocker run
rozkaz, zrób coś takiego:(Od https://stackoverflow.com/a/26864854/127400 )
źródło
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 .:
Przykład pokazujący to z siecią hosta w kontenerze wygląda następująco:
W przypadku niektórych wersji Docker Desktop wstrzyknęły wpis DNS do wbudowanej maszyny wirtualnej:
Jeśli pracujesz w środowisku chmurowym, możesz sprawdzić usługę metadanych od dostawcy chmury, np. AWS:
Jeśli chcesz mieć swój adres zewnętrzny / internetowy, możesz wysłać zapytanie do zdalnej usługi, takiej jak:
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
ip
polecenia na hoście i wstrzyknięcia go jako zmiennej środowiskowej:źródło
curl ifconfig.co
polecenie .. Dzięki :)Jeśli chcesz mieć prawdziwy
IP
adres (nie mostIP
)Windows
i 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 naAlpine Linux distribution
):Następnie wbiegnij do pojemnika
192.168.65.2
to adres IP hosta - nie adres IP mostka, jak wspinus
zaakceptowanej odpowiedzi.Używam tutaj host.docker.internal :
źródło
Alpine Linux
? Jeśli nie, sprawdź odpowiednik dla swojego konkretnegolinux distribution
.linux containers
i nie używamwindows containers
. Możesz to zrobić, klikając prawym przyciskiem myszydocker icon
i wybierającSwitch to Linux containers
. Myślę, że może to być ważne podczas pobierania obrazu. Jeśliwindows container
sprawdziłeś, czy usunięcie staregonginx
obrazu i pobranie go ponownie, dostaniesz inny pojemnik. Jeśli nadal nie będzie działać, możesz spróbować zainstalowaćnslookup
wash
.host.docker.internal
) z wnętrza konteneraTLDR dla komputerów Mac i Windows
... drukuje adres IP hosta ...
Detale
Na komputerach Mac i Windows można użyć specjalnej nazwy DNS
host.docker.internal
.źródło
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
źródło
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ą.
-H
tcp://0.0.0.0:4243
W obrębie użytkownika mojego kontenera
bashrc
:Druga linia pobiera identyfikator kontenera z
/proc/self/cgroup
pliku 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
.źródło
HostPort
mogą tu być przydatne informacje, niestetyHostIp
może to być0.0.0.0
Mam Ubuntu 16.03. Dla mnie
nie nie działa (źle Ip został generowania)
Moje działające rozwiązanie było następujące:
źródło
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):
źródło
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: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:
Mam nadzieję, że to pomoże.
źródło
W systemie Linux możesz biegać
W systemie macOS komputer hosta nie jest hostem Docker. Docker zainstaluje system hosta w VirtualBox.
źródło
hostname -I
ostrzega, aby „nie przyjmować żadnych założeń dotyczących kolejności danych wyjściowych”.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
i używane jako
źródło
Jeśli korzystasz z kontenera systemu Windows w klastrze usługi Service Fabric, adres IP hosta jest dostępny za pośrednictwem zmiennej środowiskowej
Fabric_NodeIPOrFQDN
. Zmienne środowiskowe sieci szkieletowej usługźródło
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:
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.
źródło
Być może kontener, który utworzyłem, jest również przydatny https://github.com/qoomon/docker-host
Możesz po prostu użyć nazwy kontenera dns, aby uzyskać dostęp do systemu hosta, np. Curl http: // dockerhost: 9200 , więc nie musisz męczyć się z żadnym adresem IP.
źródło
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
2) Uruchom kontener ipify
Teraz, gdy kontener wysyła żądanie HTTP do serwera, np
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):
Wewnątrz kontenera możesz teraz zadzwonić:
źródło
Spróbuj tego
źródło
W systemie Ubuntu
hostname
polecenia można używać z następującymi opcjami:-i
,--ip-address
adresy nazwy hosta-I
,--all-ip-addresses
wszystkie adresy hostaNa przykład:
Aby przypisać zmienną, można zastosować następującą linijkę:
źródło
Z https://docs.docker.com/machine/install-machine/
a) $ doker-maszyna ip
b) Uzyskaj adres IP jednego lub więcej komputerów.
źródło