Utilisez Docker pour arrêter les conteneurs sans tout casser !

Ayant des problèmes avec l’arrêt des conteneurs Docker ? Trouver la manière correcte d’arrêter un conteneur peut être difficile avec la possibilité de créer de nombreux conteneurs différents. Dans cet article, vous apprendrez les commandes Docker pour arrêter un conteneur ou tous les conteneurs.

Continuez à lire pour en savoir plus !

Prérequis

Pour suivre ce tutoriel, assurez-vous d’avoir les éléments suivants :

  • Windows 10 – Le tutoriel utilise Windows pour exécuter Docker, mais vous pouvez également appliquer les mêmes étapes générales sous Linux ou macOS.
  • Docker Desktop – Ce tutoriel utilise la version 3.5.2. Le moteur Docker est disponible si vous êtes sur Linux car l’interface graphique ne l’est pas.
  • A running Docker container or containers.

Arrêt des Conteneurs avec la Commande docker stop

Commençons avec la première commande : la commande docker stop et comment elle permet d’arrêter des conteneurs.

Par exemple, peut-être avez-vous besoin d’arrêter un conteneur en cours d’exécution avec le nom mystifying_hofstadter et un ID de fb66ed502096. Comme le montre l’exemple ci-dessous, arrêtez le conteneur avec la commande docker stop.

# Arrêtez le conteneur via le nom
docker stop mystifying_hofstadter
# Arrêtez le conteneur via l'ID (même conteneur)
docker stop fb66ed50209
Stopping a single Docker container via the container name or container ID.

Que faire si vous avez plusieurs conteneurs en cours d’exécution et que vous souhaitez les arrêter? La commande docker stop prend en charge l’arrêt de plusieurs IDs de conteneurs, un à la fois.

Tout d’abord, répertoriez tous les conteneurs via la commande docker ps et transmettez les IDs des conteneurs à la commande docker stop, comme indiqué ci-dessous.

# Liste tous les conteneurs en cours d'exécution
docker ps
# Arrêtez les conteneurs Docker suivants via l'ID du conteneur
docker stop a427a21c5558 e9dbd816f24c 31269ef5999e
Listing all running containers and then stopping them

Que faire si vous souhaitez arrêter tous les conteneurs en cours d’exécution sans récupérer manuellement les IDs des conteneurs et les transmettre à docker stop? La commande docker ps -q accomplira cela. Le paramètre -q de la commande docker ps ne renvoie que les IDs des conteneurs.

# Créez trois conteneurs. Un point-virgule sépare chaque commande
docker run -d -t ubuntu; docker run -d -t ubuntu; docker run -d -t ubuntu
# Liste tous les conteneurs en cours d'exécution
docker ps -q
# Récupérez tous les IDs des conteneurs en cours d'exécution et transmettez-les à docker stop
docker stop $(docker ps -q)
Stopping multiple Docker containers at once.

La construction $(docker ps -q) ci-dessus est une sous-expression à la fois dans Bash sur Linux et PowerShell sur Windows. Une sous-expression indique à l’interpréteur de traiter un ensemble de commandes, docker ps -q, d’abord, puis de renvoyer l’ensemble des résultats à la commande d’origine docker stop.

La commande docker stop utilise le signal SIGTERM. Les signaux Linux informent un processus d’un événement, mais c’est au processus de décider comment réagir à un signal donné.

Lors de l’utilisation du signal SIGTERM, Docker utilise le signal pour arrêter gracieusement un processus en attendant une valeur par défaut de 10 secondes avant d’envoyer le signal SIGKILL, qui termine immédiatement le processus.

Arrêt d’un conteneur en utilisant des signaux de processus

Vous avez appris le comportement par défaut de Docker (signal d’arrêt) avec la commande docker stop lors de l’arrêt d’un conteneur. Mais vous ne voulez peut-être pas le comportement par défaut. Au lieu de cela, vous pouvez indiquer à Docker d’utiliser des signaux d’arrêt alternatifs.

Avec le drapeau --stop-signal de la commande docker run, vous pouvez spécifier le signal d’arrêt lors du démarrage du conteneur. Ce drapeau définit le signal qui sera envoyé au conteneur en cours d’exécution lorsque vous voulez l’arrêter.

Dans l’exemple ci-dessous, le drapeau --stop-signal prend la valeur SIGQUIT, ce qui indique à Docker d’envoyer le signal SIGQUIT lorsqu’il est temps d’arrêter le conteneur. L’exemple utilise également les paramètres suivants :

  • d – Runs the container in detached (background) mode. The detached mode will not allow the container to be immediately interacted with by the user since the process is running in the background.
  • t – allocates a Pseudo-TTY (PTY) console, which emulates a real terminal console in the container and stops the Ubuntu container from immediately exiting. The Ubuntu container in the example requires a PTY console to stay active in the background.
  • “nom de l’image” – quelle image Docker utiliser pour provisionner le conteneur, dans ce cas, l’image ubuntu.
docker run -d -t --stop-signal SIGQUIT ubuntu
Specifying SIGQUIT as the signal when starting and then stopping a Docker container.

Vous pouvez également spécifier le signal d’arrêt en utilisant un Dockerfile, qui indique à Docker comment construire un conteneur. Vous pouvez ajouter une entrée au Dockerfile spécifiant le signal d’arrêt avec STOPSIGNAL SIGQUIT, par exemple. Vous pouvez remplacer SIGQUIT par n’importe quel signal d’arrêt de votre choix.

Arrêt immédiat des conteneurs avec docker kill

Il y aura des moments où vous voudrez arrêter des conteneurs sans leur accorder de période de grâce. La commande docker kill arrête immédiatement un conteneur.

L’exemple ci-dessous passe le conteneur avec l’ID 2aa318273db5 à docker kill. Le conteneur quittera immédiatement via le signal SIGKILL. Le conteneur ne sera pas autorisé à sortir de manière gracieuse. En conséquence de la commande, le conteneur quittera et l’ID du conteneur sera affiché.

docker kill 2aa318273db5

Arrêter et supprimer un conteneur avec docker rm

Par défaut, lorsque vous créez un conteneur, ce conteneur est construit de la même manière qu’auparavant : il est idempotent. Supprimer un conteneur aura un impact minimal, et avec cela à l’esprit, docker rm peut forcer l’arrêt et la suppression d’un conteneur. Docker envoie un signal SIGKILL au processus principal et retire le conteneur de la liste des conteneurs disponibles sur votre installation Docker.

Si le conteneur doit conserver les fichiers internes modifiés ou si son état doit être préservé, alors la suppression d’un conteneur détruira ces changements. Attention aux potentielles erreurs !

Dans l’exemple suivant, peut-être avez-vous démarré un conteneur qui a été assigné le nom kind_galileo. Avant de supprimer un conteneur, celui-ci doit être arrêté, comme indiqué ci-dessous. La commande docker ps -a affiche le statut Exited pour l’exemple de conteneur.

Listing all containers, including stopped containers.

Maintenant que le conteneur est arrêté, l’exécution de la commande docker rm va supprimer le conteneur entièrement.

docker rm kind_galileo

Au lieu d’arrêter le conteneur pour ensuite le supprimer, la combinaison de --force et de docker rm va arrêter et supprimer le conteneur en une seule opération. Le conteneur, laughing_elion, ne sera plus disponible pour être exécuté.

docker rm --force laughing_elion

Si vous ne spécifiez pas la commande --force, vous rencontrerez le message d’erreur Réponse d'erreur du démon : Vous ne pouvez pas supprimer un conteneur en cours d'exécution...

Stopping and removing a container.

Arrêt des Conteneurs Docker avec Docker Compose

Les commandes Docker sont généralement utilisées sur un seul conteneur, mais vous pouvez créer un service avec plusieurs conteneurs travaillant ensemble. L’outil Docker Compose vous permet de configurer un service composé de plusieurs conteneurs pour travailler ensemble.

Étant donné que les conteneurs au sein d’un service sont conçus pour fonctionner ensemble, il est préférable d’arrêter le service lui-même de manière appropriée plutôt que chaque conteneur individuellement.

Si vous avez un service en cours d’exécution avec plusieurs conteneurs, [docker-compose stop] arrête le service sans supprimer les conteneurs ou le service. Suivez les étapes ci-dessous pour créer un service Docker Compose, démarrer le service et finalement arrêter le service de manière appropriée.

1. Créez un répertoire pour stocker votre fichier de configuration. Dans cet exemple, le répertoire C:\Articles\Ubuntu stockera le fichier.

mkdir C:\Articles\Ubuntu

2. Ensuite, créez le fichier docker-compose.yml contenant la configuration suivante. Le fichier Docker Compose ci-dessous crée un service avec deux conteneurs Ubuntu, et lorsqu’il est démarré, les conteneurs ne se ferment pas immédiatement.

# La version de spécification de docker-compose
version: "3.9"
# La collection d'applications composant ce service
services:
  # Premier conteneur Ubuntu
  container1:
    image: ubuntu
    # Identique à l'option -t et alloue un Psuedo-TTY, afin que le conteneur ne se ferme pas immédiatement.
    tty: true
  # Deuxième conteneur Ubuntu
  container2:
    image: ubuntu
    tty: true

3. Dans une session de terminal, accédez au répertoire de votre fichier de configuration Docker personnalisé, qui dans cet exemple est C:\Articles\Ubuntu. Exécutez la commande docker-compose up -d pour générer et démarrer le service créé à l’étape précédente en arrière-plan, comme indiqué par l’option -d.

Starting a Docker Compose service.

4. Dans la même session de terminal et le même répertoire, lancez la commande docker-compose stop pour arrêter le service et les conteneurs de manière élégante.

Stopping a Docker Compose service.

La commande docker-compose, tout comme la commande docker, dispose également des paramètres rm --force et kill. Les paramètres de docker-compose agissent sur le service au lieu d’un seul conteneur. La commande docker-compose kill prend également une option -s pour spécifier le signal d’arrêt.

Conclusion

Les conteneurs Docker sont un outil puissant pour créer des environnements uniques et segmentés pour une utilisation en développement et en production. Dans cet article, vous avez appris plusieurs façons dont Docker arrête un ou plusieurs, voire tous les conteneurs. Vous avez également appris à propos du signal d’arrêt par défaut utilisé par Docker et comment le modifier.

Avec cette connaissance, vous connaissez maintenant les tenants et les aboutissants de l’arrêt des conteneurs Docker et comment ne pas faire d’erreurs lorsqu’il est temps d’arrêter les conteneurs en cours d’exécution. Comment prévoyez-vous d’arrêter vos conteneurs à partir de maintenant, avec cette nouvelle connaissance?

Source:
https://adamtheautomator.com/docker-stop-containers/