Question Quelle est la différence entre `docker stop` et` docker kill`?


Quelle est la différence entre docker stop et docker kill?

Afaik, les deux vont arrêter un conteneur en cours d'exécution. Est-ce que c'est ça docker stop tente d'arrêter le processus à l'intérieur du conteneur de la manière correcte, tandis que docker kill va envoyer un signal de tuer? Si oui, comment docker stop savoir comment arrêter correctement le processus en cours. (Puisque cela diffère d'un processus à l'autre)


85
2018-05-21 12:54


origine




Réponses:


Est-ce que docker stop essaie d'arrêter le processus de manière correcte à l'intérieur du conteneur, alors que docker kill envoie un signal de suppression?

Fondamentalement oui, la différence est subtile, mais décrite dans le Ligne de commande référence:

  • arrêt de docker: Arrêtez un conteneur en cours d'exécution (envoyer SIGTERM, puis SIGKILL après la période de grâce) [...] Le processus principal à l'intérieur du conteneur recevra SIGTERM, et après une période de grâce, SIGKILL. [emphase la mienne]
  • docker tuer: Tuez un conteneur en cours d'exécution (envoyer SIGKILL, ou signal spécifié) [...] Le processus principal à l'intérieur du conteneur sera envoyé SIGKILL, ou tout autre signal spécifié avec l'option --signal. [emphase la mienne]

Alors stop tente de déclencher un arrêt progressif en envoyant le standard Signal POSIX  SIGTERM, tandis que killtue simplement le processus par défaut (mais permet également d'envoyer tout autre signal):

Le signal SIGTERM est envoyé à un processus pour demander sa terminaison. Contrairement au signal SIGKILL, il peut être capturé et interprété ou ignoré par le processus. Cela permet au processus d'effectuer de bonnes ressources de libération de terminaison et d'enregistrer le cas échéant. Il convient de noter que SIGINT est presque identique à SIGTERM.

Bien qu'ils ne soient pas appliqués de toute façon, les processus sont généralement censés gérer SIGTERM gracieusement et faire la bonne chose en fonction de leurs responsabilités - cela peut facilement échouer en raison de la tentative d'arrêt progressif plus longue que la période de grâce, ce qui est à considérer si l'intégrité des données est primordiale (par exemple pour les bases de données); voir par ex. Major Hayden SIGTERM vs. SIGKILL pour une explication plus détaillée:

L'application peut déterminer ce qu'elle veut faire une fois qu'un SIGTERM est reçu. Bien que la plupart des applications nettoient leurs ressources et s’arrêtent, certaines peuvent ne pas le faire. Une application peut être configurée pour faire quelque chose de complètement différent lorsqu'un SIGTERM est reçu. De plus, si l'application est en mauvais état, par exemple en attendant les E / S sur disque, il se peut qu'elle ne puisse pas agir sur le signal envoyé.


83
2018-05-22 14:12



Donc, si je voulais une procédure d'arrêt générique pour les conteneurs, je devrais attraper le SIGTERM dans le processus superviseur / runit? - CMCDragonkai
Quelle est la meilleure pratique ici? Je comprends pourquoi nous utiliserions docker killà la main pour gagner du temps lors de l'arrêt, mais dans un script, ne serait-il pas toujours préférable de tenter un arrêt gracieux via docker stop? Je vois encore beaucoup de docker kills dans les scripts cependant. - Dennis


docker kill arrêtera brusquement le processus / programme de point d'entrée principal

docker stop va essayer de l'arrêter gracieusement (demandera poliment: P)

dans les deux cas, les modifications du système de fichiers seront persistantes (au moment de l’arrêt ou de la suppression), donc si vous docker start <container> alors ça va continuer à partir de là.


6
2018-04-29 14:24



... mais en cas de docker kill tout changement de système de fichiers en attente que le processus principal avait encore en mémoire sera perdu, de sorte que le système de fichiers pourrait être endommagé? - Arjan
de toute évidence, étant donné qu'il s'agit d'un arrêt brutal, seuls les changements au moment de la mise à mort seront conservés. Tout en attente sera perdu. Ce que je voulais dire, c’est que tuer des dockers n’est pas vraiment… tuer le conteneur, c’est arrêter le processus. comme lorsque vous éteignez votre ordinateur au lieu de l'éteindre - awkwardarts