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í:-
- Kontejnery.
- Obrázky.
- Sítě.
- Svazky.
- Kontexty.
- Pluginy.
- Uzly (objekt roje).
- Služby (objekt roje).
- Tajemství (objekt roje).
- Konfigurace (objekt roje).
Použití příkazu Docker inspect
inspect
můžete použít dvěma způsoby dílčí příkaz.
docker inspect [objekt] [možnosti]
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ářů.