Exercice 06 : Projet Capstone - Déployer et Gérer une Application Web avec Docker
🎯 Objectifs
À la fin de cet exercice, vous serez capable de :
- ✅ Tirer des images depuis Docker Hub avec
docker pull - ✅ Lancer des conteneurs avec port mapping, nom et mode détaché
- ✅ Consulter les logs, inspecter et déboguer un conteneur
- ✅ Gérer le cycle de vie complet : start, stop, restart, remove
- ✅ Nettoyer les ressources inutilisées avec
docker system prune
Durée estimée : 40 minutes
Difficulté : ⭐⭐⭐☆☆ (Intermédiaire)
Prérequis :
- Avoir complété les exercices 01 à 04
- Docker installé et fonctionnel (
docker --version) - Module Docker Débutant complété
📖 Contexte
Vous rejoignez une équipe qui utilise Docker pour tous ses environnements. Votre première mission : déployer une stack de développement locale composée d'un serveur web Nginx et d'une base de données PostgreSQL, uniquement avec des commandes docker run.
Cet exercice mobilise les compétences du module :
- Concepts conteneur vs image
docker pull,docker images,docker rmidocker runavec-d,-p,--name,-edocker ps,docker logs,docker inspectdocker stop,docker rm
📋 Énoncé
Déployez deux conteneurs (Nginx + PostgreSQL), vérifiez leur bon fonctionnement, puis effectuez un nettoyage complet de l'environnement.
🧭 Déroulement de l'exercice
Tâche 1 : Préparer les images
Téléchargez les images nginx:1.25-alpine et postgres:16-alpine depuis Docker Hub. Listez toutes les images locales et affichez leurs tailles.
Indice :
docker pull <image>:<tag>télécharge une image.docker images(oudocker image ls) liste les images locales avec leur taille.
Vérification : docker images | grep -E "nginx|postgres" doit lister les 2 images.
Tâche 2 : Lancer le serveur Nginx
Lancez un conteneur Nginx nommé web en mode détaché, avec le port 8080 de l'hôte mappé sur le port 80 du conteneur.
Indice :
docker run -d --name web -p 8080:80 nginx:1.25-alpine. Le format port mapping estHOST_PORT:CONTAINER_PORT.
Vérification : curl -s http://localhost:8080 | head -5 doit afficher le HTML de la page Nginx par défaut.
Tâche 3 : Lancer PostgreSQL
Lancez un conteneur PostgreSQL nommé db en mode détaché, avec le port 5432 mappé, et les variables d'environnement suivantes : POSTGRES_USER=devops, POSTGRES_PASSWORD=secret, POSTGRES_DB=appdb.
Indice :
docker run -d --name db -p 5432:5432 -e POSTGRES_USER=devops -e POSTGRES_PASSWORD=secret -e POSTGRES_DB=appdb postgres:16-alpine. Les variables d'environnement se passent avec-e.
Vérification : docker ps doit lister les deux conteneurs avec statut Up.
Tâche 4 : Inspecter et déboguer
Effectuez les 4 opérations d'inspection suivantes :
- Afficher les logs du conteneur
web - Inspecter le conteneur
dbavecdocker inspectet trouver son adresse IP interne - Exécuter la commande
nginx -và l'intérieur du conteneurweb - Afficher les statistiques en temps réel (
docker stats) pendant 5 secondes, puis quitter
Indice :
docker logs web,docker inspect db | grep IPAddress,docker exec web nginx -v,docker stats --no-stream.
Vérification : docker inspect db | grep '"IPAddress"' retourne une adresse IP du réseau bridge Docker (ex : 172.17.0.x).
Tâche 5 : Gérer le cycle de vie
Effectuez les opérations suivantes dans l'ordre :
- Arrêtez le conteneur
web - Vérifiez qu'il n'est plus accessible (
curl http://localhost:8080doit échouer) - Redémarrez-le
- Vérifiez qu'il répond à nouveau
Indice :
docker stop web,docker start web.curl -s --max-time 2 http://localhost:8080doit retourner une erreur quand le conteneur est arrêté.
Vérification : Après docker start web, docker ps | grep web affiche Up.
Tâche 6 : Nettoyer l'environnement
Supprimez proprement tous les conteneurs et images créés durant cet exercice :
- Arrêtez les deux conteneurs
- Supprimez les deux conteneurs
- Supprimez les deux images
- Vérifiez avec
docker system dfque l'espace récupéré est cohérent
Indice :
docker stop web db,docker rm web db,docker rmi nginx:1.25-alpine postgres:16-alpine.docker system prunenettoie tout ce qui n'est pas utilisé (à utiliser avec précaution).
Vérification : docker ps -a | grep -E "web|db" ne retourne rien. docker images | grep -E "nginx|postgres" ne retourne rien.
🗂️ Mini-Projet : Stack de développement locale
Reconstituez la stack complète avec une commande résumée et générez un rapport :
# Lancer la stack complète
docker pull nginx:1.25-alpine postgres:16-alpine
docker run -d --name web -p 8080:80 nginx:1.25-alpine
docker run -d --name db \
-p 5432:5432 \
-e POSTGRES_USER=devops \
-e POSTGRES_PASSWORD=secret \
-e POSTGRES_DB=appdb \
postgres:16-alpine
# Attendre le démarrage
sleep 3
# Rapport de la stack
echo "=== STACK EN COURS ==="
docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}"
echo ""
echo "=== IMAGES UTILISÉES ==="
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"
echo ""
echo "=== CONNECTIVITÉ WEB ==="
curl -s -o /dev/null -w "Nginx HTTP status: %{http_code}\n" http://localhost:8080
echo ""
echo "=== IP INTERNE DES CONTENEURS ==="
echo "web: $(docker inspect web --format '{{.NetworkSettings.IPAddress}}')"
echo "db: $(docker inspect db --format '{{.NetworkSettings.IPAddress}}')"Checkpoints de validation :
docker psliste deux conteneurs avec statutUpcurl -s http://localhost:8080retourne du HTMLdocker inspect db --format '{{.NetworkSettings.IPAddress}}'retourne une IP validedocker exec web nginx -vaffiche la version de Nginx- Après nettoyage,
docker ps -ane liste pluswebnidb