Docker fournit une option de stratégie de redémarrage pour permettre à vos conteneurs de redémarrer automatiquement en cas de certains événements ou échecs.
Ceci est extrêmement utile dans les scénarios où vous devez redémarrer l'hôte Docker (votre serveur Linux) ou si le service exécuté dans le conteneur échoue.
Les politiques de redémarrage de Docker sont appliquées par conteneur. Il existe deux façons d'attribuer une stratégie de redémarrage à un conteneur. Vous pouvez le définir dans le fichier YAML si vous comptez utiliser Docker Compose, Swarm ou Kubernetes.
Vous pouvez également définir la politique de redémarrage directement dans la ligne de commande lorsque vous exécutez un conteneur :
docker container run --restart <policy>
Parlons du type de politique de redémarrage que vous pouvez utiliser.
Politiques de redémarrage de Docker
Il existe les politiques de redémarrage suivantes pour les conteneurs Docker :
- non :le comportement par défaut est de ne pas démarrer automatiquement les conteneurs
- toujours :toujours redémarrer un conteneur arrêté, sauf si le conteneur a été arrêté explicitement
- sauf si arrêté :Redémarrez le conteneur à moins qu'il ne soit à l'état d'arrêt avant l'arrêt du démon Docker (expliqué plus loin)
- on-failure :Redémarrez le conteneur s'il s'est terminé avec un code de sortie différent de zéro ou si le démon docker redémarre
Comme je l'ai mentionné, si vous n'ajoutez pas explicitement de stratégie de redémarrage, cela signifie "non", ce qui signifie que les conteneurs ne seront pas redémarrés automatiquement.
Expliquer les politiques de redémarrage de Docker avec des exemples
Permettez-moi de montrer ces politiques en action afin que vous puissiez réellement les visualiser. Ceci est particulièrement utile pour comprendre la différence entre always
et unless-stopped
politiques.
Toujours redémarrer la politique
Commençons par le always
politique de redémarrage. Avec cette stratégie définie, le conteneur sera toujours redémarré à moins qu'il n'ait été arrêté explicitement.
Je vais exécuter un conteneur Alpine Linux avec always
politique de redémarrage. Je l'appelle toujours politique.
Le conteneur a une tâche. Il exécute la commande bash sleep pendant 10 secondes, puis se termine.
docker container run --name always-policy --restart always alpine sleep 10
Sans le always
stratégie de redémarrage, le conteneur se serait arrêté au bout de 10 secondes. Mais ici, il redémarrera automatiquement et exécutera la commande sleep pendant encore 10 secondes et cela continuera comme ça.
[email protected]:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1171dcfb7e06 alpine "sleep 10" 25 seconds ago Up 4 seconds always-policy
Vous pouvez voir dans la commande ci-dessus que bien que le conteneur ait été créé il y a 25 secondes, il n'a été activé que pendant 4 secondes. Veuillez garder à l'esprit que le même conteneur est redémarré, un nouveau n'est pas créé.
Vous pouvez utiliser la commande docker inspect pour voir combien de fois le conteneur a été redémarré jusqu'à présent.
[email protected]:~$ docker inspect always-policy | grep -i restartcount
"RestartCount": 4,
Si vous arrêtez le conteneur avec la commande stop, il ne redémarrera pas automatiquement par la suite. Vous pouvez voir dans l'exemple ci-dessous que le conteneur a maintenant le statut "Exited" au lieu de 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
J'ai utilisé le -it
option pour exécuter le conteneur avec terminal interactif dans la capture d'écran ci-dessus. C'était par habitude et inutile ici.
politique sauf arrêt vs toujours redémarrage
Le unless-stopped
est similaire à always
politique de redémarrage. Les deux redémarrent les conteneurs automatiquement et si vous arrêtez les conteneurs explicitement, ils ne redémarrent pas.
Mais la principale différence entre les deux est que si vous arrêtez les conteneurs avec la commande docker stop, puis redémarrez le démon docker, le conteneur avec always
la politique de redémarrage démarrera le conteneur automatiquement mais le conteneur avec unless-stopped
la stratégie ne sera pas redémarrée.
Permettez-moi de le montrer avec des exemples. J'ai déjà un conteneur arrêté avec toujours la politique de redémarrage. Laissez-moi créer un nouveau conteneur nommé unless-stopped-policy avec unless-stopped
politique.
docker container run --name unless-stopped-policy --restart always alpine sleep 10
Arrêtez le conteneur :
docker stop unless-stopped-policy
J'ai maintenant deux conteneurs qui ont été explicitement arrêtés :
[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
Redémarrez le démon Docker :
sudo systemctl restart docker
Maintenant, si vous vérifiez les conteneurs en cours d'exécution, vous pouvez voir que le conteneur nommé always-policy est en cours d'exécution car il a été défini avec always
politique de redémarrage.
[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'intégralité des étapes peut être vue dans cette capture d'écran :
politique de redémarrage en cas d'échec
Le on-failure
la stratégie de redémarrage redémarre un conteneur s'il a été quitté avec un code de sortie différent de zéro (indiquant une erreur/un échec). Il redémarre également les conteneurs si le démon docker redémarre, y compris ceux qui étaient à l'état arrêté auparavant.
Si vous arrêtez manuellement un conteneur avec la commande docker stop, il existe avec le code zéro indiquant que tout était normal.
Définition de la politique de redémarrage dans le fichier Docker Compose
À présent, vous avez une assez bonne idée de l'exécution d'un conteneur avec une politique de redémarrage.
Si vous utilisez quelque chose comme Docker Compose pour déployer des conteneurs, vous pouvez mentionner la politique de redémarrage de l'objet de service dans le fichier YAML.
Voici un exemple :
version: "3.3"
services:
NginxProxy:
image: "jwilder/nginx-proxy:latest"
restart: "on-failure"
networks: ["net"]
ports:
- "80:80"
- "443:443"
Quelle politique de redémarrage Docker utiliser ?
Honnêtement, il n'y a pas de réponse simple à cette question. Cela dépend de votre cas d'utilisation et de ce que vous voulez.
J'espère que cet article a été utile pour comprendre la politique de redémarrage de Docker. Si vous avez des questions ou des suggestions, n'hésitez pas à me le faire savoir dans la section des commentaires.