Docker poskytuje možnost zásad restartování, která umožňuje automatické restartování kontejnerů v případě určitých událostí nebo selhání.
To je mimořádně užitečné ve scénářích, kdy musíte restartovat hostitele Docker (váš server Linux) nebo pokud služba spuštěná v kontejneru selže.
Zásady restartování Dockeru se uplatňují na základě jednotlivých kontejnerů. Zásadu restartování lze kontejneru přiřadit dvěma způsoby. Můžete to nastavit v souboru YAML, pokud budete používat Docker Compose nebo Swarm nebo Kubernetes.
Zásadu restartování můžete také nastavit přímo v příkazovém řádku při spuštění kontejneru:
docker container run --restart <policy>
Pojďme si promluvit o tom, jaké zásady restartu můžete použít.
Zásady restartování Dockeru
Pro kontejnery Docker platí následující zásady restartování:
- ne:Výchozí chování je nespouštět kontejnery automaticky
- vždy:Vždy restartujte zastavený kontejner, pokud nebyl kontejner zastaven výslovně
- unless-stoppped:Restartujte kontejner, pokud kontejner nebyl v zastaveném stavu před zastavením démona Docker (vysvětleno později)
- při selhání:Restartujte kontejner, pokud byl ukončen s nenulovým kódem ukončení nebo pokud se restartuje démon docker
Jak jsem zmínil, pokud explicitně nepřidáte zásadu restartování, bude to s „ne“, což znamená, že kontejnery nebudou automaticky restartovány.
Vysvětlení zásad restartování Dockeru s příklady
Dovolte mi ukázat tyto zásady v akci, abyste si je mohli skutečně představit. To je zvláště užitečné pro pochopení rozdílu mezi always
a unless-stopped
zásady.
Zásady vždy restartovat
Začněme s always
zásady restartování. S touto zásadou bude kontejner vždy restartován, pokud nebyl výslovně zastaven.
Chystám se spustit kontejner Alpine Linux s always
zásady restartování. Pojmenovávám to vždy – zásada.
Kontejner má jeden úkol. Po dobu 10 sekund spustí příkaz spánku bash a poté se ukončí.
docker container run --name always-policy --restart always alpine sleep 10
Bez always
restartovat, kontejner by se zastavil po 10 sekundách. Zde se však automaticky restartuje a spustí příkaz spánku po dobu dalších 10 sekund a takto to pokračuje.
[email protected]:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1171dcfb7e06 alpine "sleep 10" 25 seconds ago Up 4 seconds always-policy
Ve výše uvedeném příkazu můžete vidět, že ačkoli byl kontejner vytvořen před 25 sekundami, byl aktivní pouze 4 sekundy. Mějte prosím na paměti, že stejný kontejner se restartuje, nový se nevytvoří.
Pomocí příkazu docker inspect můžete zjistit, kolikrát byl kontejner zatím restartován.
[email protected]:~$ docker inspect always-policy | grep -i restartcount
"RestartCount": 4,
Pokud kontejner zastavíte příkazem stop, nebude se poté automaticky restartovat. V příkladu níže můžete vidět, že kontejner má nyní stav 'Exited' místo Up.
[email protected]:~$ docker stop always-policy
always-policy
[email protected]:~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1171dcfb7e06 alpine "sleep 10" 58 seconds ago Exited (0) 6 seconds ago always-policy
Použil jsem -it
možnost spuštění kontejneru s interaktivním terminálem na výše uvedeném snímku obrazovky. Tady to bylo ze zvyku a zbytečné.
zásady pokud není zastaveno vs. vždy restartovat
unless-stopped
je podobný always
zásady restartování. Oba restartují kontejnery automaticky a pokud kontejnery explicitně zastavíte, nerestartují se.
Ale hlavní rozdíl mezi těmito dvěma je v tom, že pokud zastavíte kontejnery příkazem docker stop a poté restartujete démona docker, kontejner s always
zásada restartu spustí kontejner automaticky, ale kontejner s unless-stopped
zásada nebude restartována.
Dovolte mi to ukázat na příkladech. Již mám zastavený kontejner se zásadou vždy restartovat. Dovolte mi vytvořit nový kontejner s názvem unless-stoppped-policy s unless-stopped
zásady.
docker container run --name unless-stopped-policy --restart always alpine sleep 10
Zastavte kontejner:
docker stop unless-stopped-policy
Nyní mám dva kontejnery, které byly výslovně zastaveny:
[email protected]:~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d244b6e08899 alpine "sleep 10" 2 minutes ago Exited (0) About a minute ago unless-stopped-policy
1171dcfb7e06 alpine "sleep 10" 22 minutes ago Exited (0) 21 minutes ago always-policy
Restartujte démona Docker:
sudo systemctl restart docker
Když nyní zkontrolujete spuštěné kontejnery, uvidíte, že kontejner s názvem always-policy je spuštěn, protože byl nastaven na always
zásady restartování.
[email protected]:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1171dcfb7e06 alpine "sleep 10" 30 minutes ago Up 8 seconds always-policy
Celý postup lze vidět na tomto snímku obrazovky:
zásady restartování při selhání
on-failure
Zásada restartu restartuje kontejner, pokud byl ukončen s nenulovým kódem ukončení (označujícím chybu/selhání). Také restartuje kontejnery, pokud se restartuje démon docker, včetně těch, které byly předtím ve stavu zastaveno.
Pokud ručně zastavíte kontejner pomocí příkazu docker stop, existuje s kódem nula, který označuje, že vše bylo normální.
Nastavení zásady restartování v souboru Docker Compose
Nyní máte docela dobrou představu o spuštění kontejneru se zásadou restartování.
Pokud pro nasazení kontejnerů používáte něco jako Docker Compose, můžete zmínit zásady restartování pro objekt služby v souboru YAML.
Zde je ukázkový příklad:
version: "3.3"
services:
NginxProxy:
image: "jwilder/nginx-proxy:latest"
restart: "on-failure"
networks: ["net"]
ports:
- "80:80"
- "443:443"
Jaké zásady restartování Dockeru použít?
Upřímně řečeno, na tuto otázku neexistuje jednoznačná odpověď. Záleží na vašem případu použití a na tom, co chcete.
Doufám, že tento článek byl užitečný pro pochopení zásad restartování Dockeru. Pokud máte nějaké dotazy nebo návrhy, dejte mi vědět v sekci komentářů.