01 Guide pas-à-pas - Atelier 1

Dockerisez l'encyclopédie
des oiseaux migrateurs

Vous recevez du contenu HTML d'un prestataire et vous l'emballez dans une image Apache légère. Sept étapes guidées, avec indices et vérifications - les solutions sont ailleurs.

Ce qu'on vous fournit

Le dossier labos/semaine-1/demande-1-pages-html/ contient :

Vous y ajoutez : Dockerfile, .dockerignore, construire.sh, demarrer.sh, arreter.sh, votre README.md.

Avant de commencer

Pré-requis

Vue d'ensemble

Le parcours en sept étapes

Cliquez sur une étape pour y accéder directement. Chaque étape a un objectif clair, des indications (pas la solution complète) et une vérification de réussite.

Étape 01

Inspecter et tester le matériel

Étape 02

Écrire un Dockerfile minimal

Étape 03

Construire l'image

Étape 04

Démarrer le container

Étape 05

Vérifier dans le navigateur

Étape 06

Encapsuler dans 3 scripts

Étape 07

Finaliser README et .dockerignore

01

Inspecter et tester le matériel sans Docker

Avant d'emballer, comprenez ce que vous emballez. Ouvrez le contenu fourni dans un navigateur, naviguez, lancez le mini-jeu p5.js. Vous saurez ce que vos collègues étudiants vont voir une fois votre image Docker construite.

Indications

Le contenu HTML est entièrement statique : aucun PHP, aucune base de données, juste des fichiers que le navigateur affiche directement. Deux façons de tester :

  • Ouverture directe : double-cliquer sur contenu/index.html ouvre la page d'accueil dans votre navigateur via le protocole file://. Suffisant pour explorer.
  • Petit serveur local : depuis le dossier contenu/, lancez python3 -m http.server 8000 puis ouvrez http://localhost:8000/. Plus proche de ce qu'on aura avec Docker.

Cliquez sur les six oiseaux, lancez le mini-jeu, déplacez la souris dans le simulateur de vol en V.

Vous voyez la grille des six oiseaux à l'accueil. Chaque fiche s'ouvre. Le simulateur de vol s'anime avec une bande d'oiseaux qui suit votre souris.
02

Écrire un Dockerfile minimal

Créer un fichier nommé exactement Dockerfile (sans extension, majuscule au D) à la racine de votre dossier de travail. Trois instructions suffisent.

Indications

Cherchez dans la documentation officielle :

  • L'instruction qui choisit l'image de base. Image visée : httpd:alpine (Apache officiel, version Alpine Linux minimale).
  • L'instruction qui copie un fichier ou un dossier de votre machine vers l'image. Apache sert son contenu depuis /usr/local/apache2/htdocs/.
  • L'instruction qui documente le port utilisé par le service à l'intérieur de l'image. Apache écoute sur le port 80 par défaut.

Squelette à compléter (les zones soulignées en rose sont à vous) :

Dockerfile - squelette
# Image officielle Apache, base Alpine
FROM image-de-base

# Étiquettes (LABEL) : utiles pour identifier votre image
LABEL pavillon="oiseaux-migrateurs"

# Copier le contenu du dossier local vers le dossier servi par Apache
COPY source destination

# Documenter le port utilisé par Apache
EXPOSE port
N'utilisez pas le port 80 sur votre hôte directement (souvent occupé). Le port utilisé sur l'hôte sera décidé à l'étape 4 avec l'option -p de docker run. Pour l'instant, EXPOSE documente seulement le port côté container.
Le fichier Dockerfile existe à la racine de votre dossier, contient au moins trois lignes valides (FROM, COPY, EXPOSE) et fait référence à httpd:alpine.
03

Construire l'image

Transformer votre Dockerfile en image Docker prête à exécuter. Donnez-lui un nom sémantique avec un tag de version.

Indications

  • La commande de base est docker build.
  • L'option -t (ou --tag) donne un nom à l'image. Convention proposée : zoo-pavillon-oiseaux:1.0.
  • Le dernier argument est le contexte de build : un point . signifie "le dossier courant".
  • Vous pouvez taguer plusieurs noms en répétant -t (par exemple -t mon-image:1.0 -t mon-image:latest).
Terminal
$ docker build [options] .

Une fois la commande lancée, Docker exécute chaque ligne de votre Dockerfile dans l'ordre, télécharge l'image de base si elle n'est pas en cache, copie votre contenu, et finalise l'image.

La commande docker images liste votre image avec le bon tag. Sa taille devrait être autour de 60 à 80 Mo pour httpd:alpine.
Si vous lancez docker build depuis le mauvais dossier (par exemple le parent), Docker enverra TOUT le contexte (votre dépôt entier) au démon. Restez à la racine du dossier de votre demande.
04

Démarrer le container

Lancer un container basé sur votre image, en exposant le port 80 du container sur un port libre de votre hôte (par exemple 8080).

Indications

  • La commande de base est docker run.
  • -p 8080:80 mappe le port 80 du container sur le port 8080 de votre hôte.
  • -d (détaché) lance le container en arrière-plan.
  • --name nom-choisi donne un nom au container pour le retrouver facilement.
  • Le dernier argument est le nom de l'image à utiliser.
Terminal
$ docker run [options] nom-image
docker ps liste votre container, statut "Up", port mappé visible (par exemple 0.0.0.0:8080->80/tcp).
Si vous relancez docker run avec le même --name alors qu'un container du même nom existe déjà (même arrêté), Docker refuse. Utilisez docker rm nom pour supprimer l'ancien, ou docker stop nom && docker rm nom si encore actif.
05

Vérifier dans le navigateur

Ouvrir http://localhost:8080/ dans un navigateur. La page d'accueil de l'encyclopédie doit s'afficher, identique à l'étape 1.

Indications

Si la page ne charge pas :

  • docker logs nom-container montre les logs Apache. Cherchez les erreurs.
  • docker ps vérifie que le container tourne (statut "Up").
  • docker port nom-container confirme le mappage de port.

Naviguez sur les six fiches et le mini-jeu pour vous assurer que tout le contenu est servi correctement.

Toutes les pages s'affichent identiquement à l'étape 1. Le mini-jeu p5.js s'anime correctement (la bibliothèque p5 est chargée depuis un CDN externe, donc une connexion Internet est nécessaire à la première ouverture).
06

Encapsuler dans trois scripts d'usage

Personne ne devrait avoir à mémoriser docker build ou docker run pour utiliser votre travail. Trois petits scripts bash font le pont.

Indications

Trois fichiers à créer (en kebab-case, exécutables) :

  • construire.sh - reproduit l'étape 03
  • demarrer.sh - reproduit l'étape 04
  • arreter.sh - arrête et supprime le container

Chaque script doit :

  • Commencer par la ligne shebang #!/bin/bash et set -e (arrêt à la première erreur).
  • Déclarer ses variables en tête (nom d'image, nom de container, port) en mixedCase. Aucune valeur codée en dur dans le corps du script.
  • Afficher un message coloré au début ([info]) et à la fin ([ok]) - voir vos cours bash précédents pour les codes ANSI.
  • Pour demarrer.sh : gérer le cas où un container du même nom existe déjà (le piège de l'étape 4).

Squelette de demarrer.sh :

demarrer.sh - squelette
#!/bin/bash
set -e

# Variables
nomImage="votre-nom"
nomContainer="votre-nom-en-marche"
portHote="8080"

# Si un container du même nom existe, le retirer
[ logique de nettoyage ]

# Démarrer
docker run [options] "$nomImage"

echo "[ok] Encyclopédie disponible à http://localhost:$portHote/"

Une fois écrits, rendez-les exécutables : chmod +x *.sh.

Les trois scripts existent, sont exécutables, et la séquence ./construire.sh ; ./demarrer.sh démarre l'encyclopédie sans intervention manuelle. ./arreter.sh la stoppe proprement.
07

Finaliser le README et le .dockerignore

Documenter votre travail pour un lecteur qui n'aurait pas suivi le cours. Et exclure du contexte de build ce qui n'a rien à y faire.

.dockerignore

Fichier au même niveau que le Dockerfile. Liste, ligne par ligne, les fichiers à exclure du contexte de build (un peu comme un .gitignore). À exclure au minimum :

  • Les scripts .sh (ils ne servent pas dans l'image)
  • Le README.md
  • Les éventuelles captures capture-*.png
  • Le .dockerignore lui-même
  • Les fichiers cachés du système d'exploitation (.DS_Store, Thumbs.db)

README.md

Trois sections obligatoires (voir énoncé Principe 05) :

  • Ce que c'est : un paragraphe qui présente le pavillon, le contenu, l'image Docker.
  • Comment lancer : la séquence des trois scripts.
  • Ce qu'on voit : URL d'accès, captures d'écran (encyclopédie + mini-jeu).

Bonus : section Difficultés rencontrées qui raconte ce qui a coincé et comment vous avez résolu. Cette section a une vraie valeur pédagogique pour vous-même et pour vos collègues qui pourraient lire votre travail.

Quelqu'un qui n'a pas vu votre travail peut, en suivant uniquement votre README, faire tourner votre encyclopédie sur son poste. git status dans votre dépôt affiche tous les fichiers attendus.

Trois défis optionnels

Défi A - Réduire la taille de l'image

Mesurez la taille de votre image avec docker images. Pouvez-vous la réduire en utilisant un .dockerignore plus strict ? En supprimant les fichiers inutiles avant COPY ?

Défi B - Configuration Apache personnalisée

Apache écoute sur le port 80, sert /usr/local/apache2/htdocs/. Pouvez-vous changer ces valeurs en remplaçant le fichier httpd.conf avec votre propre version ? Indice : autre instruction COPY.

Défi C - Healthcheck

L'instruction Docker HEALTHCHECK permet à Docker de surveiller périodiquement votre container. Ajoutez-en un qui vérifie que la page d'accueil répond avec un code 200.