Zajímá vás, jaká je IP adresa vašeho spuštěného kontejneru dockeru? Chcete-li získat tyto informace, můžete zkontrolovat běžící kontejner.
sudo docker container inspect container_name_or_ID
Neznáte název nebo ID kontejneru? Použijte příkaz sudo docker ps
.
inspect
příkaz vám poskytuje mnoho podrobností o kontejneru, který kontrolujete. Jděte na konec a podívejte se do Networks
k získání IP adresy kontejneru.
Můžete také použít příkaz grep k získání pouze řádků odpovídajících řetězci "IPAddress".
Pokud má váš kontejner více než jednu IP adresu, neznepokojujte se. To není nic neobvyklého. Abyste tomu porozuměli, musíte pochopit, jak mezi sebou kontejnery komunikují.
To vám vysvětlím v další části, po které budou následovat některé další metody získání IP adresy běžícího kontejneru dockeru.
Jak dokovací kontejnery komunikují?
Docker je nástroj pro balení a dodávání softwaru masám pomocí technologie kontejnerizace. Software může mít mnoho účelů, od možná jednoduchého zpracování textu až po úplný webový server, hostování vašich soukromých souborů. Každý z těchto softwarů je rozdělen do mikroslužeb a poté zabalen jako kontejnery. V závislosti na účelu softwaru může jedna služba vyžadovat komunikaci s jinou.
Zvažte například WordPress. Existují dvě služby, jedna je webový server, který obsluhuje frontend, a druhá je backend, databáze. Frontend musí komunikovat s databází, jinak to prostě nebude fungovat.
Této komunikace je dosaženo tím, že ke každému z těchto dvou kontejnerů jsou přidružena alespoň dvě síťová rozhraní, přičemž obě rozhraní jsou připojena ke stejné síti. Tato síť se nazývá "docker network".
Docker network
Představte si síť dockerů jako soubor dostupných IP adres. Pokud dva kontejnery přijmou IP adresy ze stejného fondu, budou moci spolu komunikovat.
Existují především dva typy sítí, výchozí nebo předdefinované sítě a sítě definované uživatelem.
Seznam sítí získáte pomocí následujícího příkazu
docker network ls
Zvažte můj seznam níže:
❯ docker network ls
NETWORK ID NAME DRIVER SCOPE
272ff2e44dc2 bridge bridge local
5e4a3f5e99dd host host local
cdaef1e49ddc none null local
Ignorujte poslední dva a zaměřte se na první síť. bridge
síť je výchozí síť, ke které se každý kontejner připojí, pokud žádná není explicitně specifikována. Další podrobnosti o této síti můžete získat spuštěním docker network inspect bridge
příkaz.
Chystám se filtrovat výstup, protože pro tuto ukázku nepotřebuji všechna data, která inspect
vybuchne.
❯ docker network inspect -f '{{json .IPAM.Config}}' bridge | jq -r .[].Subnet
172.17.0.0/16
Pokud nemáte nainstalovaný jq, nainstalujte jej prosím pomocí správce balíčků vaší distribuce.
Každá z těchto dokovacích sítí má podsíť, v případě bridge
síť, tato podsíť je 172.17.0.0/16. To znamená, že existuje celkem 65 534 - 1 =65 533 použitelných hostitelů nebo IP adres. Odečetl jsem jeden, protože 172.17.0.1 je přiděleno pro bránu. Můžete to vidět také pomocí následujícího příkazu
docker network inspect -f '{{json .IPAM.Config}}' bridge | jq -r .[].Gateway
Kontrola IP adresy vašeho dokovacího kontejneru
Existuje několik způsobů, jak můžete zkontrolovat IP adresy spojené s vaším kontejnerem, zde je seznam všech z nich včetně příkladů příkazů.
Metoda 1:Kontrola kontejneru
inspect
dílčí příkazy dockeru jsou velmi užitečné. Kontejner lze zkontrolovat pomocí docker container inspect [CONTAINER ID]|[CONTAINER NAME]
příkaz.
Kontrola kontejneru znamená získat co nejvíce informací o kontejneru, od portů, proměnných prostředí až po body připojení, data cgroup atd. Lze z něj získat IP adresu.
Pokud spustíte inspect
příkaz na kontejner, získáte spoustu informací ve formátu JSON. Přejděte dolů, dokud nenajdete klíč NetworkSettings
, tam hledejte podklíč IPAddress
. To je IP adresa vašeho kontejneru.
Příkaz k provedení vypadá následovně
docker container inspect [CONTAINER ID]|[CONTAINER NAME]
Zde je můj výstup (zkrácený)
> docker container inspect ubuntu-ip
.
.
.
"NetworkSettings": {
.
.
.
"IPAddress": "172.17.0.2",
.
.
.
Místo toho, abyste to všechno procházeli, můžete výstup filtrovat takto:
docker container inspect -f '{{ .NetworkSettings.IPAddress }}' CONTAINER_ID_OR_NAME
Zde je filtrovaný výstup:
❯ docker container inspect -f '{{ .NetworkSettings.IPAddress }}' ubuntu-ip
172.17.0.2
Pokud chcete získat IP adresu spojenou s konkrétní sítí, použijte příkaz jako je následující
docker container inspect -f '{{ .NetworkSettings.Networks.[NETWORK NAME].IPAddress }}' CONTAINER_ID_OR_NAME
Ukázkový výstup:
❯ docker container inspect -f '{{ .NetworkSettings.Networks.bridge.IPAddress }}' ubuntu-ip
172.17.0.2
Metoda 2:Použití obalu kontejneru
Toto je nejpřímější metoda, ale také něco, co nedoporučuji .
V této metodě připojíte svůj stdin|stdout ke kontejneru a spustíte ip
příkaz (nebo jiný příkaz, který zobrazuje adresy IP spojené s NIC).
Důvod, proč to nedoporučuji, je ten, že mnoho obrázků je poměrně lehkých a neobsahují ip
příkaz (nebo něco podobného).
Vezměte ubuntu:20.04
obrázek jako příklad, spusťte kontejner, jako je následující
docker run --rm --name ubuntu-ip -d ubuntu:20.04 sleep 1d
Aby kontejner běžel, použil jsem sleep 1d
příkaz.
Nyní spusťte proces shellu uvnitř kontejneru a připojte svůj stdin|stdout takto
docker exec -ti ubuntu-ip sh
Až budete v tomto kontejneru, zkuste spustit ip
nebo ifconfig
. Uvidíte něco jako následující:
❯ docker exec -ti ubuntu-ip sh
# ip
sh: 1: ip: not found
# ifconfig
sh: 2: ifconfig: not found
Aby tyto příkazy fungovaly, musíte nainstalovat příslušné balíčky. Chcete-li získat ip
nainstalujte iproute2
balíček a znovu spusťte příkaz jako ip a
# apt update -qq
6 packages can be upgraded. Run 'apt list --upgradable' to see them.
# apt install iproute2 -yqq
# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
4: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
Nyní můžete vidět IP adresu spojenou s kartou [email protected]
je 172.17.0.2.
Všimněte si sítě, jejíž součástí je tento kontejner. Vzhledem k tomu, že jsem nevytvářel a nepřipojoval uživatelsky definovanou síť k tomuto kontejneru, byl připojen k síti mostu, proto je síť této IP adresy 172.17.0.0
Tato metoda jistě funguje, i když je pracnější a není příliš reprodukovatelná, je intuitivní. Následující metody by měly být mnohem lepší než tato.
Metoda 3:Prohlídkou samotné sítě
Kdykoli se kontejner připojí k síti, je tento připojený kontejner viditelný také ze sítě spolu s IP adresou přidělenou těmto kontejnerům.
Protože je můj kontejner připojen k síti mostu, mohu síť zkontrolovat pomocí následujícího příkazu
docker network inspect [NETWORK NAME][NETWORK ID]
Zde místo id použiji název bridge
docker network inspect bridge
Namísto posouvání dolů na Containers
sekce, použiji jq
pro filtrování výstupu tentokrát.
❯ docker network inspect bridge | jq .[].Containers
{
"1c76f35ce42ca0d31cfcc79da80eadfa4f69cb82e292e249ee1bd75d83a8e4ba": {
"Name": "ubuntu-ip",
"EndpointID": "44d6b85348d6274b4ee779f9d3617d184ccfd3bad228ee652141d9b4157c50ae",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
},
"50a4f195d8eae6b6b714e8aa058c6058dbe91d0a272c8ca826d4442df1c63885": {
"Name": "ip",
"EndpointID": "d4e72a4df81ee7023386df9d96676d9c291e2902349eb453338b8e0145a610fd",
"MacAddress": "02:42:ac:11:00:03",
"IPv4Address": "172.17.0.3/16",
"IPv6Address": ""
}
}
Abych to demonstroval, nasadil jsem další kontejner s názvem ip
. Ve výše uvedeném objektu JSON můžete vidět kontejnery a IP adresy. Nyní je zde extrahování IP konkrétního kontejneru o něco obtížnější.
Pokud znáte ID kontejneru, můžete použít jq
takhle
docker network inspect bridge | jq '.[].Containers."[CONTAINER ID]".IPv4Address'
Zde je příklad
❯ docker network inspect bridge | jq '.[].Containers."1c76f35ce42ca0d31cfcc79da80eadfa4f69cb82e292e249ee1bd75d83a8e4ba".IPv4Address' -r
172.17.0.2/16
Většinu času si nemůžete vzpomenout na ID kontejneru, takže pokud chcete získat IP pouze z názvu kontejneru, potřebujete určité znalosti jq
(nebo stačí znovu použít následující příkaz).
docker network inspect -f '{{json .Containers}}' bridge | \
jq '..|if type == "object" and has("Name") then select(.Name=="[CONTAINER NAME]") | .IPv4Address else empty end' -r
Umístěte název kontejneru do select
funkce a uvidíte, jak se kouzlo stane.
❯ docker network inspect -f '{{json .Containers}}' bridge | \
jq '..|if type == "object" and has("Name") then select(.Name=="ubuntu-ip") | .IPv4Address else empty end' -r
172.17.0.2/16
Jakou metodu preferujete? Metoda 1 pravděpodobně
To byly všechny metody, pomocí kterých můžete získat IP adresy docker kontejnerů. Druhá metoda, i když intuitivní, není reprodukovatelná. Většinou je to první metoda, která se používá, protože je to nejjednodušší a dělá práci.
Může však nastat chvíle, kdy budete chtít zkontrolovat, jaké kontejnery jsou připojeny k určité síti, a získat IP adresy v této síti. V takovém případě má kontrola sítě a získání IP adres smysl. Můžete získat všechny názvy kontejnerů a IP adresy, které jim byly přiděleny, ze sítě, jako je tato
❯ docker network inspect -f '{{json .Containers}}' bridge | \
jq '.. | if type=="object" and has("Name") then {(.Name): .IPv4Address} else empty end'
{
"ubuntu-ip": "172.17.0.2/16"
}
{
"ip": "172.17.0.3/16"
}
Změňte bridge
do nějaké jiné sítě a získáte všechny kontejnery a jejich IP adresy takto.
To je pro dnešek vše. Doufám, že vám byl tento článek užitečný. Pokud máte nějaké dotazy, dejte mi vědět v komentářích níže.