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

116

Quelle est la différence entre docker stopet docker kill?

Afaik, les deux vont arrêter un conteneur en cours d'exécution. Est-ce que les docker stoptentatives pour arrêter le processus dans le conteneur s'exécutent de la bonne manière, tout docker killen envoyant un signal de destruction? Si oui, comment docker stopsavoir comment arrêter correctement le processus en cours d'exécution. (Puisque cela diffère d'un processus à l'autre)

Geert-Jan
la source

Réponses:

113

Est-ce que docker stop tente d'arrêter correctement le processus exécuté dans le conteneur, alors que docker kill enverra un signal de destruction?

En gros, oui, la différence est subtile, mais décrite dans la référence de ligne de commande :

  • Arrêt du menu fixe : arrêtez un conteneur en cours d'exécution ( envoyez 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. [c'est moi qui souligne]
  • docker kill : élimine un conteneur en cours d'exécution ( envoi de SIGKILL ou signal spécifié ) [...] Le processus principal à l'intérieur du conteneur sera envoyé à SIGKILL, ou tout signal spécifié avec l'option --signal. [c'est moi qui souligne]

Donc, stoptente de déclencher un arrêt en douceur en envoyant le signal POSIX standard SIGTERM, alors killque le processus tue 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 une terminaison agréable libérant des ressources et enregistrant un état si nécessaire. 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 SIGTERMcorrectement et faire ce qui est bien en fonction de leurs responsabilités - cela peut facilement échouer en raison de la tentative d'arrêt en douceur prenant plus de temps que le délai de grâce, qui doit être pris en compte si l'intégrité des données est essentielle. primordial (par exemple pour les bases de données); voir par exemple SIGTERM contre SIGKILL du major Hayden 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 ne le peuvent pas. 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 dans un mauvais état, par exemple en attente d'E / S de disque, il est possible qu'elle ne puisse pas agir sur le signal envoyé.

Steffen Opel
la source
1
Donc, si je voulais avoir une procédure d’arrêt générique pour les conteneurs, je devrais saisir 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 en douceur via docker stop? Je vois encore beaucoup de docker kills dans les scripts cependant.
Dennis
10

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

docker stop va essayer de l'arrêter gracieusement (va demander 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>continuez à partir de là.

les maladresses
la source
1
... mais si des docker killmodifications du système de fichiers en attente que le processus principal avait encore en mémoire sont perdues, le système de fichiers risque alors d'être endommagé?
Arjan
évidemment, étant donné qu’il s’agit d’un arrêt brusque, seuls les changements au moment de l’abattage seront conservés. Tout ce qui est en attente sera perdu. Ce que je voulais dire, c'est que tuer un docker ne signifie pas… tuer le conteneur, c'est arrêter le processus. comme lorsque vous éteignez votre ordinateur au lieu de l'éteindre
awkwardarts
2
Les conteneurs Docker ne sont pas des ordinateurs virtuels et le noyau reste en vie après une destruction. Par conséquent, toute modification du système de fichiers ayant atteint le noyau sera validée. Il ne devrait pas être possible d'endommager le système de fichiers (au sens de fsck; l'application pourrait ne pas aimer perdre certaines de ses écritures). docker killest analogue à tuer un processus, ne pas éteindre l'ordinateur.
Ian Howson
3

Et en plus des réponses ajoutées plus tôt

courir docker eventsaprès les docker stopspectacles

  • kill (signal 15): où signal 15 = SIGTERM
  • mourir
  • Arrêtez

courir docker eventsaprès les docker killspectacles

  • kill (signal 9): où signal 9 = SIGKILL
  • Die (code de sortie 137)

docker stopa un délai d'attente avant de tuer le processus. La valeur par défaut est 10 secondes.

Ce tableau a encore plus de détails.

fabuleuses
la source
1

Cela revient à débrancher le bureau et à éteindre l'ordinateur.

De la même manière que tirer sur Plug Off signifie une mise hors tension docker killbrusque, un moyen direct de tuer my_container, qui ne tente pas d’arrêter le processus en premier.

Arrêter l'ordinateur signifie envoyer un signal au système d'exploitation pour arrêter tous les processus, ce qui docker stopsignifie envoyer un SIGTERMsignal au conteneur en cours d'exécution pour arrêter les processus en douceur.

Rajat Badjatya
la source