Chciałem tylko upewnić się, że inne nooby nie popełniają mojego błędu i spróbować uzyskać adres IP z obrazu zamiast z kontenera. Upewnij się, że otrzymasz identyfikator CID lub identyfikator kontenera i zapytaj o to; CID za pośrednictwem „docker ps”, to znaczy.
Paul Gregoire,
Jak zdobyć odwrotnie? Host IP czy połączenie z kontenera?
To o wiele lepsze rozwiązanie. Zapytaj tylko o to, czego potrzebujesz, jeśli to możliwe!
MikeyB
8
Hmm Uzyskiwanie <no value>odpowiedzi na komputerze Mac przy użyciu Fig / Boot2Docker
cevaris
2
@cevaris Otrzymasz, <no value>jeśli spróbujesz uruchomić to na kontenerze, który nie jest uruchomiony. Upewnij się, że Twój kontener działa, zanim to zrobisz.
TheJediCowboy
55
!OSTRZEŻENIE! To już nie działa. Nowy format jest specyficzny dla kontenera i ma formę {{ .NetworkSettings.Networks.$network.IPAddress }}. Domyślnie wydaje się, że jest to most, ale pod komponentem dokującym będzie to konkretna nazwa, która zależy od nazwy twojej aplikacji (myślę z flagi --project-name, choć będzie to również zależeć od rodzaju konfiguracji sieci skonfigurowałeś). Pełną odpowiedź napisałem w odpowiedzi tutaj stackoverflow.com/questions/17157721/…
Dunk
5
Może jestem śpiącą owcą, ale ostrzeżenie o podwójnych cytatach nie było odważne i wystarczająco mrugające, by zwrócić moją uwagę. Może podaj dwa przykłady wyraźnie oznaczone Linux i Windows. Dosłownie po prostu wpisałem przykład, sprawdziłem dokumenty, które również używają pojedynczych cudzysłowów, a następnie przejrzałem błąd. Jestem pewien, że nie jestem sam.
Wyck
513
Możesz użyć docker inspect <container id> .
Na przykład:
CID=$(docker run -d -p 4321 base nc -lk 4321);
docker inspect $CID
Aby wyodrębnić ip, możesz zrobić coś takiego docker inspect $CID | grep IPAddress | cut -d '"' -f 4, działa dobrze :)
creack
9
Łącząc to wszystko razem, ten alias powłoki powinien zawierać listę wszystkich identyfikatorów kontenerów i ich adresów IP:alias dockerip='docker ps | tail -n +2 | while read cid b; do echo -n "$cid\t"; docker inspect $cid | grep IPAddress | cut -d \" -f 4; done'
ko-dos
64
Jak wspomniano w @ user3119830, istnieje nowa opcja kontroli. Teraz możesz uzyskać Ip łatwiejdocker inspect -format '{{ .NetworkSettings.IPAddress }}' ${CID}
creack
16
Tylko uwaga. Opcje pojedynczego myślnika są przestarzałe, aby -format stał się --format.
jamtur01
7
docker inspect -format '{{ .NetworkSettings.IPAddress }}' ${CID}to nowa składnia. -formatjest przestarzałe, staje się --format.
Devy,
408
Najpierw pobierz identyfikator kontenera:
docker ps
(Pierwsza kolumna dotyczy identyfikatora kontenera)
Użyj identyfikatora kontenera, aby uruchomić:
docker inspect <container ID>
Na dole, w „NetworkSettings”, znajdziesz „IPAddress”
Szkoda, w jednym z moich wystąpień (rozpoczęte od docker run -it MYCONTAINER /bin/bash) wyjście inspectnie ma sekcji NetworkSettings!
Eric,
3
To nie działa w systemie Windows 10. Musisz także znaleźć adres IP DockerNAT za pomocą ipconfig.
ntiedt
@ Eric Możesz również sprawdzić most sieciowy:docker network inspect bridge | grep Gateway | grep -o -E '[0-9.]+'
Tomasz Kapłoński
5
Zdecydowanie wolę ... | grep IProzwiązanie od wszystkich szczegółów formatowania wymaganych do uzyskania adresu IP. +1
d8aninja
1
@Eric - pomyliłeś pojemnik z obrazem . Komenda jest w rzeczywistości docker run -it MYIMAGE(to nie jest nazwa kontenera ); jeśli to zrobisz docker inspect MYIMAGE, otrzymasz statyczne informacje o obrazie . Musisz znaleźć nazwę działającego kontenera (lub użyć jego identyfikatora, jak sugerują inni). W moim systemie pierwszy taki kontener utworzony z tego obrazu ma domyślną nazwę MYIMAGE_1, podobnie jak docker inspect MYIMAGE_1NetworkSettings.
ToolmakerSteve
215
docker inspect CONTAINER_ID | grep "IPAddress"
Możesz dodać -ido grep, aby zignorować sprawę, a nawet następujące będą działać:
Naprawdę podoba mi się to, ale nie działa również w Docker Compose, co ma związek z posiadaniem własnej sieci. Zamiast tego zmień {{.NetworkSettings.IPAddress }}na{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}
clockworkgeek
Oto używam odmiana: docker inspect --format '{{ .NetworkSettings.IPAddress }}' $(docker ps -aq | xargs) | sed -e '/^$/d'. W sed(1)usuwa puste linie do pojemników obecne, ale nie posiadające-adres IP.
NYCeyes
97
Dodaj ten skrypt powłoki do swojego ~/.bashrclub odpowiedniego pliku:
co to znaczy, że twoja sekcja kontenerów jest pusta? Mimo to kontener jest gotowy do pracy.
StackEdd
24
Wykonać:
docker ps -a
Spowoduje to wyświetlenie aktywnych obrazów dokera:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3b733ae18c1c parzee/database "/usr/lib/postgresql/" 6 minutes ago Up 6 minutes 5432/tcp serene_babbage
W oparciu o niektóre odpowiedzi, które kochałem, postanowiłem połączyć je z funkcją, aby uzyskać wszystkie adresy IP i inną dla konkretnego kontenera. Są teraz w moim .bashrcpliku.
Napisałem następujący skrypt Bash, aby uzyskać tabelę adresów IP ze wszystkich uruchomionych kontenerów docker-compose.
function docker_container_names() {
docker ps -a --format "{{.Names}}" | xargs
}
# Get the IP address of a particular container
dip() {
local network
network='YOUR-NETWORK-HERE'
docker inspect --format "{{ .NetworkSettings.Networks.$network.IPAddress }}" "$@"
}
dipall() {
for container_name in $(docker_container_names);
do
local container_ip=$(dip $container_name)
if [[ -n "$container_ip" ]]; then
echo $(dip $container_name) " $container_name"
fi
done | sort -t . -k 3,3n -k 4,4n
}
Powinieneś zmienić zmienną sieć na własną nazwę sieci.
To jest bardzo przydatne. Gdzie mogę znaleźć dokumentację do pisania własnych zapytań Go?
Michael Hoffmann
12
Oto rozwiązanie, które dzisiaj opracowałem w Pythonie, używając docker inspect containerwyjścia JSON jako źródła danych.
Mam wiele kontenerów i infrastruktur, które muszę sprawdzić, i muszę uzyskać podstawowe informacje o sieci z dowolnego kontenera w szybki i ładny sposób sposób. Dlatego stworzyłem ten skrypt.
WAŻNE: Od wersji 1.9 Docker umożliwia tworzenie wielu sieci i dołączanie ich do kontenerów.
Przejdź do skryptu na python2.7, python3 jest teraz w powszechnym użyciu lub napisz dwie wersje
42n4 18.04.117
Zaktualizuję swoją Gist i jak tylko ją otrzymam, opublikuję tutaj. Rzeczywiście, to opakowanie zostało zaprojektowane dla Python 2.7. Dzięki za opinie!
ivanleoncz 18.04.17
9
docker inspect --format '{{ .NetworkSettings.IPAddress }}' <containername or containerID here>
Powyższe działa, jeśli kontener zostanie wdrożony w domyślnej sieci mostowej.
Jeśli jednak korzystam z niestandardowej sieci pomostowej lub sieci nakładkowej, uważam, że poniżej działa lepiej:
Można to nieco uprościć - użyj, docker ps -qaby uniknąć taili --formatuniknąć grep. Możesz również przekazać wiele identyfikatorów kontenerów docker inspectzamiast pętli w powłoce.
Bryan
1
docker ps -qwyświetla tylko numeryczne identyfikatory kontenerów, ale myślę, że lepiej używać ich nazw. tailsłuży tylko do pozbycia się pierwszego wiersza (nagłówka tabeli) i jest nadal potrzebny. Mógłbym użyć --format, jeśli: docker ps | tail -n +2 | while read -a a; do name=${a[$((${#a[@]}-1))]}; echo -ne "$name\t"; docker inspect --format="{{.NetworkSettings.IPAddress}}" $name | cut -d \" -f 4; done. Ale to nie wydaje się dużą poprawą ... grepbyło bardziej czytelne IMO.
Marco Roy,
1
Nieznacznie zmieniona wersja, która najpierw wyświetla adresy IP, w jednym wierszu wraz z nazwą kontenera: docker ps | ogon -n +2 | podczas czytania -aa; do name = $ {a [$ (($ {# a [@]} - 1))]}; doker sprawdza $ nazwa | grep "Adres IP. * [0-9] \ +" | cut -d \ "-f 4 | tr" \ n ""; echo -e "\ t $ {name}"; gotowe
Dla mnie adres IP znajdował się na karcie „Nazwa hosta / porty”, ale była to jednak bardzo pomocna odpowiedź! Pamiętaj, że docker inspectnie działa po uruchomieniu przybornika dokera. Zgłasza adres IP, ale nie jest to poprawny adres, z którego będą korzystać Twoje usługi.
#!/usr/bin/env python
# Coding: utf-8
# Save this file like get-docker-ip.py in a folder that in $PATH
# Run it with
# $ docker inspect <CONTAINER ID> | get-docker-ip.py
import json
import sys
sys.stdout.write(json.load(sys.stdin)[0]['NetworkSettings']['IPAddress'])
Naprawdę podoba mi się ta --formatopcja, ale na początku nie zdawałem sobie z tego sprawy, więc użyłem prostej linijki Python, aby uzyskać ten sam wynik:
To jest właściwe polecenie dla pojedynczej linii. Oto co mam. $ docker inspect c4591485328d | grep IPAddress | grep -v null| cut -d '"' -f 4 | head -1172.17.0.2
Jayant Bhawal,
4
Dla systemu Windows kontenerów użytku
docker exec <container> ipconfig
gdzie <container>jest nazwa lub identyfikator kontenera.
Możesz użyć, docker psaby znaleźć identyfikator kontenera.
Pamiętaj, aby używać „—rm”, w przeciwnym razie będzie on powoli zajmował miejsce na dysku twardym z nieusuniętymi warstwami. Prawie we wszystkich przypadkach dobrze jest sparować „-rm” z „run”.
Chociaż ten link może odpowiedzieć na pytanie, w przypadku przepełnienia stosu odradza się tylko odpowiedzi na link, możesz poprawić tę odpowiedź, biorąc istotne części linku i umieszczając go w swojej odpowiedzi, dzięki czemu Twoja odpowiedź będzie nadal odpowiedzią, jeśli link zostanie zmieniony lub usunięte :)
Odpowiedzi:
--format
Opcjainspect
przychodzi na ratunek.Współczesna składnia klienta Docker to:
Stara składnia klienta Docker to:
Te polecenia zwrócą adres IP kontenera Dockera.
Jak wspomniano w komentarzach: w systemie Windows używaj podwójnych cudzysłowów
"
zamiast pojedynczych cudzysłowów'
wokół nawiasów klamrowych.źródło
<no value>
odpowiedzi na komputerze Mac przy użyciu Fig / Boot2Docker<no value>
jeśli spróbujesz uruchomić to na kontenerze, który nie jest uruchomiony. Upewnij się, że Twój kontener działa, zanim to zrobisz.{{ .NetworkSettings.Networks.$network.IPAddress }}
. Domyślnie wydaje się, że jest to most, ale pod komponentem dokującym będzie to konkretna nazwa, która zależy od nazwy twojej aplikacji (myślę z flagi --project-name, choć będzie to również zależeć od rodzaju konfiguracji sieci skonfigurowałeś). Pełną odpowiedź napisałem w odpowiedzi tutaj stackoverflow.com/questions/17157721/…Możesz użyć
docker inspect <container id>
.Na przykład:
źródło
docker inspect $CID | grep IPAddress | cut -d '"' -f 4
, działa dobrze :)alias dockerip='docker ps | tail -n +2 | while read cid b; do echo -n "$cid\t"; docker inspect $cid | grep IPAddress | cut -d \" -f 4; done'
docker inspect -format '{{ .NetworkSettings.IPAddress }}' ${CID}
docker inspect -format '{{ .NetworkSettings.IPAddress }}' ${CID}
to nowa składnia.-format
jest przestarzałe, staje się--format
.Najpierw pobierz identyfikator kontenera:
(Pierwsza kolumna dotyczy identyfikatora kontenera)
Użyj identyfikatora kontenera, aby uruchomić:
Na dole, w „NetworkSettings”, znajdziesz „IPAddress”
Lub po prostu zrób:
źródło
docker run -it MYCONTAINER /bin/bash
) wyjścieinspect
nie ma sekcjiNetworkSettings
!docker network inspect bridge | grep Gateway | grep -o -E '[0-9.]+'
... | grep IP
rozwiązanie od wszystkich szczegółów formatowania wymaganych do uzyskania adresu IP. +1docker run -it MYIMAGE
(to nie jest nazwa kontenera ); jeśli to zrobiszdocker inspect MYIMAGE
, otrzymasz statyczne informacje o obrazie . Musisz znaleźć nazwę działającego kontenera (lub użyć jego identyfikatora, jak sugerują inni). W moim systemie pierwszy taki kontener utworzony z tego obrazu ma domyślną nazwęMYIMAGE_1
, podobnie jakdocker inspect MYIMAGE_1
NetworkSettings.Możesz dodać
-i
do grep, aby zignorować sprawę, a nawet następujące będą działać:źródło
Aby uzyskać wszystkie nazwy kontenerów i ich adresy IP za pomocą jednego polecenia.
Jeśli używasz
docker-compose
polecenia, będzie to:Dane wyjściowe będą:
źródło
{{.NetworkSettings.IPAddress }}
na{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}
docker inspect --format '{{ .NetworkSettings.IPAddress }}' $(docker ps -aq | xargs) | sed -e '/^$/d'
. Wsed(1)
usuwa puste linie do pojemników obecne, ale nie posiadające-adres IP.Dodaj ten skrypt powłoki do swojego
~/.bashrc
lub odpowiedniego pliku:Następnie, aby uzyskać adres IP kontenera, po prostu wykonaj następujące czynności:
W przypadku nowej wersji Dockera użyj następujących opcji:
źródło
Template parsing error: template: :1:19: executing "" at <.NetworkSettings.IPA...>: map has no entry for key "NetworkSettings"
source ~/.bash_profile
Pokaż wszystkie adresy IP kontenera:
źródło
W Docker 1.3+ możesz to również sprawdzić za pomocą:
Wejdź do działającego Dockera (Linux):
Dla Windowsa:
źródło
docker exec [container-name-or-id] ip a
docker exec [container-id or container-name] ipconfig
Od wersji Docker 1.10.3 kompilacja 20f81dd
O ile nie powiesz Dockerowi inaczej, Docker zawsze uruchamia twoje kontenery w sieci mostów. Możesz więc wypróbować to polecenie poniżej:
Który powinien następnie zwrócić sekcję Kontenery, która wyświetli adres IP tego działającego kontenera.
źródło
Wykonać:
Spowoduje to wyświetlenie aktywnych obrazów dokera:
Użyj wartości ID POJEMNIKA:
„172.17.0.2”
źródło
W oparciu o niektóre odpowiedzi, które kochałem, postanowiłem połączyć je z funkcją, aby uzyskać wszystkie adresy IP i inną dla konkretnego kontenera. Są teraz w moim
.bashrc
pliku.Pierwsze polecenie podaje adres IP wszystkich kontenerów, a drugie konkretny adres IP kontenera.
źródło
Referencyjne kontenery według nazwy:
Następnie pobierz adres IP według nazwy:
źródło
Napisałem następujący skrypt Bash, aby uzyskać tabelę adresów IP ze wszystkich uruchomionych kontenerów
docker-compose
.Powinieneś zmienić zmienną sieć na własną nazwę sieci.
źródło
Oto szybka działająca odpowiedź:
Uzyskaj nazwę lub identyfikator kontenera:
Następnie uzyskaj adres IP:
Uzyskaj port:
źródło
Docker jest napisany w Go i używa również składni Go do celów zapytań.
Aby sprawdzić adres IP konkretnego kontenera, musisz uruchomić polecenie (
-f
dla „format”):Dla identyfikatora lub nazwy kontenera możesz uruchomić polecenie
która wyświetli listę każdego działającego kontenera.
źródło
Oto rozwiązanie, które dzisiaj opracowałem w Pythonie, używając
docker inspect container
wyjścia JSON jako źródła danych.Mam wiele kontenerów i infrastruktur, które muszę sprawdzić, i muszę uzyskać podstawowe informacje o sieci z dowolnego kontenera w szybki i ładny sposób sposób. Dlatego stworzyłem ten skrypt.
WAŻNE: Od wersji 1.9 Docker umożliwia tworzenie wielu sieci i dołączanie ich do kontenerów.
Dane wyjściowe to:
źródło
Powyższe działa, jeśli kontener zostanie wdrożony w domyślnej sieci mostowej.
Jeśli jednak korzystam z niestandardowej sieci pomostowej lub sieci nakładkowej, uważam, że poniżej działa lepiej:
źródło
Aby rozszerzyć odpowiedź ko-dos, oto alias zawierający listę wszystkich nazw kontenerów i ich adresów IP:
źródło
docker ps -q
aby uniknąćtail
i--format
uniknąć grep. Możesz również przekazać wiele identyfikatorów kontenerówdocker inspect
zamiast pętli w powłoce.docker ps -q
wyświetla tylko numeryczne identyfikatory kontenerów, ale myślę, że lepiej używać ich nazw.tail
służy tylko do pozbycia się pierwszego wiersza (nagłówka tabeli) i jest nadal potrzebny. Mógłbym użyć--format
, jeśli:docker ps | tail -n +2 | while read -a a; do name=${a[$((${#a[@]}-1))]}; echo -ne "$name\t"; docker inspect --format="{{.NetworkSettings.IPAddress}}" $name | cut -d \" -f 4; done
. Ale to nie wydaje się dużą poprawą ...grep
było bardziej czytelne IMO.docker inspect $cid | grep IPAddress | cut -d '"' -f 4 | tail -n 1
Używam tego prostego sposobu
na przykład
źródło
Jeśli zainstalowałeś Docker za pomocą Docker Toolbox, możesz użyć aplikacji Kitematic, aby uzyskać adres IP kontenera:
źródło
docker inspect
nie działa po uruchomieniu przybornika dokera. Zgłasza adres IP, ale nie jest to poprawny adres, z którego będą korzystać Twoje usługi.Aby uzyskać adres IP i port hosta kontenera:
Wynik:
źródło
UWAGA!!! w przypadku użycia komponowania Docker:
Ponieważ Docker Compose tworzy izolowaną sieć dla każdego klastra, poniższe metody nie działają
docker-compose
.Najbardziej eleganckim i najłatwiejszym sposobem jest zdefiniowanie funkcji powłoki, która jest obecnie najczęściej głosowaną odpowiedzią @ WouterD :
Docker może zapisywać identyfikatory kontenerów w pliku takim jak programy systemu Linux:
Bieg z
--cidfile=filename
, Docker zrzuca identyfikator kontenera do „filename”.Aby uzyskać więcej informacji, zobacz „ Docker uruchamia odpowiednik PID ”.
Za pomocą pliku PID:
Po
--cidfile
uruchomieniu kontenera z parametremapp.cid
zawartość pliku wygląda następująco:Możesz użyć zawartości pliku, aby sprawdzić kontenery Docker:
Możesz wyodrębnić adres IP kontenera za pomocą wbudowanego skryptu Python:
Oto bardziej przyjazna dla człowieka forma:
Aby uzyskać więcej informacji, zobacz „ 10 alternatyw uzyskania adresów IP kontenera Docker ”.
źródło
W systemie Windows 10:
źródło
Spowoduje to wyświetlenie wszystkich adresów IP kontenerów na hoście:
źródło
Docker sprawdza użycie do wydrukowania wszystkich adresów IP kontenerów i ich nazw
źródło
Dla kompletności:
Naprawdę podoba mi się ta
--format
opcja, ale na początku nie zdawałem sobie z tego sprawy, więc użyłem prostej linijki Python, aby uzyskać ten sam wynik:źródło
Łączenie poprzednich odpowiedzi ze znajdowaniem identyfikatora kontenera na podstawie nazwy obrazu Docker:
źródło
Posługiwać się:
źródło
$ docker inspect c4591485328d | grep IPAddress | grep -v null| cut -d '"' -f 4 | head -1
172.17.0.2
Dla systemu Windows kontenerów użytku
gdzie
<container>
jest nazwa lub identyfikator kontenera.Możesz użyć,
docker ps
aby znaleźć identyfikator kontenera.źródło
Jeśli zapomniałeś ID kontenera lub nie chcesz manipulować poleceniami powłoki, lepiej użyć interfejsu użytkownika, takiego jak Portainer.
https://portainer.io/
Tam znajdziesz wszystkie informacje o kontenerze, również adres IP.
źródło