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ářů.