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

Průvodce pro začátečníky zásadami restartování Dockeru

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


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

  2. Některé příkazy DOCKER

  3. Jak přiřadit statickou IP ke kontejneru 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. Jak vypsat Docker kontejnery

  1. Úvod do Dockeru

  2. Jak spustit MySQL v kontejneru Docker

  3. Jak SSH do kontejneru Docker