GNU/Linux >> Znalost Linux >  >> Panels >> Docker

Jak získat IP adresu kontejneru Docker

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.


Docker
  1. Jak spustit program uvnitř kontejneru Docker?

  2. Jak spustit MySQL v kontejneru Docker

  3. Jak SSH do kontejneru Docker

  1. Jak nainstalovat WordPress pomocí Docker

  2. Jak spustit příkaz na spuštěném kontejneru Docker

  3. Jak nainstalovat Vim do kontejneru Docker

  1. Jak přiřadit statickou IP ke kontejneru Docker

  2. Jak vypsat Docker kontejnery

  3. Jak opustit kontejner Docker