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

Příkazy Dockeru pro správu životního cyklu kontejneru (definitivní průvodce)

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é jako Paused . 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:

  1. docker container create
  2. 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ů:-

  1. docker container start
  2. 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.

  1. docker container start
  2. 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í:-

  1. docker container pause
  2. docker pause

Podobně můžete zrušit pozastavení kontejneru pomocí protějšků pro zrušení pozastavení:-

  1. docker container unpause
  2. 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ů:-

  1. docker container stop
  2. 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ů:-

  1. docker container rm
  2. 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 Chakraborty

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


Docker
  1. Jak spustit Nginx v kontejneru Docker:Průvodce krok za krokem

  2. Jak spustit MySQL v Docker Container:Jednoduchý a snadno sledovatelný průvodce

  3. Některé příkazy DOCKER

  1. Co je Docker Container:Úvodní příručka pro začátečníky

  2. Úvod do Dockeru

  3. Příkazy Dockeru Rychlý průvodce Cheat Sheet

  1. Seznam příkazů Docker:Cheat Sheet

  2. Jak vytvořit MySQL Docker Container pro testování

  3. Jak změnit časové pásmo pro kontejner Docker