GNU/Linux >> Linux Esercitazione >  >> Panels >> Docker

Guida per principianti alla politica di riavvio di Docker

Docker offre un'opzione relativa ai criteri di riavvio per consentire il riavvio automatico dei contenitori in caso di determinati eventi o guasti.

Ciò è estremamente utile negli scenari in cui devi riavviare l'host Docker (il tuo server Linux) o se il servizio in esecuzione nel contenitore non riesce.

I criteri di riavvio di Docker vengono applicati in base al contenitore. Esistono due modi per assegnare la politica di riavvio a un contenitore. Puoi impostarlo nel file YAML se intendi utilizzare Docker Compose o Swarm o Kubernetes.

Puoi anche impostare il criterio di riavvio direttamente nella riga di comando quando esegui un container:

docker container run --restart <policy>

Parliamo del tipo di criterio di riavvio che puoi utilizzare.

Criteri di riavvio di Docker

Esistono i seguenti criteri di riavvio per i contenitori Docker:

  • no:il comportamento predefinito è di non avviare automaticamente i contenitori
  • sempre:riavvia sempre un contenitore interrotto a meno che il contenitore non sia stato arrestato in modo esplicito
  • a meno che non sia stato arrestato:riavvia il contenitore a meno che il contenitore non fosse in stato di arresto prima dell'arresto del daemon Docker (spiegazione più avanti)
  • in caso di errore:riavvia il contenitore se è uscito con un codice di uscita diverso da zero o se il daemon docker si riavvia

Come accennato, se non aggiungi esplicitamente una politica di riavvio, va con "no", il che significa che i contenitori non verranno riavviati automaticamente.

Spiegazione delle politiche di riavvio di Docker con esempi

Permettetemi di mostrare queste politiche in azione in modo che possiate effettivamente visualizzarle. Ciò è particolarmente utile per comprendere la differenza tra  always e unless-stopped politiche.

Riavvia sempre il criterio

Cominciamo con il always politica di riavvio. Con questa serie di criteri, il contenitore verrà sempre riavviato a meno che non sia stato interrotto in modo esplicito.

Eseguirò un container Alpine Linux con always politica di riavvio. Lo chiamo sempre-politica.

Il contenitore ha un'attività. Esegue il comando bash sleep per 10 secondi e poi esce.

docker container run --name always-policy --restart always alpine sleep 10

Senza il always criterio di riavvio, il contenitore si sarebbe arrestato dopo 10 secondi. Ma qui, si riavvierà automaticamente ed eseguirà il comando di sospensione per altri 10 secondi e continuerà così.

[email protected]:~$ docker ps
CONTAINER ID   IMAGE     COMMAND      CREATED          STATUS         PORTS     NAMES
1171dcfb7e06   alpine    "sleep 10"   25 seconds ago   Up 4 seconds             always-policy

Puoi vedere nel comando sopra che sebbene il contenitore sia stato creato 25 secondi fa, è stato attivo solo per 4 secondi. Tieni presente che lo stesso contenitore viene riavviato, non ne viene creato uno nuovo.

Puoi utilizzare il comando docker inspect per vedere quante volte il container è stato riavviato finora.

[email protected]:~$ docker inspect always-policy | grep -i restartcount
        "RestartCount": 4,

Se si arresta il contenitore con il comando stop, in seguito non si riavvierà automaticamente. Nell'esempio seguente potresti vedere che il contenitore ora ha lo stato "Uscita" invece di Su.

[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

Ho usato il -it opzione per eseguire il container con il terminale interattivo nello screenshot sopra. Era per abitudine e non necessario qui.

politica non interrotta vs riavvio sempre

Il unless-stopped è simile a always politica di riavvio. Entrambi riavviano i contenitori automaticamente e se li interrompi in modo esplicito, non si riavviano.

Ma la differenza principale tra i due è che se fermi i contenitori con il comando docker stop e quindi riavvii il demone docker, il contenitore con always il criterio di riavvio avvierà automaticamente il contenitore ma il contenitore con unless-stopped il criterio non verrà riavviato.

Lascia che te lo mostri con esempi. Ho già un contenitore fermo con la politica di riavvio sempre. Consentimi di creare un nuovo contenitore denominato policy unless-stoped con unless-stopped politica.

docker container run --name unless-stopped-policy --restart always alpine sleep 10

Ferma il contenitore:

docker stop unless-stopped-policy

Ora ho due container che sono stati fermati esplicitamente:

[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

Riavvia il demone Docker:

sudo systemctl restart docker

Ora, se controlli i contenitori in esecuzione, puoi vedere che il contenitore denominato always-policy è in esecuzione perché è stato impostato con always criterio di riavvio.

[email protected]:~$ docker ps
CONTAINER ID   IMAGE     COMMAND      CREATED          STATUS         PORTS     NAMES
1171dcfb7e06   alpine    "sleep 10"   30 minutes ago   Up 8 seconds             always-policy

L'intero passaggio può essere visto in questo screenshot:

politica di riavvio in caso di errore

Il on-failure il criterio di riavvio riavvia un contenitore se è stato chiuso con un codice di uscita diverso da zero (che indica errore/errore). Riavvia anche i contenitori se il daemon docker si riavvia, inclusi quelli che prima erano in stato di arresto.

Se arresti manualmente un contenitore con il comando di arresto mobile, esiste con il codice zero che indica che tutto era normale.

Impostazione del criterio di riavvio nel file Docker Compose

A questo punto, hai una buona idea sull'esecuzione di un container con una politica di riavvio.

Se stai utilizzando qualcosa come Docker Compose per la distribuzione di container, puoi menzionare la politica di riavvio per l'oggetto di servizio nel file YAML.

Ecco un esempio di esempio:

version: "3.3"      
services:
    NginxProxy:
        image: "jwilder/nginx-proxy:latest"
        restart: "on-failure"
        networks: ["net"]
        ports:
            - "80:80"
            - "443:443"

Quale criterio di riavvio di Docker utilizzare?

Onestamente, non esiste una risposta univoca a questa domanda. Dipende dal tuo caso d'uso e da cosa vuoi.

Spero che questo articolo sia stato utile per comprendere la politica di riavvio di Docker. Se hai domande o suggerimenti, faccelo sapere nella sezione commenti.


Docker
  1. Come eseguire Nginx in un contenitore Docker:una guida passo passo

  2. Come eseguire MySQL in Docker Container:una guida semplice e facile da seguire

  3. Un'introduzione a Docker

  4. Come assegnare un IP statico a un contenitore Docker

  5. Come elencare i contenitori Docker

Apprendimento Docker:come creare un contenitore Docker

Come utilizzare i criteri di riavvio di Docker per mantenere in esecuzione i contenitori

Come eseguire PHPMyAdmin in un contenitore Docker

Come eseguire Grafana in un contenitore Docker

Come configurare un container Docker Apache

Comandi Docker per la gestione del ciclo di vita dei container (Guida definitiva)