Exercice 05 : Déboguer avec docker exec et les outils internes
🎯 Objectifs
À la fin de cet exercice, vous serez capable de :
- ✅ Ouvrir un shell interactif dans un conteneur avec
docker exec -it ... sh - ✅ Exécuter une commande unique sans shell interactif avec
docker exec - ✅ Copier un fichier de l'hôte vers un conteneur et inversement avec
docker cp - ✅ Lister les fichiers modifiés dans un conteneur avec
docker diff - ✅ Sauvegarder l'état d'un conteneur modifié avec
docker commit
Durée estimée : 15 min | Difficulté : ⭐⭐⭐☆☆
📖 Contexte
Quand un conteneur ne se comporte pas comme prévu, docker exec permet d'y entrer et d'inspecter son état sans le redémarrer. docker cp évite de reconstruire une image pour tester une correction rapide. docker diff et docker commit permettent de capturer un état modifié - utile pour le débogage, déconseillé en production.
📋 Énoncé
Lancez un conteneur Nginx, entrez dedans pour inspecter son contenu, copiez des fichiers, observez les modifications du système de fichiers, puis sauvegardez l'état dans une nouvelle image.
🧭 Déroulement
Tâche 1 : Lancer un conteneur et ouvrir un shell interactif
Lancez un conteneur Nginx en arrière-plan nommé mon-nginx. Entrez ensuite dans ce conteneur avec un shell sh en mode interactif.
Indice :
docker exec -it <nom> shouvre un shell dans un conteneur en cours d'exécution.-imaintient stdin ouvert,-talloue un pseudo-terminal.
Vérification : Votre prompt change (ex: #) et pwd retourne /. ls /etc/nginx/ liste les fichiers de configuration Nginx.
Tâche 2 : Exécuter une commande unique
Sans ouvrir de shell interactif, affichez le contenu du fichier /etc/nginx/nginx.conf directement depuis votre terminal hôte.
Indice :
docker exec <nom> cat <fichier>exécute une commande unique et retourne son résultat dans votre terminal.
Vérification : Le contenu de nginx.conf s'affiche dans votre terminal sans entrer dans le conteneur.
Tâche 3 : Copier des fichiers avec docker cp
Créez un fichier index.html sur votre hôte avec le contenu <h1>Bienvenue</h1>, puis copiez-le dans le conteneur à l'emplacement /usr/share/nginx/html/index.html.
Indice :
docker cp <source> <conteneur>:<destination>copie de l'hôte vers le conteneur. La syntaxe inverse copie du conteneur vers l'hôte.
Vérification : curl http://localhost:80 (ou le port mappé) retourne <h1>Bienvenue</h1> - si le port est mappé. Sinon : docker exec mon-nginx cat /usr/share/nginx/html/index.html.
Tâche 4 : Observer les modifications avec docker diff
Affichez la liste des fichiers modifiés, ajoutés, ou supprimés dans mon-nginx depuis sa création.
Indice :
docker diff <conteneur>liste les changements du système de fichiers.A= ajouté,C= modifié,D= supprimé.
Vérification : Le fichier index.html apparait avec la lettre C (modifié) ou A (ajouté) dans la liste.
Tâche 5 : Sauvegarder l'état avec docker commit
Créez une nouvelle image nommée nginx-custom:1.0 à partir de l'état actuel du conteneur mon-nginx.
Indice :
docker commit <conteneur> <image:tag>capture l'état du système de fichiers du conteneur dans une nouvelle image. C'est utile pour le débogage mais les Dockerfiles restent la méthode recommandée en production.
Vérification : docker images nginx-custom liste l'image. Lancez un nouveau conteneur depuis cette image et vérifiez que index.html personnalisé est présent.
🗂️ Mini-Projet
Parcourez le cycle complet de débogage et validez chaque checkpoint :
docker run -d -p 8080:80 --name mon-nginx nginx
docker exec -it mon-nginx sh
# Dans le conteneur :
ls /etc/nginx/
exit
docker exec mon-nginx cat /etc/nginx/nginx.conf
echo '<h1>Bienvenue</h1>' > index.html
docker cp index.html mon-nginx:/usr/share/nginx/html/index.html
docker exec mon-nginx cat /usr/share/nginx/html/index.html
docker diff mon-nginx
docker commit mon-nginx nginx-custom:1.0
docker images nginx-custom
docker run --rm -p 8081:80 nginx-custom:1.0 &
sleep 1 && curl http://localhost:8081
# Nettoyage
docker stop mon-nginx && docker rm mon-nginx
docker rmi nginx-custom:1.0Checkpoints de validation :
docker exec -it mon-nginx shouvre un shell dans le conteneurdocker exec mon-nginx cat /etc/nginx/nginx.confaffiche la config sans entrer dans le conteneurdocker cpcopieindex.htmlvers le bon emplacementdocker difflisteindex.htmlcomme modifié (C) ou ajouté (A)docker commitcréenginx-custom:1.0dansdocker images- Un conteneur lancé depuis
nginx-custom:1.0sert la page personnalisée