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.