Znalost různých stavů kontejneru Docker je nezbytná pro každého vážného uživatele Dockeru.
Vysvětlím životní cyklus kontejneru a poté ukážu příkazy Dockeru pro každou fázi životního cyklu.
Ale než se naučíte všechny ty věci, pojďme se znovu podívat na koncept kontejneru.
Co jsou to kontejnery Docker?
Většina tradičních definic kontejnerů vypadá takto:
Kontejnery jsou formou virtualizace operačního systému. Zatímco tradiční virtualizace založená na hypervizorech vyžaduje samostatná jádra pro samostatné virtuální počítače, kontejnery sdílejí stejné hostitelské jádro, a proto jsou mnohem lehčí a rychleji se roztáčí
Definice se bude zdroj od zdroje lišit, ale podstata je stejná.
Připadá mi to nudné a zbytečně složité. Rád bych zde k definování kontejnerů použil něco jiného.
Kontejnery jsou shluk procesů, které jsou podváděny.
proč to říkám? Protože kontejnery jsou jen soubor procesů, někdy jen jeden proces. A tyto procesy jsou lhány o různých zdrojích svého hostitele, jako jsou sítě, strom procesů, souborový systém, název hostitele atd.
Můžete spustit jakýkoli proces, dokonce i shell jako bash
a skryjte před ním svůj skutečný procesní strom, dejte mu jinou sadu sítí, skryjte před ním skutečný kořenový souborový systém, dejte mu jiný název hostitele a v podstatě skončíte tím, že vytvoříte kontejnerizovanou verzi procesu.
Toho je dosaženo jmennými prostory, samostatným kořenovým souborovým systémem a cgroups.
Docker je jen obal kolem nástrojů nižší úrovně, které spouštějí a spravují kontejnery, nebo konkrétněji říká životní cyklus kontejneru .
Kromě toho dělá Docker také mnoho dalších věcí, jako je snadné vytváření sítí pro kontejnery, manipulace s úložištěm, stahování a tlačení obrázků kontejnerů atd.
Docker je tu, aby nám usnadnil život.
Nyní se podíváme na životní cyklus kontejneru Docker
Životní cyklus kontejneru je v podstatě řada fází, počínaje vytvořením kontejneru až po jeho zničení.
Následující diagram to hodně objasní.
Dovolte mi vysvětlit každou fázi životního cyklu kontejneru.
- Vytvoření: Mnoho lidí si myslí, že když spustíte kontejner, je to jeden jediný krok. Ale není tomu tak. Existuje proces, který vytváří kontejnery dříve než cokoli jiného. Více o tom později.
- Spuštěno/Spuštěno: Jakmile je kontejner vytvořen, lze jej spustit, poté se stav změní na
Running
. To je, když kontejner skutečně něco dělá. - Pozastaveno: Tradičně k pozastavení procesu (což kontejnery v podstatě jsou) používáme signál SIGSTOP a ke zrušení pozastavení signál SIGCONT. Ale protože je tento signál procesy pozorovatelný, místo signálů se používají cgroup freezery. Tímto způsobem jsou procesy pozastaveny zmrazením cgroup.
- Ukončeno/Zastaveno: Opakem
Running
, ale není to stejné jakoPaused
. Zastavení kontejneru znamená odeslání signálu SIGTERM do procesu hlavního kontejneru, tj. PID 1 ve jmenném prostoru kontejneru. Poté čeká 10 sekund, aby proces mohl ladně ukončit. Pokud ne,SIGKILL
je odeslán signál a všichni víme, co to znamená, že? - Zničeno/smazáno: Kontejner již neexistuje, všechny zdroje, které kdysi alokoval, jsou nyní pryč.
Doufám, že to nyní objasnilo koncept životního cyklu kontejneru. V následující části projdu všechny konkrétní příkazy dockeru, které vám pomohou se správou všech těchto stavů kontejnerů.
Příkazy Dockeru pro správu životního cyklu kontejneru
Všechny příkazy (podpříkazy, pokud jsou konkrétnější), které řídí životní cyklus kontejneru, patří do dílčího příkazu container
.
V terminálu, pokud spustíte docker container --help
získáte seznam dílčích příkazů, které jsou spojeny s více operacemi proveditelnými na kontejnerech.
Ale nestaráme se o všechny z nich. Zaměřme se pouze na jejich konkrétní podmnožinu.
Vytvoření kontejneru
Vytvoření kontejneru je řešeno následujícími příkazy:
docker container create
docker create
První je dlouhá forma, zatímco druhá, uhodli jste správně, je krátká.
Doporučuji vám používat dlouhý tvar, protože je více upovídaný a považuji to za dobrý postup.
Co je vytváření kontejnerů?
Vytvořením kontejneru je vytvoření R/W vrstvy nad R/O vrstvou(y) zadaného obrázku a její příprava ke spuštění požadovaného programu. Vytvořením kontejneru se nespustí skutečný proces, můžete zadat všechny konfigurační parametry, jako jsou možnosti, limit CPU, limit paměti, obrázek kontejneru atd. přímo ve fázi vytváření a poté spustit kontejner, kdykoli budete chtít, aniž byste museli tyto parametry znovu zadávat. .
Přečtěte si docker container create --help
pro seznam konfigurovatelných možností.
Příklad
Nejprve vytvořte kontejner, jako je následující (použil jsem alpine
obrázek zde pro spuštění příkazu sleep infinity
)
docker container create \
--name alpine alpine:latest sleep infinity
Jakmile je kontejner vytvořen, měli byste získat jeho ID na obrazovce terminálu. Nyní můžete filtrovat seznam kontejnerů a najít kontejnery, které nejsou spuštěné, ale právě vytvořené .
docker container ls --filter=status=created
Zde filtruji seznam tak, abych získal pouze vytvořené kontejnery. Podívejte se na STATUS
sloupec, to určuje stav kontejneru. Měli byste vidět něco jako následující:-
➟ docker container ls --filter=status=created
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3f8d56fb3f78 alpine:3.13.4 "sleep infinity" 17 seconds ago Created alpine
Můžete také zkontrolovat kontejner a zjistit, v jakém stavu je.
➟ docker container inspect -f '{{json .State.Status}}' alpine
"created"
Pomocí docker create
vám nedá nic jiného.
Spuštění kontejneru
Ke spuštění kontejneru použijte jeden z následujících dvou příkazů:-
docker container start
docker start
To samé, jedna dlouhá a jedna krátká verze. A doporučuji vám použít ...container start
příkaz.
Co je spuštění kontejneru?
Jakmile je kontejner vytvořen, můžete jej spustit. Spuštění kontejneru znamená vlastně spuštění kontejnerizované aplikace.
Zatímco vytváření kontejneru pouze připravuje veškerou konfiguraci (jak bude kontejner běžet, běhové prostředí, omezení běhu, název kontejneru atd.), nepřiděluje žádné prostředky.
Spuštění kontejneru alokuje potřebné zdroje a spustí aplikaci.
Příklad
Vezměme si předchozí kontejner, který jsme vytvořili. Jednoduše spusťte příkaz s názvem kontejneru nebo ID takto:
docker container start alpine
Po spuštění kontejneru se jeho stav změní z Created
na Running
. V seznamu kontejnerů můžete znovu filtrovat podle stavu jako dříve:-
docker container ls --filter=status=running
Na stránce STATUS
místo Running
zobrazí, jak dlouho kontejner běží od spuštění.
➟ docker container ls --filter=status=running
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3f8d56fb3f78 alpine:3.13.4 "sleep infinity" 8 minutes ago Up 18 seconds alpine
Můžete si také prohlédnout kontejner a zjistit jeho stav. Použiji šablony Go k formátování výstupu na jedinou věc, kterou potřebuji, tj. na stav.
docker container inspect \
-f '{{json .State.Status}}' alpine
Měli byste vidět něco takového -
➟ docker container inspect -f '{{json .State.Status}}' alpine
"running"
Ne, aby to znělo nadbytečně, ale docker start
udělá to samé.
Příkaz pro spuštění speciálního dockeru
Jedná se o speciální příkaz, který spojuje vytvoření a spuštění kontejneru dohromady a tento příkaz všichni používáme nejvíce.
docker container start
docker start
Tyto příkazy v podstatě (i) vytvoří kontejner a poté okamžitě (ii) spustí stejný kontejner.
To je užitečné, protože vytváření a ponechání kontejneru ke spuštění později není něco, co děláme příliš často. Když jste na příkazovém řádku s ukotvitelným CLI, jste zde, abyste spustili nádoba. A to je přesně to, co ...container run
příkaz ano.
Příklad
Příklad tohoto příkazu je velmi jednoduchý. Chcete-li spustit kontejner, místo docker container create
, použijte docker container start
.
Budete musíte předat všechny možnosti, které byste předali docker container create
do tohoto docker container start
příkaz. Je to proto, že docker potřebuje všechny tyto informace právě v tu chvíli, protože již neexistují žádné další kroky.
➟ docker container run --name echo-me alpine:3.13.4 echo "Subscribe to Linux Handbook"
Subscribe to Linux Handbook
Docker Run vs Start vs Create:Rozdíl je vysvětlen Pro začátečníka dockeru mohou být pojmy jako docker start, docker run a docker create matoucí. Tento článek vysvětluje rozdíl na příkladech. Linux HandbookAbhishek Prakash Pozastavení kontejneru
Pozastavení kontejneru znamená přesně to, jak zní. Nezastavujeme žádné procesy, pouze je pozastavujeme. Pokud tedy proces uvnitř kontejneru počítá od 1 do 100 a byl pozastaven, když byl na počtu 50, a poté pozastaven později, počítání se obnoví od 50.
Jedna věc, kterou je třeba pochopit, je, že když je Paused
je skutečný stav, Unpaused
není. Když zrušíte pozastavení některého pozastaveného kontejneru, v podstatě změníte stav z Paused
na Running
.
Příkazy, které se používají k pozastavení kontejneru, jsou následující:-
docker container pause
docker pause
Podobně můžete zrušit pozastavení kontejneru pomocí protějšků pro zrušení pozastavení:-
docker container unpause
docker unpause
Jak je kontejner pozastaven?
Proces je pozastaven pomocí signálu SIGSTOP a pro zrušení pozastavení je použit signál SIGCONT. Protože tyto signály mohou být procesy pozorovány, místo signálů se používají zmrazovače cgroup. Tímto způsobem jsou procesy pozastaveny zmrazením cgroup. Zmrazení cgroup zmrazí všechny její úkoly a všechny její podřízené cgroups.
Příklad:
Kvůli této ukázce jsem vytvořil speciální kontejner. Vytáhněte obrázek provedením následujícího příkazu:-
docker image pull debdutdeb/pause-demo:v1
Zde můžete zkontrolovat Dockerfile a kód.
Po vytažení na jednom terminálu spusťte kontejner s tímto obrázkem
docker container run --name pause-demo debdutdeb/pause-demo:v1
Nyní by měl ukazovat počítání od 0 do konce. Mělo by vypadat nějak takto
➟ docker container run --name pause-demo debdutdeb/pause-demo:v1
Count at 30
Na jiném terminálu pozastavte tento kontejner.
docker container pause pause-demo
V okamžiku, kdy pozastavíte kontejner, měli byste vidět zastavení odpočítávání, ale terminál se vám ještě nevrátil. Je to proto, že kontejner ještě není zastaven (o tom budu mluvit později v tomto článku). Jakmile zrušíte pozastavení tohoto kontejneru, odpočítávání by se mělo obnovit, nikoli restartovat.
docker container unpause pause-demo
Chcete-li získat terminál zpět, spusťte samostatný terminál
docker container stop pause-demo
Zde je krátké video, které to ukáže v akci:-
Před zastavením kontejneru se vám mohou líbit předchozí, zkontrolujte stav pozastaveného kontejneru takto:
➟ docker container inspect -f '{{json .State.Status}}' pause-demo
"paused"
Zastavení kontejneru
Kontejner Docker můžete zastavit pomocí jednoho z následujících dvou příkazů:-
docker container stop
docker stop
Zastavení kontejneru znamená zastavení všech procesů s ním spojených.
To není totéž jako pozastavení kontejneru. Pokud zastavíte kontejner, můžete jej restartovat, ale procesy se neobnoví ze stavu, ve kterém byly předtím. Proces může uložit informace o svém stavu do „souboru“ a obnovit svůj stav z tohoto souboru, ale to je jiný případ.
Například poté, co jste zastavili předchozí pause-demo
kontejner, pokud jej zkusíte restartovat pomocí ...container start
příkaz, začne počítat od začátku, na rozdíl od jeho pause
protějšek, který pokračuje v počítání.
Jak tento proces funguje?
Když požádáte Docker o zastavení kontejneru, odešle SIGTERM
signál do PID 1 kontejneru. Poté čeká 10 sekund, což je jeho ladná doba, procesu je dán tento čas, aby se ladně ukončil, jinými slovy uklidil a dokončil vše, co fungovalo. Po uplynutí 10 sekund odešle Docker poslední SIGKILL
signál, nemusím vám říkat, co se stane dál.
Docker odešle signál do PID 1 kontejneru, protože každý další proces je potomkem PID 1. Pokud bude tento proces ukončen/zabit, chil procesy automaticky přestanou existovat.
Toto bude jasnější na příkladu níže.
Příklad:
Musíte znovu vytáhnout obrázek.
docker image pull debdutdeb/stop-demo:v1
Pro soubor Dockerfile a zdrojový kód se podívejte na tuto podstatu.
V jednom terminálu spusťte kontejner z tohoto obrázku.
docker container run --name stop-demo debdutdeb/stop-demo:v1
Po provedení byste měli vidět obrazovku s informací o svém PID a o tom, že čeká.
➟ docker container run --name stop-demo debdutdeb/stop-demo:v1
My PID in this container is 1
Waiting...
Otevřete jiný terminál a proveďte příkaz stop na tomto kontejneru.
docker container stop stop-demo
Po spuštění byste na terminálu, na kterém byl kontejner spuštěn, měli vidět, co je IT zažívá, tj. přijímá SIGTERM
signál.
Poté začne počítat sekundy a po 10 sekundách uvidíte, že to prostě přestane počítat. Není to proto, že bych to takto natvrdo zakódoval, ve skutečnosti jsem to naprogramoval tak, aby to pokračovalo donekonečna.
Ale po 10 sekundách docker odešle SIGKILL
signál, který nemůžeme chytit nebo ignorovat, proces musí být zabit.
Dobu čekání ukotvitelného panelu před odesláním SIGKILL
můžete změnit signál pomocí -t
možnost s docker container stop
.
Jakmile je vše hotovo, měli byste vidět něco takového
➟ docker container run --name stop-demo debdutdeb/stop-demo:v1
My PID in this container is 1
Waiting...
SIGTERM ignored,
Starting count..
10 seconds
Zde je malé video, které to demonstruje:-
Stav tohoto kontejneru nyní můžete zkontrolovat pomocí ...container inspect
takhle:-
➟ docker container inspect -f '{{json .State.Status}}' stop-demo
"exited"
Smazání kontejneru
Kontejner se odstraní pomocí jednoho z následujících dvou příkazů:-
docker container rm
docker rm
Odstranění kontejneru je opakem vytváření kontejneru. Když smažete kontejner, je pryč, nemůžete přinést tak konkrétní kontejner zpět. Můžete začít nový ze stejného obrázku se stejnou konfigurací, udělat ho identickým, ale nebude to přesně ten předchozí.
Příklad:
Pro příklad stačí odstranit předchozí stop-demo
kontejner.
docker container rm stop-demo
Až dosud lze všechny kontejnery, které jste vytvořili a poté zastavili, odstranit jediným příkazem:-
docker container prune
Tímto smažete všechny kontejnery se stavem Exited
.
Příklad výstupu:
✗ docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
ffbdd621c01d0eb3f42d348eeb75c731ddd9bd85674bb90dece32bd70357e541
21b9ed6a6198cd6ee7e162aebd936ae3e93b3b0f738161924a825a27794f2b20
f5f5149866a6ced675ad3bfff0b7386f75ee3fdbddca86be8b8ba341dba4b27f
Total reclaimed space: 0B
Takže jste se naučili koncept životního cyklu kontejneru. A také jste se naučili příkazy Dockeru pro správu každé fáze životního cyklu kontejnerů. Pokud chcete nějaké další tipy pro Docker, můžete se dozvědět o těchto méně známých, ale užitečných příkazech Dockeru.
3 Příkazy Dockeru Pokročilí uživatelé Dockeru by měli vědětZde jsou některé příkazy Dockeru, o kterých možná nevíte, ale mohou se hodit při správě vašich kontejnerů. Linux HandbookDebdut ChakrabortyOpravdu doufám, že tento článek usnadnil pochopení teorie životního cyklu kontejneru a také vyčistil všechny příkazy, které potřebujete ke správě těchto různých stavů.
Pokud máte nějaké dotazy, zanechte prosím níže komentář.