Introduction
Afterlight est une petite exposition communautaire. Les visiteurs laissent leurs impressions dans son livre d’or ; remplacer l’application ne doit pas effacer leurs contributions. Vous essaierez d’abord une copie jetable, puis reconnecterez les données existantes du véritable livre pour conserver aussi les nouveaux messages lors d’un remplacement.
Les bases du terminal suffisent. Docker, Compose, les chemins de données, l’édition et HTTP sont expliqués au moment utile. L’application et les outils sont préparés ; vous n’écrivez pas de code de base de données. Tous les visiteurs sont fictifs.
Utilisez Workstation pour les commandes, Exhibition pour le vrai livre et Practice Copy uniquement pour l’expérience volontaire de perte de données. Les deux sites utilisent des conteneurs et ports distincts. Chaque unité démarre indépendamment ; le site, les libellés et les sorties restent en anglais.
Donnez un emplacement propre aux données des visiteurs
Dans cette étape, vous essayerez l’exposition, observerez la perte de données jetables et reconnecterez le vrai livre à ses enregistrements existants. Commencez dans Practice Copy, une exposition séparée et volontairement jetable, sans vrais visiteurs.
Essayez le parcours normal d’un visiteur
Ouvrez About the exhibition, lisez les horaires, puis sélectionnez The wall. Sélectionnez Leave a contribution, saisissez Visitor dans Your name et A small practice note. dans Your message, puis Add to the wall. La page de détail affiche votre contribution. Sélectionnez Back to the wall pour voir sa carte. Les détails et le formulaire font partie du fonctionnement normal à préserver.
Observez ce qu’un conteneur ne conserve pas
Passez à Workstation, initialement dans /home/labex/project/afterlight. Un chemin désigne un fichier ou répertoire ; ce chemin absolu part de la racine / du système de fichiers. pwd affiche le répertoire courant :
pwd
Docker exécute l’application dans un conteneur, un processus possédant sa propre vue du système de fichiers. Une image est le paquet préparé de l’application. afterlight:1 contient le programme et le design, mais pas les contributions ultérieures des visiteurs. Les données écrites uniquement dans la couche modifiable du conteneur disparaissent quand celui-ci est supprimé.
Supprimez seulement le conteneur d’exercice jetable. docker rm le supprime ; -f l’arrête auparavant si nécessaire :
docker rm -f afterlight-scratch
docker run crée un nouveau conteneur à partir de l’image sauvegardée. -d le laisse fonctionner en arrière-plan et --name lui attribue un nom. Un port identifie un service réseau : -p 8082:8081 transmet le port 8082 du laboratoire au port applicatif 8081 dans le conteneur.
docker run -d --name afterlight-scratch -p 8082:8081 afterlight:1
La longue sortie est l’ID du nouveau conteneur. Dans Practice Copy, sélectionnez The wall et rechargez. Votre carte d’essai a disparu. Ne rechargez pas sans cesse son ancienne URL de détail : cette entrée n’existe plus. Cette perte concerne uniquement la copie jetable.
Raccordez les données existantes du livre
Passez à Exhibition. Son mur vide utilise la même application, mais son raccordement aux données manque actuellement. La contribution originale d’Iris est conservée dans un volume Docker préparé nommé afterlight_messages. Votre tâche principale est de reconnecter ces données et de préserver les contributions suivantes lors du remplacement de l’application.
Un volume nommé est un stockage géré par Docker, indépendant d’un conteneur particulier. Un montage le raccorde à un chemin dans l’application. Celle-ci écrit son fichier SQLite dans /data/wall.sqlite3. SQLite conserve les enregistrements dans un fichier ; aucune connaissance SQL ni programmation applicative n’est nécessaire ici.
Passez à Workstation. cat affiche un fichier :
cat compose.yaml
Compose lit cette configuration YAML pour créer le service. YAML utilise une indentation avec des espaces pour exprimer l’imbrication. services regroupe les applications ; wall est ce service. image, container_name et ports décrivent le paquet, le nom et la correspondance réseau. environment fournit les paramètres applicatifs. RELEASE sélectionne une édition de présentation ; les deux éditions utilisent le même format de données.
Vous ajouterez un montage et une déclaration de volume. messages:/data raccorde le volume logique messages au répertoire /data du conteneur ; la déclaration de premier niveau lui donne le nom Docker existant afterlight_messages. external: true demande à Compose de réutiliser le volume préparé au lieu d’en créer un autre. Un nom erroné entraîne une erreur de volume introuvable : corrigez le nom ; ne supprimez pas l’original et ne créez pas de remplacement vide. Déclarer du stockage sans le monter dans le service ne protège pas les données.
cat > compose.yaml remplace cette configuration. Le YAML entre guillemets ouvre un here-document : collez tout le bloc, y compris le dernier YAML seul sur sa ligne. Les guillemets préservent le contenu littéral ; respectez les espaces montrés.
cat > compose.yaml <<'YAML'
name: afterlight
services:
wall:
image: afterlight:1
container_name: afterlight-wall
ports:
- "8081:8081"
environment:
MODE: guestbook
RELEASE: "1"
volumes:
- messages:/data
volumes:
messages:
name: afterlight_messages
external: true
YAML
docker compose config -q valide silencieusement la configuration. Aucune sortie signifie qu’elle est correctement interprétée ; une erreur impose de corriger l’indentation ou l’orthographe et de réessayer avant application.
docker compose config -q
docker compose up -d crée ou remplace le service en arrière-plan pour respecter le fichier. Les volumes nommés sont conservés. Attendez la fin :
docker compose up -d
Dans Exhibition, revenez à The wall et rechargez. A beautiful place to pause., la contribution d’Iris, doit apparaître. Ouvrez sa carte, puis revenez. Cet enregistrement existant a été reconnecté depuis sa vraie base ; ce n’est pas un exemple régénéré à chaque démarrage.
Écrivez une contribution et identifiez son stockage
Dans cette étape, vous ajouterez une vraie contribution et relierez le résultat visible au montage effectif. Commencez dans Exhibition. Conservez la carte originale d’Iris.
Sélectionnez Leave a contribution. Saisissez Mira dans Your name et exactement The light stays with us. dans Your message, puis Add to the wall. Le détail doit afficher les deux valeurs. Sélectionnez Back to the wall : Iris et Mira doivent être présentes.
Passez à Workstation. docker inspect lit la configuration effective du conteneur. --format choisit un champ ; les apostrophes préservent les accolades littérales. Ce modèle affiche la liste des montages en JSON :
docker inspect afterlight-wall --format '{{json .Mounts}}'
Repérez "Type":"volume", "Name":"afterlight_messages", "Destination":"/data" et "RW":true. RW indique un accès en lecture et écriture. Un nom dans un fichier n’est qu’une intention ; ici se trouve la connexion réelle du conteneur actif.
docker volume ls liste les volumes disponibles :
docker volume ls
D’autres volumes de la plateforme peuvent exister ; laissez-les intacts. Si le nom d’un volume externe est mal écrit, Compose s’arrête avec une erreur de volume introuvable. Corrigez le nom dans le fichier et appliquez à nouveau, sans créer de remplacement vide. Si vous raccordez accidentellement un nouveau volume vide, un mur vide ne prouve pas la suppression des enregistrements d’origine. Conservez le volume original, rétablissez afterlight_messages dans compose.yaml, validez et appliquez à nouveau. Ne supprimez pas les volumes comme raccourci de dépannage. docker compose down -v supprime les volumes gérés par Compose et leurs données, mais conserve ceux déclarés external: true. Cela ne rend pas sûre la suppression manuelle d’un volume externe.
Tenez compte de chaque catégorie de données
Une contribution peut dépendre de plusieurs répertoires. Ce livre stocke le texte dans /data. Un mur de photos stocke aussi les octets des images envoyées dans /photos ; sa base conserve chaque légende et le nom du fichier associé. Ne garder que la légende peut laisser une image cassée.
| Chemin du conteneur | Contenu | À conserver au remplacement ? |
|---|---|---|
/data |
Enregistrements et relations entre photos et légendes | Oui |
/photos sur le mur de photos |
Photographies envoyées | Oui, séparément de la base |
/app |
Programme, design et exemples préparés dans l’image | Recréés depuis l’image fournie |
Plusieurs répertoires utilisent la même syntaxe : une entrée de montage dans le service et une déclaration de volume pour chacun. Ne montez pas un volume vide sur /app, car il masquerait le programme. Les fichiers en cache ou fournis dans l’image ne sont pas automatiquement des données de visiteurs.
Le défi indépendant utilise un formulaire d’envoi de photos. Ses liens River et Garden téléchargent les images PNG d’exercice sur votre ordinateur. Enregistrez l’image demandée, choisissez-la dans Photograph (PNG), remplissez le nom et la légende, puis Add to the wall. Le navigateur envoie les octets choisis ; aucun outil d’envoi en ligne de commande n’est nécessaire.
Remplacez l’application en gardant l’exposition utilisable
Dans cette étape, vous remplacerez l’application par l’édition 2, conserverez les deux contributions et en accepterez une nouvelle. Commencez dans Workstation.
nano est un éditeur de texte en terminal. Ouvrez la configuration :
nano compose.yaml
Avec les flèches, changez seulement RELEASE: "1" en RELEASE: "2". Gardez montages, image et ports. Enregistrez avec Ctrl+O, Enter, puis quittez avec Ctrl+X. Lisez la configuration sauvegardée et validez-la :
cat compose.yaml
docker compose config -q
docker compose ps -q wall affiche l’ID actuel du conteneur. Retenez-le ou conservez la sortie pour comparer ; aucun rapport n’est demandé :
docker compose ps -q wall
Appliquez le changement d’édition. --force-recreate demande un nouveau conteneur même si le reste de la configuration ne change pas :
docker compose up -d --force-recreate
docker compose ps -q wall
L’ID doit être différent. Il s’agit d’un remplacement, pas seulement d’un redémarrage. Si le démarrage échoue, docker compose logs wall affiche les messages ; corrigez la configuration, validez et répétez up -d. Gardez les volumes originaux et ne supprimez pas d’autres conteneurs.
Dans Exhibition, sélectionnez The wall et rechargez. Le pied de page doit indiquer Edition 2. Iris et Mira doivent être conservées. Ouvrez chaque carte puis revenez. Saisissez Leon et exactement Back for another look. dans le formulaire et envoyez. Revenez au mur : les trois contributions fonctionnent dans l’application de remplacement.
Contrôlez le service autant que les données
Passez à Workstation. HTTP est le protocole de requêtes et réponses du navigateur. Le statut 200 indique une réponse réussie ; 404, une ressource introuvable. Un échec de connexion signifie qu’aucune réponse du serveur n’est arrivée.
curl envoie une requête. -sS masque la progression mais affiche les erreurs de connexion ; -o /dev/null ignore le corps. -w affiche le format entre apostrophes : %{http_code} est le statut et \n termine la ligne. Dans Workstation, 127.0.0.1 désigne cette instance et le port 8081 correspond à Exhibition. Exécutez :
curl -sS -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8081/about
Le résultat attendu est 200. Dans Exhibition, ouvrez About the exhibition, confirmez les horaires puis sélectionnez The wall. Un statut réussi ne prouve pas à lui seul le bon contenu ou la conservation des contributions.
Le volume protège contre ce remplacement de conteneur. Ce n’est pas une sauvegarde indépendante et il ne protège pas contre la suppression du volume ou la perte de l’hôte. Gardez les fichiers applicatifs reproductibles et stockez séparément les données des visiteurs.
Résumé
Vous avez distingué les fichiers jetables des données persistantes, raccordé le volume existant et conservé les messages originaux et nouveaux lors d’un remplacement. Une nouvelle contribution et les pages de l’exposition fonctionnent toujours. Appliquez ensuite cette méthode aux légendes et aux photos stockées séparément.



