Docker vám nabízí několik možností, jak spravovat životní cyklus vašeho kontejneru. Kontejnery se obvykle po ukončení automaticky nerestartují. Pomocí zásad restartování můžete převzít kontrolu nad jednotlivými životními cykly kontejnerů.
Zásady restartu se použijí vždy, když se kontejner přestane spouštět. Docker se také podívá na zásady restartování při spuštění démona. Pomocí tohoto mechanismu můžete kontejnery po restartu přivést k hostiteli.
Zásady dostupnosti
Aktuálně existují čtyři různé zásady restartování:
no
– Tato zásada nikdy automaticky nespustí kontejner. Toto je výchozí zásada pro všechny kontejnery vytvořené pomocídocker run
.always
– Docker zajistí, že kontejner vždy běží. Pokud se kontejner zastaví, bude okamžitě restartován. Kontejner můžete stále ručně zastavit pomocídocker stop
ale Docker jej při příštím restartu démona znovu spustí.on-failure
– Kontejner se restartuje, pokud se zastaví kvůli chybě. Po restartování démona Docker kontejner nevyvolá.unless-stopped
– Funguje podobně jakoalways
. Rozdíl je v tom, že Docker nikdy nerestartuje kontejner, pokud byl ručně zastaven.
Pro produkční úlohy obvykle použijete jednu z posledních tří možností. Protože se kontejnery Docker často používají pro dlouhotrvající služby na pozadí, obvykle chcete, aby se restartovaly, kdykoli se něco pokazí. no
politika je nejvhodnější pro místní rozvoj. Je to také užitečné pro kontejnery nástrojů, které spouštějí jeden spustitelný soubor a poté se ukončí.
Může být obtížné rozhodnout, kterou zásadu restartu použít. always
je často nejpřirozenější volbou, ale chování restartování démona lze snadno přehlédnout. Pokud chcete, aby kontejnery po spuštění docker stop
spolehlivě zůstaly zastavené , měli byste použít unless-stopped
.
Docker zjišťuje chyby na základě výstupního kódu vysílaného z procesu na popředí kontejneru. Výstupní kód 1
nebo vyšší je interpretováno jako chyba. To odpovídá unixovému zpracování výstupních kódů, kde je pouze 0
představuje úspěšné provedení.
Když Docker restartuje váš kontejner, je to ekvivalentní spuštění docker run
znovu. To znamená ENTRYPOINT
obrázku skript bude vyvolán. Bootstrap systémy by měly být vždy odolné vůči vícenásobným vyvoláním.
Uplatnění zásad restartování
Kontejner s konkrétní zásadou restartování můžete spustit předáním --restart
příznak pro docker run
:
docker run --name httpd --restart always httpd:latest
Pokud používáte Docker Compose, přidejte restart
pole do vašeho docker-compose.yml
:
services: httpd: image: httpd:latest restart: always
Zásadu restartování existujícího kontejneru můžete změnit pomocí docker update
. Předejte příkazu název kontejneru. Názvy kontejnerů najdete spuštěním docker ps -a
.
docker update --restart-policy unless-stopped httpd
Můžete použít docker update
s kontejnery, které jsou spuštěné nebo zastavené.
Restartovat smyčky
Docker obsahuje několik zabezpečení proti neustálým restartům. První je povinná časová prodleva před aktivací zásad restartu. Docker nezačne monitorovat restarty, dokud kontejner neběží alespoň 10 sekund. To zabrání tomu, aby se kontejner, který selhal, neustále restartoval.
Další chování specialistů se týká docker stop
příkaz. Docker bude vždy respektovat použití docker stop
, takže kontejner se po spuštění příkazu okamžitě nerestartuje. Pokud skutečně chcete restartovat kontejner, použijte docker restart
místo toho.
Omezení opakování restartu
on-failure
Zásada restartu vám umožňuje určit, o kolik opakování se má pokusit. Docker se vzdá a ponechá kontejner v zastaveném stavu, pokud se nepodaří spustit několikrát za sebou.
docker run httpd:latest --restart on-failure:5
V tomto příkladu se Docker pokusí restartovat kontejner pětkrát po selhání (nenulový výstupní kód). Pokud se kontejner nespustí ani na pátý pokus, další pokusy se již nebudou opakovat. Tato možnost je užitečná pro kontejnery, kde je nepravděpodobné, že by trvalá chyba spouštění byla vyřešena bez ručního zásahu.
Vyšetřování, proč se kontejnery zastavily
Pokud potřebujete vědět, proč se kontejner zastavil, spusťte docker ps -a
. Zobrazí se podrobnosti o všech vašich kontejnerech, ať už zastavených nebo spuštěných. Najděte cílový kontejner a podívejte se do jeho sloupce „Stav“. U zastavených kontejnerů bude výstupní kód uveden v závorkách. Pokud je kód větší než nula, kontejner byl ukončen kvůli chybě.
Chcete-li zjistit význam jednotlivých chybových kódů, musíte se podívat do dokumentace procesu spuštěného v kontejneru. Často však můžete získat informace o tom, co způsobilo selhání, načtením protokolů kontejneru. Protokoly zůstávají dostupné i po zastavení kontejneru.
docker logs my-container
Proud protokolu agreguje standardní výstup kontejneru a standardní chybové proudy. Pokud byla chyba zaznamenána, měli byste očekávat, že ji uvidíte na posledních několika řádcích výstupu.
Přehled
Zásady restartování pomáhají zajistit, aby vaše kontejnery Docker byly k dispozici, když je potřebujete. Výchozí no
politika je nevhodná pro většinu produkčních úloh. Nechcete, aby vaše kontejnery zůstaly zastaveny, pokud havarují!
Použití jedné ze tří zásad umožňujících restartování činí vaše kontejnery odolnějšími vůči restartování hardwaru a neočekávanému ukončení. Docker zachová dostupnost služby v případě havárie kontejneru.