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

  1. Envoi de SIGTERM : Docker envoie un signal SIGTERM au processus principal (PID 1) à l'intérieur du conteneur.
  2. Attente de la période de grâce : Docker attend que le processus se termine.
  3. 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 signal SIGKILL.

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 stop garantit 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 stop permet à 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

  1. Envoi de SIGKILL : Docker envoie un signal SIGKILL directement au processus principal (PID 1) à l'intérieur du conteneur.
  2. 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 stop n'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 stop en premier : Pour les opérations de routine, docker stop devrait ê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 à SIGTERM de 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 pour docker stop en utilisant le drapeau -t ou --time. Par exemple, docker stop -t 30 mon-conteneur donne au conteneur 30 secondes pour s'arrêter.
  • Utilisez docker kill en dernier recours : N'utilisez docker kill que lorsque docker stop est 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 exec dans 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.