🔝 Retour au Sommaire
Une fois vos conteneurs en cours d'exécution, vous aurez souvent besoin d'interagir avec eux : exécuter des commandes à l'intérieur, consulter leurs journaux, ou vous y connecter directement. C'est exactement ce que permettent les commandes de cette section.
Ces outils sont essentiels pour :
- Déboguer des problèmes dans un conteneur
- Consulter les logs pour comprendre ce qui s'est passé
- Exécuter des commandes de maintenance ou de diagnostic
- Accéder au shell d'un conteneur pour explorer son environnement
- Surveiller l'activité en temps réel
Ces commandes transforment vos conteneurs de "boîtes noires" en environnements accessibles et inspectables.
docker exec (execute) permet d'exécuter une commande dans un conteneur en cours d'exécution. C'est la commande la plus utilisée pour interagir avec les conteneurs en production.
status: running). Vous ne pouvez pas utiliser exec sur un conteneur arrêté.
docker exec <nom_ou_id_conteneur> <commande>Lister les fichiers dans un conteneur :
docker exec mon-nginx ls -la /usr/share/nginx/htmlAfficher la date du conteneur :
docker exec mon-nginx dateVérifier la version d'un logiciel :
docker exec mon-conteneur python --versionAfficher les processus en cours :
docker exec mon-nginx ps auxCes commandes s'exécutent, affichent le résultat, puis se terminent immédiatement.
Pour ouvrir un shell interactif et travailler à l'intérieur du conteneur, utilisez les options -it :
docker exec -it mon-nginx bashExplication des options :
-i(--interactive) : garde l'entrée standard (stdin) ouverte-t(--tty) : alloue un pseudo-terminal
Vous vous retrouvez alors avec un shell bash à l'intérieur du conteneur :
root@f4d5e8a9b2c1:/#Vous pouvez maintenant exécuter n'importe quelle commande comme si vous étiez directement dans le conteneur :
# Naviguer dans les dossiers
cd /usr/share/nginx/html
# Lire un fichier
cat index.html
# Installer un outil (si le conteneur le permet)
apt-get update && apt-get install -y vim
# Quitter le shell
exit💡 Astuce : Tapez exit ou appuyez sur Ctrl+D pour quitter le shell interactif.
Tous les conteneurs n'ont pas bash installé. Essayez sh si bash n'est pas disponible :
# Pour les conteneurs basés sur Alpine Linux
docker exec -it mon-conteneur shSi vous ne savez pas quel shell est disponible :
# Essayer bash d'abord
docker exec -it mon-conteneur bash
# Si ça échoue, essayer sh
docker exec -it mon-conteneur sh
# En dernier recours
docker exec -it mon-conteneur /bin/shPar défaut, les commandes s'exécutent en tant qu'utilisateur root. Pour utiliser un autre utilisateur :
docker exec -u www-data mon-nginx whoamiSortie :
www-data
Ceci est important pour les questions de permissions et de sécurité.
Pour exécuter une commande dans un répertoire spécifique :
docker exec -w /app mon-conteneur ls -ladocker exec -e MY_VAR=value mon-conteneur envPour exécuter une commande longue en arrière-plan :
docker exec -d mon-conteneur /usr/local/bin/script-long.sh1. Inspecter les fichiers de configuration :
docker exec mon-nginx cat /etc/nginx/nginx.conf2. Tester la connectivité réseau :
docker exec mon-conteneur ping -c 3 google.com3. Vérifier les variables d'environnement :
docker exec mon-conteneur env4. Accéder à une base de données :
docker exec -it ma-base mysql -u root -p5. Exécuter des tests :
docker exec mon-app npm test6. Vider le cache d'une application :
docker exec mon-conteneur php artisan cache:clear7. Créer un backup :
docker exec ma-base mysqldump -u root -p ma_base > backup.sqldocker logs affiche les logs (journaux) d'un conteneur, c'est-à-dire tout ce qui a été écrit sur la sortie standard (stdout) et la sortie d'erreur (stderr) du processus principal du conteneur.
C'est la première commande à utiliser quand quelque chose ne fonctionne pas comme prévu !
docker logs <nom_ou_id_conteneur>docker logs mon-nginxSortie exemple :
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
...
2025/10/22 10:30:46 [notice] 1#1: nginx/1.27.3
2025/10/22 10:30:46 [notice] 1#1: start worker processes
Pour afficher les logs en continu (comme tail -f) :
docker logs -f mon-nginxLes nouveaux logs apparaîtront au fur et à mesure. Appuyez sur Ctrl+C pour arrêter de suivre.
💡 Astuce : C'est extrêmement utile pendant le développement pour voir les erreurs en temps réel !
Pour voir la date et l'heure de chaque ligne de log :
docker logs -t mon-nginxSortie :
2025-10-22T10:30:45.123456789Z /docker-entrypoint.sh: Configuration starting
2025-10-22T10:30:46.234567890Z [notice] 1#1: nginx/1.27.3
Pour voir uniquement les N dernières lignes :
docker logs --tail 50 mon-nginxPour voir les 10 dernières lignes et suivre en temps réel :
docker logs -f --tail 10 mon-nginxAfficher les logs depuis un certain temps :
# Logs des 5 dernières minutes
docker logs --since 5m mon-nginx
# Logs de la dernière heure
docker logs --since 1h mon-nginx
# Logs depuis une date précise (format RFC3339)
docker logs --since 2025-10-22T10:00:00Z mon-nginxAfficher les logs jusqu'à un certain moment :
docker logs --until 2025-10-22T12:00:00Z mon-nginxCombiner les deux :
docker logs --since 1h --until 30m mon-nginxCela affiche les logs entre il y a 1 heure et il y a 30 minutes.
Par défaut, docker logs affiche les deux flux (stdout et stderr). Certains outils permettent de filtrer, mais Docker n'a pas d'option native pour cela. Vous pouvez rediriger dans un script shell :
docker logs mon-nginx 2>&1 | grep "error"1. Déboguer un conteneur qui ne démarre pas :
docker logs mon-conteneur2. Surveiller les erreurs en temps réel :
docker logs -f mon-conteneur | grep -i error3. Analyser les logs d'une application web :
docker logs --tail 100 mon-webapp | grep "POST /api"4. Vérifier les logs d'une base de données :
docker logs ma-base | grep -i "ready for connections"5. Exporter les logs dans un fichier :
docker logs mon-conteneur > conteneur-logs-$(date +%Y%m%d).log6. Surveiller plusieurs conteneurs :
docker logs -f conteneur1 &
docker logs -f conteneur2 &
wait Docker stocke les logs localement. Par défaut, il n'y a pas de limite de taille, ce qui peut remplir votre disque !
Vérifier la taille des logs :
docker inspect --format='{{.LogPath}}' mon-conteneurPuis :
ls -lh /var/lib/docker/containers/[ID]/[ID]-json.logConfigurer la rotation des logs (dans /etc/docker/daemon.json) :
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}Cela limite chaque fichier de log à 10 Mo et conserve 3 fichiers au maximum.
docker attach vous connecte directement au processus principal du conteneur. Vous voyez ce que le processus écrit sur stdout/stderr et pouvez interagir avec stdin.
docker exec car elle présente plusieurs inconvénients (voir la comparaison plus bas).
docker attach <nom_ou_id_conteneur>docker attach mon-nginxVous êtes maintenant attaché au processus Nginx. Vous verrez tous les logs en temps réel, mais vous ne pouvez pas exécuter de commandes.
Par défaut, si vous appuyez sur Ctrl+C après un attach, le conteneur s'arrête ! Pour vous détacher sans l'arrêter, utilisez la séquence de touches :
Ctrl+P puis Ctrl+Q
💡 Astuce importante : Appuyez d'abord sur Ctrl+P, maintenez, puis appuyez sur Ctrl+Q. Relâchez tout.
Pour attacher en lecture seule (ne pas envoyer d'entrée au processus) :
docker attach --no-stdin mon-conteneurVous pouvez personnaliser la séquence de touches pour vous détacher :
docker attach --detach-keys="ctrl-x,x" mon-conteneurMaintenant, Ctrl+X suivi de X vous détache du conteneur.
docker attach est utile principalement pour :
-
Déboguer un conteneur interactif lancé avec
-it:docker run -dit ubuntu bash docker attach <id>
-
Observer la sortie d'un processus qui écrit beaucoup sur stdout :
docker attach mon-processus-verbeux
-
Interagir avec une application console dans le conteneur :
docker attach mon-jeu-console
Voici un tableau pour comprendre quand utiliser chaque commande :
| Critère | docker exec |
docker attach |
docker logs |
|---|---|---|---|
| But principal | Exécuter de nouvelles commandes | Se connecter au processus principal | Consulter les journaux |
| Processus | Crée un nouveau processus | Se connecte au processus existant | Aucun (lecture seule) |
| Interactivité | ✅ Complète (avec -it) | ❌ Aucune | |
| Shell | ✅ Oui (bash, sh, etc.) | ❌ Non | ❌ Non |
| Impact sur le conteneur | ❌ Aucun impact | ❌ Aucun impact | |
| Sécurité | ✅ Plus sûr | ✅ Très sûr | |
| Utilisation courante | ✅ Débug, maintenance | ✅✅✅ Débug, monitoring | |
| Conteneur arrêté | ❌ Ne fonctionne pas | ❌ Ne fonctionne pas | ✅ Fonctionne |
- Pour le debug et la maintenance : Utilisez
docker exec -it - Pour consulter les logs : Utilisez
docker logs -f - Pour attach : Utilisez-le rarement et avec précaution
- Sécurité :
execne risque pas d'arrêter le conteneur par erreur - Flexibilité : Vous pouvez exécuter n'importe quelle commande
- Isolation : Chaque
execest un processus séparé - Simplicité : Plus facile à utiliser pour les débutants
Exemple concret :
❌ Mauvaise pratique :
docker attach mon-serveur-web
# Si vous appuyez sur Ctrl+C par erreur, le serveur s'arrête !✅ Bonne pratique :
docker exec -it mon-serveur-web bash
# Vous êtes dans un shell séparé, Ctrl+C ne fait que quitter le shellOuvrez deux terminaux :
Terminal 1 :
docker logs -f mon-applicationTerminal 2 :
docker exec -it mon-application bashVous pouvez ainsi voir les logs en temps réel pendant que vous effectuez des actions dans le conteneur.
# 1. Vérifier les logs pour voir l'erreur
docker logs mon-conteneur
# 2. Si le conteneur est arrêté, le redémarrer
docker start mon-conteneur
# 3. Accéder au conteneur pour corriger
docker exec -it mon-conteneur bash
# 4. Suivre les logs après correction
docker logs -f mon-conteneur#!/bin/bash
# Surveiller plusieurs conteneurs
echo "=== Monitoring des conteneurs ==="
for container in $(docker ps --format '{{.Names}}'); do
echo ""
echo "📦 Conteneur: $container"
echo "📊 Dernières lignes de log:"
docker logs --tail 5 $container
echo "---"
done# ✅ Bon
docker exec -it mon-conteneur bash
# ❌ Risqué
docker attach mon-conteneur# ✅ Bon - charge uniquement les dernières lignes
docker logs --tail 100 -f mon-conteneur
# ❌ Peut être lent pour de gros logs
docker logs -f mon-conteneur# ✅ Bon - analyse ciblée
docker logs --since 30m mon-conteneur | grep ERROR
# ❌ Analyse tout l'historique
docker logs mon-conteneur | grep ERRORÉvitez que les logs ne remplissent votre disque en configurant la rotation dans /etc/docker/daemon.json.
Les modifications faites avec exec dans un conteneur sont éphémères : elles disparaissent si le conteneur est supprimé ou recréé.
# ❌ Mauvaise pratique
docker exec mon-nginx vim /etc/nginx/nginx.conf
# ✅ Bonne pratique : utiliser des volumes ou reconstruire l'image# ✅ Bon - respecte les permissions de l'application
docker exec -u www-data mon-conteneur php artisan migrate
# ❌ Peut créer des problèmes de permissions
docker exec mon-conteneur php artisan migrateCréez un fichier DEBUG.md dans votre projet avec les commandes utiles :
## Commandes de debug
### Voir les logs de l'application
```bash
docker logs -f --tail 100 mon-app
```
### Accéder au shell
```bash
docker exec -it mon-app bash
```
### Vérifier la configuration
```bash
docker exec mon-app cat /app/config/app.php
```Créez des alias pour gagner du temps :
# Dans votre ~/.bashrc ou ~/.zshrc
alias dlogs='docker logs -f --tail 100'
alias dexec='docker exec -it'
alias dsh='docker exec -it' Utilisation :
dlogs mon-conteneur
dexec mon-conteneur bash Problème : Vous essayez d'utiliser exec sur un conteneur arrêté.
Solution :
# Démarrer le conteneur d'abord
docker start mon-conteneur
# Puis exécuter la commande
docker exec -it mon-conteneur bashProblème : La commande que vous essayez d'exécuter n'existe pas dans le conteneur.
Solution :
# Vérifier quelle commande est disponible
docker exec mon-conteneur which bash
docker exec mon-conteneur which sh
# Utiliser la commande disponible
docker exec -it mon-conteneur shProblème : docker logs ne retourne rien ou très peu.
Causes possibles :
- L'application n'écrit pas sur stdout/stderr
- L'application utilise un fichier de log à la place
- Le conteneur vient juste de démarrer
Solution :
# Vérifier que le conteneur est en cours d'exécution
docker ps
# Vérifier les logs avec horodatage
docker logs -t mon-conteneur
# Si l'application écrit dans un fichier
docker exec mon-conteneur cat /var/log/application.logProblème : Vous essayez d'utiliser -it dans un script ou un pipeline.
Solution :
# Sans -it si non interactif
docker exec mon-conteneur ls -la
# Ou vérifier si c'est un TTY
if [ -t 0 ]; then
docker exec -it mon-conteneur bash
else
docker exec mon-conteneur bash
fiDocker Desktop offre une interface graphique pour :
- Consulter les logs
- Ouvrir un terminal dans le conteneur
- Inspecter les fichiers
Dev Containers permet de :
- Développer directement dans un conteneur
- Déboguer avec des breakpoints
- Accéder aux fichiers du conteneur
Interface web pour gérer Docker, incluant :
- Console interactive
- Visualisation des logs en temps réel
- Exécution de commandes
Dans cette section, vous avez appris à :
- ✅ Exécuter des commandes dans un conteneur avec
docker exec - ✅ Ouvrir un shell interactif avec
docker exec -it - ✅ Consulter les logs avec
docker logset ses options - ✅ Suivre les logs en temps réel avec
docker logs -f - ✅ Filtrer les logs par période avec
--sinceet--until - ✅ Se connecter au processus principal avec
docker attach - ✅ Comprendre les différences entre exec, attach et logs
- ✅ Appliquer les bonnes pratiques pour un debugging efficace
Ces commandes d'interaction sont vos meilleurs alliés pour le debugging et la maintenance de vos conteneurs. Maîtriser docker exec et docker logs vous rendra autonome dans la résolution de problèmes et l'exploration de vos environnements conteneurisés.
Vous avez maintenant couvert toutes les commandes Docker essentielles ! Dans les sections suivantes du tutoriel, vous apprendrez à créer vos propres images personnalisées avec les Dockerfiles.