DevOpsFacile
AccueilParcours de formationCertificationsModulesCheat SheetÀ Propos
DevOpsFacile

Une plateforme d'apprentissage complète pour maîtriser les pratiques DevOps modernes, du débutant à l'expert.

contact@devopsfacile.fr

Formation

  • Parcours de formation
  • Modules

Informations

  • À Propos
  • Conditions d'utilisation
  • Confidentialité
  • Mentions légales

© 2026 DevOps Facile. Tous droits réservés.

Fait avec pour la communauté DevOps

ModulesDocker expliqué simplement : lancer ses premiers conteneurs06 - Projet Capstone : Déployer et gérer une application web avec Docker

Détails

  • 40 minutes
  • Intermédiaire

Objectifs

  • Tirer des images depuis Docker Hub
  • Lancer des conteneurs avec les bonnes options
  • Mapper les ports et gérer les conteneurs
  • Inspecter les conteneurs et consulter les logs
  • Nettoyer l'environnement Docker
Module Docker expliqué simplement : lancer ses premiers conteneurs

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 rmi
  • docker run avec -d, -p, --name, -e
  • docker ps, docker logs, docker inspect
  • docker 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 (ou docker 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 est HOST_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 :

  1. Afficher les logs du conteneur web
  2. Inspecter le conteneur db avec docker inspect et trouver son adresse IP interne
  3. Exécuter la commande nginx -v à l'intérieur du conteneur web
  4. 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 :

  1. Arrêtez le conteneur web
  2. Vérifiez qu'il n'est plus accessible (curl http://localhost:8080 doit échouer)
  3. Redémarrez-le
  4. Vérifiez qu'il répond à nouveau

Indice : docker stop web, docker start web. curl -s --max-time 2 http://localhost:8080 doit 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 :

  1. Arrêtez les deux conteneurs
  2. Supprimez les deux conteneurs
  3. Supprimez les deux images
  4. Vérifiez avec docker system df que 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 prune nettoie 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 :

bash
# 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 ps liste deux conteneurs avec statut Up
  • curl -s http://localhost:8080 retourne du HTML
  • docker inspect db --format '{{.NetworkSettings.IPAddress}}' retourne une IP valide
  • docker exec web nginx -v affiche la version de Nginx
  • Après nettoyage, docker ps -a ne liste plus web ni db

Retour au module

Sur cette page

  • 🎯 Objectifs
  • 📖 Contexte
  • 📋 Énoncé
  • 🧭 Déroulement de l'exercice
  • Tâche 1 : Préparer les images
  • Tâche 2 : Lancer le serveur Nginx
  • Tâche 3 : Lancer PostgreSQL
  • Tâche 4 : Inspecter et déboguer
  • Tâche 5 : Gérer le cycle de vie
  • Tâche 6 : Nettoyer l'environnement
  • 🗂️ Mini-Projet : Stack de développement locale