Empaqueter et exécuter le menu du café

DockerBeginner
Pratiquer maintenant

Introduction

LITTLE HOUR possède un menu de café complet, que son établissement éphémère du week-end doit aussi proposer. Une page d'accueil ne suffit pas : les clients ont besoin des détails des boissons, des prix, des illustrations locales et des horaires. Votre mission est de livrer cette expérience complète dans une image Docker.

Vous empaquetterez les fichiers fournis, exécuterez votre image, puis démarrerez un nouveau conteneur pour vérifier le véritable site. Vous n'écrirez pas de code applicatif et n'installerez pas Docker. Une connaissance élémentaire du terminal suffit ; Docker, les chemins, les ports et les commandes sont expliqués au fil des opérations. Le café, les produits, les prix et les adresses sont fictifs.

Utilisez Workstation pour les commandes, Reference Menu pour la maquette fournie, Your Menu pour votre conteneur et Topology pour la carte de l'environnement. Your Menu devient accessible après le démarrage du conteneur à l'étape 2 ; il peut être indisponible avant. Chaque unité démarre indépendamment.

Construire une image du menu complet

Vous allez comprendre les besoins du café et construire une image contenant l'ensemble du site destiné aux clients. Commencez dans Reference Menu.

Découvrir l'expérience client

La page d'accueil présente LITTLE HOUR. Sous A few good favourites, ouvrez Flat white. Sa fiche indique $4.00, la portion et les allergènes. Suivez Find us pour lire les horaires, puis sélectionnez LITTLE HOUR pour revenir à l'accueil. Ces liens et illustrations font partie de la livraison ; ce ne sont pas des décorations facultatives.

Référence du menu complet de LITTLE HOUR

La référence est préparée sur le port 8082. Elle reste accessible même si votre conteneur est arrêté : elle ne prouve donc pas que vous avez livré le site.

Trouver les fichiers à livrer

Passez à Workstation. Le terminal démarre dans /home/labex/project/cafe-menu. pwd affiche le répertoire courant ; ls en énumère le contenu :

pwd
/home/labex/project/cafe-menu
ls

Vous devez trouver menu, brand et notes. menu/ contient les pages client ; brand/, leur feuille de style et leurs illustrations. notes/ contient des documents de l'auteur qui ne doivent pas apparaître dans le menu public. Ne modifiez pas les fichiers fournis.

Une adresse du site correspond à un chemin d'URL. Le serveur associe /menu/flat-white.html à un fichier sous son répertoire public. Le dossier source extérieur menu/ contient un autre répertoire menu/ pour ces fiches. Examinez les deux groupes de sources :

ls menu
ls brand

Les pages comprennent index.html, visit.html, 404.html et le répertoire des fiches. Les fichiers de marque comprennent site.css et trois illustrations .svg. SVG est un format d'image. Les pages attendent tous ces fichiers sous /assets/ sur le site en fonctionnement.

Écrire la recette d'empaquetage

Docker exécute des programmes dans des conteneurs. Une image est le paquet enregistré qui sert à créer un conteneur ; un conteneur est une instance de cette image, en cours d'exécution ou arrêtée. Docker est déjà installé. L'image préparée menu-base:1 comprend Nginx, le serveur web, et sa configuration des pages manquantes. Son répertoire public est /usr/share/nginx/html/. Elle ne contient pas encore votre menu.

Un Dockerfile décrit la construction de l'image. FROM choisit l'image de base. COPY copie les fichiers fournis dans l'image : le premier chemin est une source relative au répertoire de construction, le second une destination dans l'image. Copier le contenu d'un répertoire vers la bonne destination conserve les liens existants. Cela ne relie pas le conteneur en fonctionnement au répertoire source.

Vous utiliserez deux copies explicites : les pages dans le répertoire public et les fichiers de marque dans son répertoire assets/. Les notes restent ainsi exclues. La base Nginx définit déjà la commande de démarrage du serveur ; inutile d'en ajouter une.

cat > Dockerfile remplace ce fichier par le texte suivant. Le DOCKERFILE entre guillemets commence un here-document : collez tout le bloc, y compris le dernier DOCKERFILE sur sa propre ligne. Les guillemets conservent le contenu littéral. Exécutez ceci dans Workstation :

cat > Dockerfile <<'DOCKERFILE'
FROM menu-base:1
COPY menu/ /usr/share/nginx/html/
COPY brand/ /usr/share/nginx/html/assets/
DOCKERFILE

cat peut également afficher un fichier. Relisez la recette et comparez les deux destinations avant la construction :

cat Dockerfile

Construire l'image enregistrée

docker build lit la recette et crée une image. -t lui donne un nom et une étiquette : little-hour-menu est le nom et 1 l'étiquette de version choisie. Le point final désigne le répertoire courant comme contexte de construction, c'est-à-dire les fichiers utilisables par Docker. Une étiquette est un repère pratique, pas une preuve d'exhaustivité.

docker build -t little-hour-menu:1 .

La sortie varie selon la version de Docker. La commande doit réussir et identifier little-hour-menu:1. Si un COPY échoue, vérifiez pwd, les noms des sources et le Dockerfile enregistré ; corrigez la recette et relancez la même construction. Ne remplacez pas les pages et ne copiez pas tout le projet pour masquer une erreur de chemin.

Vous disposez maintenant d'une image de livraison enregistrée. Aucun conteneur du menu ne fonctionne encore.

Publier l'image comme menu en fonctionnement

Vous allez créer votre propre conteneur et ouvrir son site. Commencez dans Workstation.

Relier un conteneur à un port web

Nginx écoute sur le port 80 dans le conteneur. Un port identifie un service réseau. Nous le publierons sur le port 8081 de cette instance pour que Your Menu puisse y accéder. Cela ne change pas le site de référence sur le port 8082.

docker run crée et démarre un conteneur. -d le lance en arrière-plan pour garder le terminal disponible. --name cafe-menu lui attribue un nom réutilisable. -p 8081:80 relie le port 8081 du laboratoire au port 80 du conteneur. Le dernier argument choisit l'image construite. Aucun répertoire source ni volume n'est monté :

docker run -d --name cafe-menu -p 8081:80 little-hour-menu:1

La longue sortie est l'identifiant du nouveau conteneur ; elle change à chaque lancement. Un identifiant ne prouve pas que l'application reste active. docker ps énumère les conteneurs en fonctionnement :

docker ps

Repérez cafe-menu, l'image little-hour-menu:1 et une correspondance comprenant 8081->80/tcp. D'autres conteneurs de formation peuvent apparaître ; laissez-les intacts.

Si le nom est déjà utilisé, ne lancez pas plusieurs copies sous d'autres noms. Retrouvez votre conteneur avec docker ps et poursuivez s'il est correct. S'il s'est arrêté ou si le port est incorrect, docker logs cafe-menu affiche les messages du serveur. Pour remplacer uniquement votre menu statique, docker rm -f cafe-menu arrête et supprime ce conteneur nommé, tout en conservant l'image et les sources.

Après avoir corrigé la recette ou le port, reconstruisez si nécessaire et répétez le docker run initial. N'utilisez la suppression que pour un remplacement nécessaire, pas après chaque démarrage réussi.

Ouvrir votre livraison

Passez à Your Menu. Si vous l'avez ouvert avant le démarrage, rechargez-le. LITTLE HOUR doit apparaître avec sa mise en page et ses illustrations complètes. Cette page vient du port 8081, et non du Reference Menu fourni.

Menu servi par le conteneur de l'apprenant

Ouvrez Flat white sous A few good favourites. La fiche doit afficher illustration, prix, portion et allergènes. Suivez Find us, confirmez les horaires, puis sélectionnez LITTLE HOUR pour revenir à l'accueil dans le même onglet. Une page d'accueil sans style ou une illustration cassée ne constitue pas une livraison complète.

Passez à Topology. Il peut maintenant afficher Menu homepage reachable. Cette observation reste limitée : elle ne valide pas toutes les pages. Vous allez ensuite vérifier l'indépendance de la livraison et les autres parcours clients.

Vérifier un nouveau conteneur et tout le site

Vous allez démarrer une nouvelle instance de l'image et vérifier toute l'expérience sans dépendre du répertoire de l'auteur. Commencez dans Workstation.

Distinguer l'image de son conteneur

L'image reste enregistrée après la suppression d'un conteneur. Ce site ne reçoit pas de données clients et n'a pas de base de données ; remplacer ce conteneur ne détruit donc pas de données commerciales. Cette distinction serait importante pour une application avec état.

Supprimez uniquement cafe-menu avec la commande de remplacement de l'étape 2 :

docker rm -f cafe-menu

Démarrez une nouvelle instance avec le même port publié :

docker run -d --name cafe-menu -p 8081:80 little-hour-menu:1

Un identifiant différent apparaît. Vous n'avez ni reconstruit l'image ni monté le répertoire de l'auteur : la nouvelle instance utilise les fichiers déjà empaquetés.

docker inspect affiche la configuration réelle du conteneur. --format sélectionne un champ plutôt que l'objet entier. Le modèle entre guillemets convertit sa liste de montages en JSON :

docker inspect cafe-menu --format '{{json .Mounts}}'
[]

La liste vide indique l'absence de montages de répertoires hôtes et de volumes. C'est la preuve recherchée : les sources ne comblent pas discrètement les lacunes de la livraison. Les montages ont des usages légitimes ailleurs ; cette tâche exige un menu statique autonome.

Tester les véritables parcours clients

Passez à Your Menu et rechargez. Sélectionnez les trois favoris tour à tour. Flat white coûte $4.00, Espresso $3.00, et Iced oat latte $4.75. Chaque fiche doit afficher la bonne image et les bonnes informations. Revenez à l'accueil avec LITTLE HOUR après chacune. Suivez Find us et confirmez les horaires de semaine 08:00–17:00. Restez dans Your Menu : Reference Menu teste un autre serveur.

Fiche complète d'une boisson dans le menu livré

Passez à Workstation. HTTP est le protocole de requêtes et réponses du navigateur. Une réponse réussie porte le statut 200 ; 404 signifie que la ressource n'a pas été trouvée. Une erreur de connexion est différente : aucune réponse exploitable du serveur n'a été reçue.

curl envoie une requête. -sS masque la progression mais montre les erreurs de connexion. -o /dev/null ignore le corps. -w affiche le format entre guillemets : %{http_code} est le statut et \n termine la ligne. Dans Workstation, 127.0.0.1 désigne cette instance ; n'exécutez pas ces requêtes depuis le terminal de votre ordinateur.

curl -sS -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8081/menu/flat-white.html

La sortie attendue est 200. Le navigateur a également confirmé le contenu et l'illustration ; un 200 contenant une mauvaise page ne suffirait pas.

Les notes de l'auteur doivent rester privées. Demandez leur URL possible :

curl -sS -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8081/notes/launch-notes.txt

Attendez-vous à 404. C'est le résultat souhaité pour la limite du paquet. Curl termine normalement car nous ne lui avons pas demandé d'échouer sur les réponses d'erreur HTTP. Arrêter tout le site ne satisferait pas les vérifications du menu.

Revenez à Your Menu et sélectionnez LITTLE HOUR pour retrouver l'accueil. Le menu normal doit fonctionner après le rejet de la demande de notes. Vous avez vérifié le contenu client complet et une réponse appropriée à une ressource qui ne faisait pas partie de la livraison.

Résumé

Vous avez construit une image complète du menu statique, publié le port du serveur et démarré un nouveau conteneur sans montage des sources. Vous avez vérifié pages, images et informations de visite, tout en excluant les notes du site public. Le défi indépendant suivant applique ces décisions à une boulangerie dont les sources sont organisées autrement.