Comparaison entre Docker Stop et Docker Kill : Quand utiliser chaque commande
Maîtrisez la gestion des conteneurs Docker en comprenant les différences cruciales entre `docker stop` et `docker kill`. Apprenez quand utiliser `SIGTERM` pour des arrêts élégants, préservant l'intégrité des données, et quand `SIGKILL` est nécessaire pour la terminaison immédiate des conteneurs qui ne répondent pas. Ce guide fournit des exemples pratiques et les meilleures pratiques pour choisir la bonne commande afin d'assurer une stabilité optimale de l'application et un flux de travail efficace.
Comparaison entre Docker Stop et Kill : Quand Utiliser Chaque Commande
Lorsque votre conteneur doit s'arrêter, docker stop et docker kill ne sont pas interchangeables. La différence compte surtout lorsque votre application écrit des données, maintient des connexions réseau ou a besoin de temps de nettoyage avant de se fermer.
Utilisez docker stop pour les arrêts normaux. Utilisez docker kill lorsque vous avez besoin d'un signal immédiat, généralement parce que le conteneur a ignoré un arrêt gracieux ou que vous testez un comportement de défaillance.
Comprendre docker stop
La commande docker stop demande au processus principal du conteneur de se fermer proprement. Par défaut, Docker envoie SIGTERM au PID 1 à l'intérieur du conteneur, attend une période de grâce, puis envoie SIGKILL si le processus est toujours en cours d'exécution.
Ce premier signal peut être modifié par l'instruction STOPSIGNAL de l'image ou par l'option --stop-signal utilisée lors de la création du conteneur. Dans la plupart des cas quotidiens, vous pouvez considérer docker stop comme "envoyer une demande d'arrêt à l'application, puis la forcer seulement si elle ne se ferme pas".
- Sauvegarder son état actuel.
- Fermer les connexions réseau ouvertes.
- Libérer les ressources qu'elle détient.
- Terminer les opérations en cours (comme l'écriture de données sur le disque).
Sur les conteneurs Linux, le temps d'attente par défaut est généralement de 10 secondes, sauf si un délai d'arrêt différent a été configuré pour le conteneur. Les conteneurs Windows utilisent un délai par défaut plus long. Vous pouvez remplacer le temps d'attente par commande avec -t ou --time.
Comment fonctionne docker stop
- Envoi de
SIGTERM: Docker envoie un signalSIGTERMau processus principal (PID 1) à l'intérieur du conteneur. - Attente de la période de grâce : Docker attend que le processus se termine.
- Envoi de
SIGKILL(si nécessaire) : Si le processus ne s'est pas terminé à la fin de la période de grâce, Docker envoie un signalSIGKILL.
Quand utiliser docker stop
- Arrêt normal de l'application : C'est la méthode privilégiée pour arrêter les applications qui doivent s'arrêter proprement, comme les bases de données, les serveurs web ou les applications qui effectuent des écritures critiques.
- Environnements de développement : Pour les arrêts de routine pendant le développement,
docker stopgarantit que vous n'interrompez pas accidentellement des processus en cours. - Environnements de production pour maintenance planifiée : Lorsque vous devez redémarrer un service ou effectuer des mises à jour,
docker stoppermet à l'application de terminer son travail.
Exemple
# Démarrer un conteneur nommé 'my-web-server'
docker run -d --name my-web-server -p 80:80 nginx
# Arrêter le conteneur gracieusement
docker stop my-web-server
# Vérifier que le conteneur est arrêté
docker ps -a | grep my-web-server
Si votre application a besoin de plus de temps pour vider les files d'attente ou fermer les connexions à la base de données, donnez-lui un délai d'attente plus long :
docker stop --time 30 my-web-server
Comprendre docker kill
La commande docker kill envoie immédiatement un signal au processus principal du conteneur. Par défaut, ce signal est SIGKILL. Contrairement à SIGTERM, SIGKILL ne peut pas être intercepté, ignoré ou géré par le processus. Le système d'exploitation met fin au processus sans lui donner la possibilité de faire un nettoyage.
Cela signifie que les données non sauvegardées, les connexions ouvertes ou les écritures en cours peuvent être interrompues. Un conteneur de test sans état peut ne pas s'en soucier. Une base de données, un worker de file d'attente ou un travail de traitement de fichiers, probablement si.
Vous pouvez également utiliser docker kill --signal pour envoyer un signal différent, comme SIGHUP, mais si votre intention est un arrêt gracieux, docker stop est généralement plus clair.
Comment fonctionne docker kill
- Envoi de
SIGKILL: Docker envoie un signalSIGKILLdirectement au processus principal (PID 1) à l'intérieur du conteneur. - Terminaison immédiate : Le processus est terminé par le système d'exploitation.
Quand utiliser docker kill
- Conteneurs qui ne répondent pas : Lorsqu'un conteneur est bloqué et que
docker stopn'a pas réussi à le terminer même après la période de grâce. - Arrêts d'urgence : Dans les situations où vous devez arrêter un conteneur immédiatement, quelles que soient les conséquences, comme les incidents de sécurité ou les défaillances critiques.
- Tests de résilience : Pour voir comment votre application se comporte lorsque le processus disparaît sans nettoyage.
Exemple
# Démarrer un conteneur nommé 'my-test-app'
docker run -d --name my-test-app ubuntu sleep infinity
# Forcer l'arrêt du conteneur
docker kill my-test-app
# Vérifier que le conteneur est arrêté
docker ps -a | grep my-test-app
Principales différences résumées
| Fonctionnalité | docker stop |
docker kill |
|---|---|---|
| Signal envoyé | Généralement SIGTERM, puis SIGKILL si le délai expire |
SIGKILL par défaut |
| Terminaison | Gracieuse, permet le nettoyage | Immédiate, forcée, sans nettoyage |
| Intégrité des données | Préserve généralement l'intégrité des données | Risque de corruption des données ou d'état incohérent |
| Cas d'utilisation | Arrêt normal, maintenance planifiée | Conteneurs qui ne répondent pas, arrêts d'urgence |
| Période de grâce | Oui | Non |
Bonnes pratiques et considérations
- Essayez toujours
docker stopen premier : Pour les opérations de routine,docker stopdevrait être votre choix par défaut. Il protège vos applications et vos données. - Comprenez les signaux de votre application : Les applications peuvent être programmées pour gérer les signaux
SIGTERM. Assurez-vous que le script d'entrée de votre application ou le gestionnaire de processus est configuré pour écouter et répondre àSIGTERMde manière gracieuse. - Ajustez la période de grâce pour
docker stop: Vous pouvez spécifier une période de grâce personnalisée pourdocker stopen utilisant le drapeau-tou--time. Par exemple,docker stop -t 30 mon-conteneurdonne au conteneur 30 secondes pour s'arrêter. - Utilisez
docker killen dernier recours : N'utilisezdocker killque lorsquedocker stopest inefficace ou dans des situations critiques et urgentes. - Surveillez la santé du conteneur : La mise en œuvre de vérifications de santé dans votre configuration Docker peut aider à identifier les conteneurs qui deviennent non réactifs, vous permettant potentiellement de résoudre les problèmes avant qu'ils ne nécessitent un
docker kill. - Vérifiez le comportement du PID 1 : Les scripts wrapper shell peuvent avaler les signaux s'ils ne les transmettent pas au véritable processus de l'application. Préférez
execdans les scripts d'entrée afin que l'application reçoive directement les signaux d'arrêt.
En résumé pratique
Faites de docker stop votre habitude normale, surtout pour tout ce qui est avec état. Utilisez docker kill uniquement lorsque le conteneur ne répond pas, lorsque la vitesse prime sur le nettoyage, ou lorsque vous testez délibérément un comportement de plantage.