OS de votre poste :
Parcours Linux · Bash (.sh)
Module 05 · Docker DevOps · TP 02

TP-02 — Construire et mettre à jour une image web

Modifier les fichiers du projet ne met pas automatiquement à jour un conteneur existant. Vous construirez une image NGINX à partir d’un Dockerfile, modifierez la page web, puis reconstruirez l’image et remplacerez le conteneur pour publier la nouvelle version.

Objectifs et cours associés

Construire une image à partir d’un Dockerfile et observer son utilisation par un conteneur.

Pour réviser les notions utilisées dans ce TP :

Préparation

Prérequis

Configuration pour Linux

Compte student, membre de devops, avec accès sudo ; terminal Linux et systemd.

Guide : Préparer Linux pour les TP

Moteur Docker et Compose disponibles.

Guide : Préparer Docker pour les TP

Dans le terminal Linux, entrer dans student si nécessaire :

Terminal Linux

su - student

Si vous êtes déjà connecté avec student, conserver cette session.

Dépendances

Configuration pour Linux

Utiliser le moteur préparé par le guide commun :

Terminal Linux

docker version
docker compose version

Client et Server doivent être disponibles.
Les services applicatifs seront lancés par les commandes du TP ; ne pas installer les serveurs web ou bases de données sur le poste.

Ressources et point de départ

Télécharger les ressources, puis les extraire dans le dossier du TP.
Les chemins désignent le poste du laboratoire, pas le serveur du wiki.

Terminal Linux

# Créer le dossier indiqué pour les fichiers de travail du TP.
mkdir -p ~/devops-formation/tp-05-02

# Se placer dans ce dossier pour préparer les dépendances.
cd ~/devops-formation/tp-05-02

unzip tp-02.zip
ls -la

Lire les fichiers du TP

Avec Visual Studio Code et la commande code disponibles, ouvrez le dossier préparé ci-dessus :

Terminal Linux — Bash

cd ~/devops-formation/tp-05-02
code .

Dans VS Code, lisez Dockerfile, .dockerignore et index.html.
Repérez l’image NGINX choisie par FROM et la page ajoutée par COPY.

Étape 1 : Créer et taguer une image à partir d’un Dockerfile

Avec le compte de travail, créer le dossier du TP puis s’y placer :

Terminal Linux

# Créer le dossier indiqué pour les fichiers de travail du TP.
mkdir -p ~/devops-formation/tp-05-02

# Se placer dans le dossier requis pour les commandes suivantes.
cd ~/devops-formation/tp-05-02

Depuis le dossier du TP, construisez l’image décrite par le Dockerfile et attribuez-lui le nom asd-tp02-web et le tag 1.0.
Cette image utilisera NGINX et contiendra la page index.html fournie, grâce à l’instruction COPY.

Terminal — PowerShell (Windows) ou Bash (Linux)

# Afficher le dossier courant.
pwd

# Construire et taguer l’image à partir du Dockerfile et du contexte indiqués.
docker build --progress=plain -t asd-tp02-web:1.0 .

Conclusion : Le build utilise le Dockerfile et le contexte fourni pour produire une image identifiée par son tag ; il ne démarre pas encore le serveur web.

Si vos observations ne permettent pas de confirmer cette conclusion, comparez le résultat aux indications d’Observer et reprenez les commandes de cette manipulation. Relisez au besoin : 3.3 Dockerfile ; 3.4 Contexte ; 3.2 Couches et cache.

Comprendre la construction : Le point final de docker build désigne le répertoire courant comme contexte de construction fourni au moteur par le client Docker.
COPY utilise ce contexte pour trouver index.html et le copie dans /usr/share/nginx/html/index.html dans l’image.
.dockerignore exclut des fichiers de ce contexte.

Étape 2 : Créer et démarrer un conteneur à partir de la première image

Créez et démarrez un conteneur à partir de asd-tp02-web:1.0.
Publiez le port 80 du conteneur sur le port 8082 du poste, accessible uniquement sur 127.0.0.1, puis interrogez la page.
Comparez ensuite l’identifiant de l’image taguée avec celui de l’image utilisée par le conteneur.

Commandes selon votre OS

Terminal — PowerShell (Windows) ou Bash (Linux)

# Créer et démarrer un conteneur avec l’image, les ports et les montages indiqués.
docker run -d --name asd-tp02-web -p 127.0.0.1:8082:80 asd-tp02-web:1.0

# Envoyer la requête HTTP et examiner la réponse du service ciblé.
curl -f http://127.0.0.1:8082

# Lire les métadonnées de l’image pour contrôler son identité ou sa construction.
docker image inspect asd-tp02-web:1.0 --format '{{.Id}}'

# Lire les métadonnées de la ressource Docker pour vérifier son état ou sa configuration.
docker inspect asd-tp02-web --format '{{.Image}}'

À observer : La page affiche Version 1.
Les deux identifiants correspondent à la même image avant la reconstruction de l’étape suivante.
docker image inspect affiche l’identifiant de l’image taguée ; docker inspect affiche celui de l’image utilisée par le conteneur.

Conclusion : Le conteneur exécute l’image construite et publie le port choisi ; la réponse HTTP permet de vérifier le contenu réellement servi.

Si vos observations ne permettent pas de confirmer cette conclusion, comparez le résultat aux indications d’Observer et reprenez les commandes de cette manipulation. Relisez au besoin : 3.3 Dockerfile ; 3.4 Contexte ; 3.2 Couches et cache.

Étape 3 : Modifier la page et reconstruire l’image

Remplacez Version 1 par Version 2 dans index.html, puis reconstruisez l’image avec le même tag.
Observez les étapes mises en cache et comparez les identifiants de la nouvelle image et de celle utilisée par le conteneur existant.
Interrogez enfin la page servie par ce conteneur.

Commandes selon votre OS

Terminal Linux — Bash

# Remplacer le contenu ciblé dans le fichier pour préparer la nouvelle version.
sed -i 's/Version 1/Version 2/' index.html

# Construire et taguer l’image à partir du Dockerfile et du contexte indiqués.
docker build --progress=plain -t asd-tp02-web:1.0 .

# Lire les métadonnées de l’image pour contrôler son identité ou sa construction.
docker image inspect asd-tp02-web:1.0 --format '{{.Id}}'

# Lire les métadonnées de la ressource Docker pour vérifier son état ou sa configuration.
docker inspect asd-tp02-web --format '{{.Image}}'

# Envoyer la requête HTTP et examiner la réponse du service ciblé.
curl -f http://127.0.0.1:8082

À observer : La reconstruction crée une nouvelle image sans remplacer le conteneur existant.
Celui-ci sert encore Version 1.

Conclusion : Reconstruire après modification produit une image mise à jour ; le cache réutilise les étapes dont les entrées n’ont pas changé.

Si vos observations ne permettent pas de confirmer cette conclusion, comparez le résultat aux indications d’Observer et reprenez les commandes de cette manipulation. Relisez au besoin : 3.3 Dockerfile ; 3.4 Contexte ; 3.2 Couches et cache.

À retenir : Reconstruire une image ne signifie pas que le conteneur en cours l’utilise.
Il conserve l’image avec laquelle il a été créé ; nous le recréerons à l’étape suivante.

Pourquoi regarder le cache ? Les mentions CACHED montrent les étapes que Docker a pu réutiliser pour accélérer la construction.
Comme index.html a changé, COPY doit être réexécutée.
Observer le cache explique comment l’image est reconstruite ; comparer les identifiants et la réponse HTTP montre quelle image le conteneur utilise.

Étape 4 : Recréer le conteneur avec la nouvelle image

Supprimez le conteneur existant, puis recréez-le à partir du tag asd-tp02-web:1.0, qui désigne désormais la nouvelle image.
Interrogez la page et comparez à nouveau les identifiants.

Commandes selon votre OS

Terminal — PowerShell (Windows) ou Bash (Linux)

# Supprimer les conteneurs nommés ; leur couche inscriptible sera perdue.
docker rm -f asd-tp02-web

# Créer et démarrer un conteneur avec l’image, les ports et les montages indiqués.
docker run -d --name asd-tp02-web -p 127.0.0.1:8082:80 asd-tp02-web:1.0

# Envoyer la requête HTTP et examiner la réponse du service ciblé.
curl -f http://127.0.0.1:8082

# Lire les métadonnées de la ressource Docker pour vérifier son état ou sa configuration.
docker inspect asd-tp02-web --format '{{.Image}}'

# Lire les métadonnées de l’image pour contrôler son identité ou sa construction.
docker image inspect asd-tp02-web:1.0 --format '{{.Id}}'

À observer : Le nouveau conteneur sert Version 2 et utilise la nouvelle image.

Conclusion : Le conteneur existant doit être remplacé pour utiliser la nouvelle image ; reconstruire l’image ne change pas les fichiers du conteneur déjà créé.

Si vos observations ne permettent pas de confirmer cette conclusion, comparez le résultat aux indications d’Observer et reprenez les commandes de cette manipulation. Relisez au besoin : 3.3 Dockerfile ; 3.4 Contexte ; 3.2 Couches et cache.

Vérification finale

  • Deux réponses HTTP différentes relevées.
  • IDs image/conteneur comparés avant et après recréation.

Retenir

Réponses aux trois repères du TP
  • Le contexte fixe les sources accessibles à COPY.
  • Le cache évite de recalculer une étape inchangée.
  • Un conteneur conserve son image de création.

TP mentionnés dans les commandes : TP-08

Retour au module · Documentation Docker

Nettoyage

Dépendances

Configuration pour Linux

Linux : exécuter le nettoyage ciblé dans le terminal relié au Docker Engine natif du TP.
Ne pas toucher aux ressources d’un autre contexte.

Nettoyage ciblé et reprise

Commandes selon votre OS

docker rm -f asd-tp02-web

# Conserver l’image pour TP-08, ou la supprimer explicitement :
# docker image rm asd-tp02-web:1.0

Vos fichiers restent dans ~/devops-formation/tp-05-02.

Supprimez uniquement les ressources nommées dans les commandes de ce TP.

Guide : Préparer Docker pour les TP.
Retirer un moteur supprime ou rend indisponibles ses ressources : sauvegarder et vérifier les usages avant de décider.

Conservez Docker pour les TP suivants.

Prérequis

Configuration pour Linux

Conserver student, devops et l’environnement pour les TP suivants.
Le retrait complet reste facultatif, après nettoyage des dépendances et sauvegarde des travaux.

Guide : Préparer Linux pour les TP

Conserver le moteur Docker pour la suite.

Guide : Préparer Docker pour les TP

exit quitte la session student et revient au compte initial si vous avez utilisé su - student.
Le système Linux du poste reste installé.