Cursus
L'arrêt des conteneurs un par un peut ralentir votre flux de développement et entraîner des erreurs lorsque vous jonglez avec des microservices ou des applications multi-conteneurs.
Dans ce guide, j'aborderai plusieurs méthodes pour vous aider à mettre fin à tous les conteneurs en cours d'exécution.
À la fin de ce tutoriel, vous serez en mesure de :
- Comprendre comment Docker gère les signaux et les délais de grâce
- Arrêtez tous les conteneurs à l'aide de techniques et de filtres CLI simples
- Tirez parti de Docker Compose et d'alias personnalisés pour rationaliser les flux de travail.
Comprendre la terminaison des conteneurs Docker
Avant d'arrêter les conteneurs en masse, il est utile de comprendrecomment Docker orchestre les arrêts sous le capot.
Gestion des processus basée sur les signaux
Docker utilise des signaux Unix pour demander des arrêts gracieux avant de forcer la fermeture. Le comportement par défaut de la commande docker stop
est le suivant :
- Envoyez
SIGTERM
au processus principal du conteneur. - Attendez jusqu'à 10 secondes (configurable avec
-t
/--time
). - Envoyez
SIGKILL
si le processus n'est pas terminé.
- SIGTERM: Demandez poliment au processus de se terminer et de se terminer.
- Délai de grâce: Donne aux applications le temps de vider les journaux, de fermer les connexions ou de sauvegarder l'état.
- SIGKILL: Force l'arrêt immédiat de tout processus qui ne répond pas.
Interface de ligne de commande (CLI)
Par défaut, docker stop
gère un conteneur à la fois. Vous pouvez l'étendre pour arrêter plusieurs conteneurs en utilisant les fonctionnalités du shell.
# Stop a single container named my_container
docker stop my_container
Elle envoie SIGTERM à my_container
et attend les 10 secondes par défaut avant d'envoyer SIGKILL si nécessaire.
# Stop all running containers at once
docker stop $(docker ps -q)
Ici, docker ps -q
dresse la liste des identifiants de tous les conteneurs en cours d'exécution ; ces identifiants sont transmis à docker stop
, qui arrête les conteneurs de manière séquentielle.
Capture d'écran d'un terminal montrant la sortie de docker ps -q
dans docker stop
Pour une compréhension plus détaillée de ces concepts, vous pouvez explorer les concepts de conteneurisation et de virtualisation.
Comparaison entre docker stop et docker kill
Choisir entre un licenciement gracieux et un licenciement forcé vous permet d'éviter des conséquences inattendues.
Licenciement gracieux ou immédiat
Commandement |
Signal(s) |
Comportement |
Cas d'utilisation |
docker stop |
SIGTERM → SIGKILL après un délai d'attente |
Arrêt progressif avec temps de nettoyage |
Maintenance ou mises à jour de routine |
docker kill |
SIGKILL |
Licenciement immédiat |
Assainissement d'urgence des conteneurs suspendus |
Personnalisation du signal
Les deux commandes disposent d'un drapeau --signal
qui permet d'ignorer les valeurs par défaut :
# Send SIGINT instead of SIGTERM
docker stop --signal=SIGINT my_container
Ce qui précède permet aux processus de piéger SIGINT
pour un nettoyage personnalisé.
# Kill all containers with SIGUSR1
docker kill --signal=SIGUSR1 $(docker ps -q)
Comme nous l'avons vu plus haut, vous pouvez utiliser des signaux personnalisés lorsque votre application met en œuvre des crochets d'arrêt spécifiques.
Stratégies avancées d'arrêt des conteneurs
Le filtrage et l'automatisation de l'arrêt des conteneurs permettent des flux de travail DevOps plus précis, en particulier dans les environnements à grande échelle.
Une fois que vous avez compris les principes de base, vous pouvez affiner les conteneurs que vous arrêtez et la manière dont vous automatisez le processus.
Terminaison du conteneur filtré
Les filtres vous permettent de cibler les conteneurs en fonction d'attributs tels que le nom de l'image, l'état ou les étiquettes :
# Stop containers running the my_image:latest image
docker stop $(docker ps --filter "ancestor=my_image:latest" -q)
La commande ci-dessus n'arrête que les conteneurs basés sur my_image:latest
, ce qui permet un contrôle ciblé dans les projets multiservices.
Cas d'utilisation :
- Arrêter les conteneurs de test par balise d'image (
--filter "ancestor=test:latest"
) - Arrêter les conteneurs par étiquette (
--filter "label=env=dev"
)
Capture d'écran du terminal de l'utilisation de docker ps --filter
Nettoyage automatisé avec Docker Compose
Si vos services sont définis dans un fichier docker-compose.yml
, une seule commande permet d'arrêter tous les conteneurs concernés :
docker-compose stop
Cela respecte les dépendances de vos services et les délais configurés pour un arrêt propre.
Pour des techniques plus avancées, vous pouvez envisager le cours Intermediate Docker.
Optimisation du flux de travail à l'aide d'alias
Pour les tâches répétitives, les alias du shell réduisent la saisie et le changement de contexte :
# Add this to ~/.bashrc or ~/.zshrc
alias ds='docker stop $(docker ps -q)'
Une fois que vous avez rechargé votre shell, l'exécution de ds
arrête tous les conteneurs en une seule touche, ce qui est idéal pour un nettoyage rapide.
Utiliser l'alias 'ds' pour arrêter tous les conteneurs en cours d'exécution dans Ubuntu WSL
Meilleures pratiques opérationnelles
Mettez en œuvre des routines d'arrêt sûres et un nettoyage régulier pour que votre environnement reste stable et performant.
- Mettez en œuvre des gestionnaires de signaux dans le code de votre application pour fermer les connexions et vider les journaux.
- Réservez le site
docker kill
aux interventions d'urgence ; évitez les incohérences dans les données. - Ajustez les délais de grâce (
-t
/--time
) en fonction des besoins de nettoyage de votre application. - Automatisez le nettoyage après l'arrêt à l'aide de commandes telles que
docker system prune
, comme indiqué dans Docker Prune : Un guide complet avec des exemples pratiques. - Enregistrez les événements d'arrêt (horodatage et codes de sortie) pour diagnostiquer les problèmes de terminaison.
Dépannage des problèmes courants
Même les commandes simples peuvent se heurter à des obstacles - voici comment y remédier.
Processus zombies et volumes orphelins
Les terminaisons forcées peuvent laisser des processus périmés ou des volumes orphelins, qui consomment les ressources de l'hôte et l'espace disque. Nettoyer :
# Remove dangling volumes
docker volume prune
Cette opération supprime tous les volumes qui ne sont référencés par aucun conteneur.
Vérifiez la présence de processus de démon Docker persistants :
ps aux | grep dockerd
Tuez manuellement tout processus enfant dockerd
s'il persiste.
Un cas concret : Dans un projet, j'ai utilisé docker kill
sur un conteneur de base de données lorsqu'une migration a échoué. L'arrêt brutal a empêché la base de données de vider les journaux de transactions, ce qui a corrompu les tableaux InnoDB. Nous avons dû restaurer les sauvegardes et rejouer les binlogs, ce qui a coûté plus de 30 minutes de temps d'arrêt. Pour éviter cela, préférez docker stop
avec un délai d'attente prolongé ou ajoutez des gestionnaires SIGTERM
appropriés dans votre application.
Erreurs de refus d'autorisation
L'exécution de commandes Docker sans les privilèges appropriés déclenche souvent des erreurs :
- Faites précéder les commandes de
sudo
ou exécutez-les en tant qu'utilisateur du groupedocker
. - Ajoutez votre utilisateur au groupe
docker
et reconnectez-vous :
sudo usermod -aG docker $USER
Après vous être déconnecté et reconnecté, vous pouvez exécuter des commandes Docker sans sudo
. Dans un environnement de CI, assurez-vous que l'utilisateur du runner est membre du groupe Docker pour éviter les échecs de pipeline.
Considérations spécifiques à Windows
Dans Windows PowerShell, mettez les sous-commandes entre parenthèses et exécutez-les en tant qu'administrateur :
docker stop (docker ps -q)
Le lancement de PowerShell avec des droits élevés permet d'éviter les problèmes de pare-feu ou de contrôle d'accès. Si vous constatez des erreurs de prise de contact TLS, vérifiez que la configuration du démon de Docker Desktop correspond à votre environnement PowerShell.
Conclusion
L'arrêt efficace de tous vos conteneurs Docker permet de gagner du temps, de préserver les ressources et de minimiser les erreurs humaines dans votre flux de développement. Vous pouvez maintenir un environnement propre et prévisible en comprenant la gestion des signaux de Docker, en exploitant les filtres CLI, en utilisant Docker Compose et en créant des alias simples.
Explorez le cursus Conteneurisation et virtualisation avec Docker et Kubernetes ou le cours Docker intermédiaire pour approfondir votre expertise en matière de conteneurisation.
Joyeux conteneurisation - et à des flux de travail Docker propres et efficaces !
Maîtriser Docker et Kubernetes
FAQ
Quel est le code de sortie renvoyé par docker stop ?
En cas de succès, docker stop
renvoie 0. Un code de sortie non nul indique qu'un ou plusieurs conteneurs n'ont pas réussi à s'arrêter.
Puis-je avoir un aperçu des conteneurs qui seront arrêtés avant d'exécuter la commande ?
Oui-exécutez docker ps
ou docker ps -q
pour lister les conteneurs en cours d'exécution et vérifier les identifiants ou les noms avant de les exécuter. docker stop
.
Comment les politiques de redémarrage affectent-elles les conteneurs arrêtés ?
Les conteneurs avec une politique de redémarrage comme always
redémarreront automatiquement après l'arrêt. Supprimez ou modifiez la politique avec docker update --restart=no
si vous voulez qu'ils restent arrêtés.
Existe-t-il un moyen d'arrêter les conteneurs par réseau ou par volume ?
Bien que Docker ne filtre pas directement par réseau ou par volume sur docker stop
vous pouvez combiner docker ps --filter "network="
ou docker ps --filter "volume="
avec une substitution de commande.
Comment intégrer docker stop dans un pipeline CI/CD ?
Incorporez la commande stop dans vos scripts de construction ou vos travaux de CI - utilisez des drapeaux comme --signal
et des filtres pour des arrêts ciblés, puis faites suivre par des commandes de nettoyage (docker system prune
) dans le même pipeline.
Puis-je redémarrer ensuite tous les conteneurs arrêtés ?
Oui, utilisez docker start $(docker ps -a -q)
pour redémarrer tous les conteneurs, y compris ceux qui ont été arrêtés précédemment.
L'arrêt de tous les conteneurs les éliminera-t-il ?
Non, l'arrêt des conteneurs ne les supprime pas. Ils restent sur votre système jusqu'à ce que vous les supprimiez à l'aide de docker rm
.
Comment automatiser l'arrêt quotidien des conteneurs ?
Utilisez une tâche cron avec la commande docker stop $(docker ps -q)
pour programmer un arrêt automatique.
L'arrêt de docker affecte-t-il les volumes ou les réseaux ?
Non, l'arrêt d'un conteneur n'affecte pas les volumes ou les réseaux attachés : ils restent intacts.
Puis-je exclure certains conteneurs de l'arrêt ?
Vous pouvez arrêter les conteneurs de manière sélective en utilisant docker ps
avec des filtres ou en excluant des ID de conteneurs spécifiques de la commande.
Data Engineer avec une expertise de Python et des technologies cloud Azure, spécialisé dans la construction de pipelines de données évolutifs et de processus ETL. Il poursuit actuellement une licence en informatique à l'université de Tanta. Ingénieur de données certifié DataCamp avec une expérience démontrée dans la gestion des données et la programmation. Ancien stagiaire Microsoft Data Engineer à Digital Egypt Pioneers Initiative et Microsoft Beta Student Ambassador animant des ateliers techniques et organisant des hackathons.