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

Jak používat příkaz Docker Inspect

Jedním ze základních příkazů Dockeru je docker inspect. Umožňuje extrahovat informace o různých objektech dockeru, vědět, jak je používat, je něco KAŽDÉHO by měl vědět o.

V případě, že by vás zajímalo, objekty nebo prostředky Dockeru jsou jednoduše věci jako kontejnery, svazky, sítě atd.

Hlavní síla inspect vychází z jeho možností formátování.

Můžete například extrahovat IP adresu běžícího kontejneru tak, že jej zkontrolujete a naformátujete specifickým způsobem.

➟ docker container inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nginx172.17.0.2 

Docker používá go-šablony pro formátování svého výstupu.

V tomto článku nejprve projdu základy příkazu Docker inspect a poté se zaměřím na to, jak formátovat výstup podle vašich konkrétních potřeb.

Co dělá Docker inspect?

Inspect vám poskytuje spoustu metadat o všech různých objektech spravovaných dockerem. Druh informací se liší objekt od objektu.

Pokud například zkontrolujete svazek, získáte informace související s tím, kdy byl vytvořen, použitým ovladačem svazku, umístěním v hostitelském souborovém systému, štítky atd.

Pokud se jedná o síť, kterou kontrolujete, získáte informace jako její podsíť, bránu, připojené kontejnery a jejich IP adresy, štítky a další informace.

Abyste lépe porozuměli tomu, co inspect poskytuje pro daný objekt, doporučuji spustit příkazy a přesvědčit se sami.

Jaké jsou objekty, které lze kontrolovat?

V dockeru jsou objektem nebo typem objektu všechny konstrukce, které jsou řízeny dockerem. To zahrnuje následující:-

  1. Kontejnery.
  2. Obrázky.
  3. Sítě.
  4. Svazky.
  5. Kontexty.
  6. Pluginy.
  7. Uzly (objekt roje).
  8. Služby (objekt roje).
  9. Tajemství (objekt roje).
  10. Konfigurace (objekt roje).

Použití příkazu Docker inspect

inspect můžete použít dvěma způsoby dílčí příkaz.

  1. docker inspect [objekt] [možnosti]
  2. docker [typ_objektu] zkontrolovat [objekt] [možnosti]

Druhý způsob je ten, který byste měli používat vždy . kontrola dílčí příkaz poskytuje výstup JSON, za chvíli se do toho pustím.

Vytvořte svazek s názvem unikátní .

jedinečné vytvoření svazku docker 

Nyní vytvořte síť se stejným názvem, unikátní .

jedinečné vytvoření docker network 

Nyní se pokusíme prozkoumat objekt s názvem unique pomocí první syntaxe.

docker inspect unique 

Můj výstup:-

"Scop> ➟ docker inspect unique[ { "Name":"unique", "Id":"09a7e2163ee058b1057d95599f764d571ec6a42a5792803dc125e706caa525b0", "531-02"7:22"53:04 ":"local", "Driver":"bridge", "EnableIPv6":false, "IPAM":{ "Driver":"default", "Options":{}, "Config":[ { "Subnet":"172.21.0.0/16", "Gateway":"172.21.0.1" } ] }, "Internal":false, "Attachable":false, "Ingress":false, "ConfigFrom":{ "Network":"" }, "ConfigOnly":false, "Containers":{}, "Options":{}, "Labels":{} }]

V mém systému, jak můžete vidět inspect zkontroloval jsem síť, ale co kdybych měl v úmyslu zkontrolovat svazek?

Toto je problém s docker inspect , když máte dva různé objekty pojmenované stejně, nemůžete jednoduše použít docker inspect [object_name] . Chcete-li zkontrolovat přesně to, co chcete, musíte buď použít ID objektu, nebo použít --type=[object_type] volba. Předchozí příkaz můžete napsat pomocí --type taková možnost:-

docker inspect --type=volume unique 

Ačkoli to funguje, domnívám se, že je to zbytečné, protože již máme jinou syntaxi. Stačí použít dílčí příkaz specifický pro daný objekt, jako to dělám zde:-

jedinečná kontrola svazku docker 

Méně se píše a mnohem snáze se čte.

Některé užitečné příklady příkazů Docker inspect

V této části zaznamenám seznam běžných dotazů a to, jak by vypadal příslušný příkaz inspect pro získání těchto informací.

Dotazy na kontejner

Pro příklady budu mít spuštěný ukázkový kontejner nginx a všechny příkazy budou spuštěny proti tomuto běžícímu kontejneru. Příkaz, který jsem použil ke spuštění tohoto kontejneru:-

spuštění kontejneru docker \ --rm --name nginx \ -p target=80,published=127.0.0.1:8081,protocol=tcp \ -p target=80,published=[::1]:8081,protocol=tcp \ -e ENV_VAR=nějaká hodnota \ -e ENV_VAR2=linux \ -v $PWD:/mnt:ro \ -v /tmp:/tmp:ro \ -d nginx 

1. ID kontejneru podle názvu

ID kontejneru můžete získat pomocí následujícího příkazu:-

docker container inspect -f '{{.Id}}' [container_name]

Příklad:-

➟ kontrola kontejneru dockeru -f '{{.Id}}' nginx0409779fc2d976387170d664a6aed5ee80a460f8a8dd02c44a02af97df0bb956 

2. Hlavní proces kontejneru

Hlavním procesem kontejneru je v podstatě ENTRYPOINT + CMD .

docker container inspect -f '{{printf "%s " .Cesta}}{{rozsah .Args}}{{printf "%s " .}}{{end}}' [container_name|id ] 

Příklad:-

➟ docker container inspect -f '{{printf "%s " .Path}}{{rozsah .Args}}{{printf "%s " .}}{{end}}' nginx/docker -entrypoint.sh nginx -g démon vypnutý; 

3. Výpis vazeb portů

Následující příkaz uvádí seznam všech vazeb portů kontejner-hostitel.

docker container inspect -f '{{rozsah $target, $publikováno :=.NetworkSettings.Ports}}{{rozsah $publikováno}}{{printf "%s -> %s:%s\n " $target .HostIp .HostPort}}{{end}}{{end}}' [container_name|id] 

Příklad:-

➟ docker container inspect -f '{{rozsah $cíl, $publikováno :=.NetworkSettings.Ports}}{{rozsah $publikováno}}{{printf "%s -> %s:%s\ n" $target .HostIp .HostPort}}{{end}}{{end}}' nginx80/tcp -> ::1:808180/tcp -> 127.0.0.1:8081 
Totéž můžete dosáhnout pomocí portu kontejneru docker příkaz.

4. Výpis jeho IP adres

Kontejner může být připojen k více sítím, namísto tisku jedné z mnoha IP adres můžete pomocí tohoto příkazu vytisknout všechny tyto IP adresy.

docker container inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' [container_name|id] 

Příklad:-

➟ docker container inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nginx172.17.0.2 

5. Výpis proměnných prostředí

Můžete také uvést proměnnou prostředí kontejneru.

docker container inspect -f '{{range .Config.Env}}{{printf "%s\n" .}}{{end}}' [container_name|id] 

Příklad:-

➟ docker container inspect -f '{{range .Config.Env}}{{printf "%s\n" .}}{{end}}' nginxENV_VAR=somevalueENV_VAR2=linuxPATH=/usr/local /sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binNGINX_VERSION=1.19.10NJS_VERSION=0.5.3PKG_RELEASE=1~buster 

6. Výpis připojení svazků/vazeb spolu s režimem

Následující příkaz vytiskne připojení v tomto formátu, "[zdroj] -> [cíl], režim:[režim]".

docker container inspect -f '{{range .Mounts}}{{printf "%s -> %s, režim:%s\n" .Source .Destination .Mode}}{{end}} ' [container_name|id] 

Příklad:-

➟ docker container inspect -f '{{rozsah .Mounts}}{{printf "%s -> %s, režim:%s\n" .Zdroj .Destination .Mode}}{{end} }' nginx/home/debdut -> /mnt, režim:ro/tmp -> /tmp, režim:ro 

Hromadné dotazy

Ke kontrole svazku není mnoho, kromě znalosti umístění hostitele, které je v data-dir/volumes . Tyto informace můžete získat pomocí následujícího příkazu:-

docker volume inspect -f '{{.Mountpoint}}' [volume_name|id] 

Příklad:-

➟ docker volume create unique unique~ ➟ docker volume inspect -f '{{.Mountpoint}}' unique /var/lib/docker/volumes/unique/_data 

Síťové dotazy

Osobně se často setkávám se dvěma dotazy, jedním je znalost podsítě sítě a všech kontejnerů, které jsou k této síti připojeny, a k nim přidružených IP adres.

K tomu jsem vytvořil jednoduchou síť s docker network create unique příkaz.

1. Získání podsítě

Chcete-li získat podsíť, použijte následující příkaz:-

docker network inspect -f '{{range .IPAM.Config}}{{.Subnet}}{{end}}' [název_sítě|id] 

Příklad:-

➟ docker network inspect -f '{{range .IPAM.Config}}{{.Subnet}}{{end}}' unique 172.21.0.0/16 

2. Výpis připojených kontejnerů spolu s jejich IP adresami

Příkaz vypadá takto,

docker network inspect -f '{{range .Containers}}{{printf "%s -> %s\n" .Name .IPv4Address}}{{end}}' [název_sítě|id] 

Příklad:-

➟ docker network inspect -f '{{range .Containers}}{{printf "%s -> %s\n" .Name .IPv4Address}}{{end}}' unique cranky_wescoff -> 172.21 .0.5/16nginx -> 172.21.0.2/16upbeat_carson -> 172.21.0.3/16objective_jones -> 172.21.0.4/16 

Formátování výstupu příkazu Docker inspect

zkontrolovat nám poskytuje pole JSON pro výstup, které můžete filtrovat pomocí něčeho jako jq . Pokud tedy máte zkušenosti s jq , možná ji budete chtít použít. Problém s jq spočívá v tom, že není předinstalovaný ve většině distribucí Linuxu, zatímco výchozí mechanismus formátování docker .. inspect již existuje a je velmi výkonný.

Docker používá go-templates k formátování svého výstupu. Tento článek nebude o go-šablonách, ale pokud se chcete dozvědět více, můžete si o tom přečíst zde.

Interně jsou JSON reprezentovány pomocí různých datových struktur Go. Proto šablony go ve skutečnosti pracují s datovými typy go. Protože nechci vysvětlovat, co tyto datové struktury jsou, místo použití těchto termínů použiji termíny JSON, aby to bylo srozumitelnější.

Extrahování jednoduchých polí

Zvažte objekt JSON, jako je tento:-

{ "mary":43, "john":44} 

Řekněme, že chcete extrahovat informace spojené s klíčem mary . K tomu použijete tečkovou [.] notaci, kde před klíčem přidáte tečku a rekurzivně přidáte klíče pro všechny vnořené klíče. To je stejné jako jq . Takže .mary tady by bylo 43.

Zvažte nyní následující JSON.

{ "mary":{ "jane":43, "soyas":56 }, "john":65} 

V tomto případě .mary.jane by bylo 43 a podobně .mary.soyas bude 56.

Podobnou syntaxi lze použít s go-templates. Chcete-li formátovat výstup, musíte předat šablonu -f nebo --format možnost inspect dílčí příkaz. Pojďme zrevidovat výstup objemové inspekce.

[ { "CreatedAt":"2021-05-07T15:53:10+05:30", "Driver":"local", "Labels":{}, "Mountpoint":"/var /lib/docker/volumes/unique/_data", "Name":"unique", "Options":{}, "Scope":"local" }] 

Pokud chcete znát Mountpoint , použijete následující příkaz:-

docker volume inspect -f '{{.Mountpoint}}' unique 
➟ docker volume inspect -f '{{.Mountpoint}}' unique/var/lib/docker/volumes/unique/_data 

Pravděpodobně si všimnete složených závorek, jsou to jako bloky, výrazy jsou zapouzdřeny uvnitř těchto bloků.

Zkusme teď něco vnořeného. Zkontrolujte síť a vyhledejte IPAM sekce.

➟ docker network inspect unique "IPAM":{ "Driver":"default", "Options":{}, "Config":[ 

Když se na to podíváte, můžete docela snadno zjistit, jaký je ovladač této sítě. Ale místo toho, abyste to takto hledali, můžete to zformátovat z celého výstupu JSON.

Všimněte si Ovladač klíč je vnořen do IPAM . Takže výraz tečky pro extrahování ovladače by byl .IPAM.Driver . Podívejte se na to v akci:-

➟ docker network inspect -f '{{.IPAM.Driver}}' uniquedefault 

Procházení objektů nebo seznamů (rozsah)

Objekty JSON jsou jako asociativní pole v Bash nebo hashe, kde klíče jsou řetězce a hodnoty mohou být libovolného datového typu.

Abyste tomu trochu lépe porozuměli, začnu praktickým příkladem. Zvažte .NetworkSettings.Networks sekce ve výsledku kontroly kontejneru. Uvádí sítě, ke kterým je kontejner připojen, a pro každou síť některé další související podrobnosti, jako je IP adresa.

Přemýšlejte, pokud vás někdo požádá, abyste mu řekli IP adresu kontejneru. Vybrat pouze jednu síť a přidruženou IP nedává moc smysl, lepší by bylo vypsat všechny IP adresy, které jsou přidruženy ke všem sítím.

Můžete toho dosáhnout pomocí jednoduché smyčky bash for if názvy sítí již znáte. Jako v mém případě mohu udělat něco jako následující:-

pro síť v mostu jedinečný; proveďte kontrolu kontejneru docker -f \ "{{.NetworkSettings.Networks.$network.IPAddress}}" nginxdone 

Ale to je samozřejmě ve velkém měřítku omezující, protože si nemůžeme vždy pamatovat všechny názvy sítí.

Tento problém můžete zmírnit pomocí akce šablony rozsah . rozsah prochází mapu (asociativní pole nebo objekt JSON) a poskytuje nám nikoli klíč, ale hodnoty pro každou iteraci (toto chování lze změnit).

V tomto případě tedy můžete napsat blok jako {{range .NetworkSettings.Networks}} pro smyčkování hodnot jednotlivých sítí nebo dat spojených s každou sítí a z toho můžete extrahovat IP adresu jako z normální struktury podobné JSON, tj. {{.IPAddress}}} . Jedna věc, kterou si zapamatujte, je vždy končit celou šablonu, která začíná rozsah , s {{end}} .

Když to dáte dohromady, můžete přepsat předchozí smyčku for tímto způsobem:-

docker container inspect -f \ '{{range .NetworkSettings.Networks}} {{.IPAddress}}{{end}}' nginx 

Ukázkový výstup:-

➟ docker container inspect -f \> '{{range .NetworkSettings.Networks}}> {{.IPAddress}}{{end}}' nginx 172.17.0.2 172.21.0.2 

Použití indexu funkce na polích a objektech

Můžete použít index funkce pro extrahování částí z vašeho objektu nebo pole JSON. Pokud je strukturou objekt JSON, použijete {{index .Field "key"}} , pokud je struktura pole JSON, použijete {{index .Field index}} .

V předchozím příkladu jste vytiskli všechny IP adresy kontejneru. Řekněme, že znáte jednu ze sítí, ke které je připojena (most) a chcete vytisknout adresu IP přidruženou k této síti. Můžete to udělat pomocí index fungovat takto:-

docker container inspect -f '{{(index .NetworkSettings.Networks "bridge").IPAddress}}' nginx 

Výstup:-

➟ docker container inspect -f '{{(index .NetworkSettings.Networks "bridge").IPAddress}}' nginx172.17.0.2 

Pomocí json funkce

Data exportovaná po formátování nejsou v JSON je to v nějaké go datové struktuře. Ale můžete to převést na JSON pomocí json funkce.

Nejvyšší úroveň objektu JSON je . . Chcete-li tedy vytisknout, udělali byste něco takového:-

docker network inspect -f '{{.}}' unique 
➟ Docker Network Inspect -f '{{.}}' Unique {Unique 09a7e2163EE058B1057D95599F764D571EC6A42A5792803DC125E7010 {41990107 15:15. 4050107 15:1507 15:1507 15:1507 15. 47070707 15. 400707. 16 172.21.0.1 map[]}]} false false false {} false map[2646cbbde5efc218bb6f3a5c882f8eb9e3e4331d090ad46ccc0a2eec9c2eea1b:{nginx c0291394a48f7e8e8aa98fd31631eb00e68daacbee9cf24bac530f16359d051d 02:42:ac:15:00:02 172.21.0.2/16 }] map[] map[] [] map []}

To, co zde vidíte, je velká struktura skládající se z dalších struktur, základních datových typů a map. Ty nejsou příliš čitelné, ani použitelné mimo cesty. Můžete je však převést na JSON pomocí json funkce. Stačí před pole přidat json jako to dělám tady:-

➟ docker network inspect -f '{{json .}}' unique 
➟ docker network inspect -f '{{json .}}' unique {"Name":"unique","Id":"09a7e2163ee058b1057d95599f764d571ec6a42a5792803dc125":02ated"5792803dc125":0702525 :20.341493099+05:30","Rozsah":"local","Driver":"bridge","EnableIPv6":false,"IPAM":{"Driver":"default","Options":{}, "Config":[{"Subnet":"172.21.0.0/16","Gateway":"172.21.0.1"}]},"Internal":false,"Attachable":false,"Ingress":false," ConfigFrom":{"Network":""},"ConfigOnly":false,"Containers":{"2646cbbde5efc218bb6f3a5c882f8eb9e3e4331d090ad46ccc0a2eec9c2eea1b":{"Name":"nginx","EndpointID":"c0291394a48f7e8e8aa98fd31631eb00e68daacbee9cf24bac530f16359d051d","MacAddress":"02 :42:ac:15:00:02","IPv4Address":"172.21.0.2/16","IPv6Address":""}},"Options":{},"Labels":{}} 

Aby to vypadalo o něco lépe, přepojte to do jq .

➟ docker network inspect -f '{{json .}}' unique | "jq{ "Jméno":"unique", "Id":"09a7e2163ee058b1057d95599f764d571ec6a42a5792803dc125e706caa525b0", "Vytvořeno":"2021-94:05", "2021-94:05", 9lo":341:05", 341-955" "bridge", "EnableIPv6":false, "IPAM":{ "Driver":"default", "Options":{}, "Config":[ { "Subnet":"172.21.0.0/16", "Gateway" ":"172.21.0.1" } ] }, "Interní":false, "Attachable":false, "Ingress":false, "ConfigFrom":{ "Network":"" }, "ConfigOnly":false, "Containers" ":{ "2646cbbde5efc218bb6f3a5c882f8eb9e3e4331d090ad46ccc0a2eec9c2eea1b":{ "Name":"nginx", "EndpointID":"c0291394a48f7e8e8aa98fd31631eb00e68daacbee9cf24bac530f16359d051d", "MacAddress":"02:42:ac:15:00:02", "IPv4Address":"172.21.0.2 /16", "IPv6Address":"" } }, "Options":{}, "Labels":{}} 

Je to ono? Rozhodně ne. Vřele doporučuji přečíst si o tom, jak používat go šablony.

Zde jsem se pokusil začít používat, aniž bych musel vědět hodně o go šablonách. Doufám, že se mi to povedlo.

Pro jakékoli vysvětlení neváhejte použít sekci komentářů.


Docker
  1. Jak používat Su Command v Linuxu

  2. Jak nakonfigurovat docker pro použití proxy

  3. Jak používat volbu --since s příkazem docker logs

  1. Jak používat příkaz vmstat

  2. Jak používat Telnet ve Windows

  3. Jak používat Docker Compose

  1. Jak používat příkaz Disown v Linuxu

  2. Jak používat příkaz Linux SS

  3. Jak používat příkaz Linux nohup