Einführung
LITTLE HOUR hat eine vollständige Café-Speisekarte. Für den Pop-up-Stand am Wochenende wird dieselbe Website gebraucht. Eine Startseite allein genügt nicht: Gäste brauchen Getränkedetails, Preise, lokale Illustrationen und Öffnungszeiten. Du sollst dieses gesamte Angebot in einem Docker-Image ausliefern.
Du verpackst die bereitgestellten Dateien, führst dein Image aus und startest anschließend einen neuen Container, um die tatsächliche Website zu prüfen. Du schreibst keinen Anwendungscode und installierst Docker nicht. Grundkenntnisse im Terminal reichen aus; Docker, Pfade, Ports und Befehle werden bei ihrer Verwendung erklärt. Café, Produkte, Preise und Adressen sind erfunden.
Verwende Workstation für Terminalbefehle, Reference Menu als Designvorlage, Your Menu für deinen laufenden Container und Topology als Übersicht. Your Menu funktioniert erst nach dem Containerstart in Schritt 2 und kann vorher nicht erreichbar sein. Jede Einheit beginnt unabhängig.
Ein vollständiges Menü-Image bauen
In diesem Schritt lernst du die Anforderungen des Cafés kennen und baust ein Image mit der gesamten Website für die Gäste. Beginne in Reference Menu.
Das Erlebnis der Gäste kennenlernen
Die Startseite stellt LITTLE HOUR vor. Öffne unter A few good favourites den Eintrag Flat white. Die Detailseite zeigt $4.00, Portions- und Allergeninformationen. Über Find us gelangst du zu den Öffnungszeiten, über LITTLE HOUR zurück zur Startseite. Diese Links und Illustrationen gehören zur Lieferung und sind keine optionale Dekoration.

Die Vorlage läuft bereits auf Port 8082. Sie bleibt auch erreichbar, wenn dein Container gestoppt ist, und beweist daher nicht, dass du die Website ausgeliefert hast.
Die auszuliefernden Dateien finden
Wechsle zu Workstation. Das Terminal beginnt in /home/labex/project/cafe-menu. pwd zeigt das aktuelle Verzeichnis, ls dessen Inhalt:
pwd
/home/labex/project/cafe-menu
ls
Du solltest menu, brand und notes finden. menu/ enthält die Kundenseiten, brand/ das Stylesheet und die Illustrationen. notes/ enthält Autorenmaterial und darf nicht im öffentlichen Menü erscheinen. Verändere die bereitgestellten Dateien nicht.
Eine Website-Adresse ist ein URL-Pfad. Der Server ordnet /menu/flat-white.html einer Datei unter seinem öffentlichen Verzeichnis zu. Der äußere Quellordner menu/ enthält ein weiteres Verzeichnis menu/ für diese Detailseiten. Untersuche beide Quellgruppen:
ls menu
ls brand
Zu den Seiten gehören index.html, visit.html, 404.html und das Detailverzeichnis. Die Markendateien enthalten site.css und drei .svg-Illustrationen. SVG ist ein Bildformat. Die Seiten erwarten alle Markendateien unter /assets/ auf der laufenden Website.
Das Verpackungsrezept schreiben
Docker führt Programme in Containern aus. Ein Image ist das gespeicherte Paket zum Erstellen eines Containers; ein Container ist eine laufende oder gestoppte Instanz dieses Images. Docker ist bereits installiert. Das vorbereitete Image menu-base:1 enthält den Webserver Nginx und seine Konfiguration für fehlende Seiten. Sein öffentliches Verzeichnis ist /usr/share/nginx/html/. Dein Café-Menü ist noch nicht enthalten.
Ein Dockerfile beschreibt den Image-Bau. FROM wählt das Basis-Image. COPY kopiert Dateien in das Image: Der erste Pfad bezeichnet eine Quelle relativ zum Bauverzeichnis, der zweite ein Ziel im Image. Werden Verzeichnisinhalte an das richtige Ziel kopiert, bleiben vorhandene Seitenlinks erhalten. Dadurch wird der laufende Container nicht mit deinem Quellverzeichnis verbunden.
Du verwendest zwei ausdrückliche Kopiervorgänge: die Seiten in das öffentliche Verzeichnis und die Markendateien in dessen Unterverzeichnis assets/. So bleiben die Autorennotizen draußen. Die Nginx-Basis definiert bereits den Startbefehl des Servers; du musst keinen ergänzen.
cat > Dockerfile ersetzt die Datei durch den folgenden Text. Das in Anführungszeichen stehende DOCKERFILE beginnt ein Here-Dokument: Füge den ganzen Block einschließlich des abschließenden DOCKERFILE auf einer eigenen Zeile ein. Die Anführungszeichen bewahren den wörtlichen Inhalt. Führe dies in Workstation aus:
cat > Dockerfile <<'DOCKERFILE'
FROM menu-base:1
COPY menu/ /usr/share/nginx/html/
COPY brand/ /usr/share/nginx/html/assets/
DOCKERFILE
cat kann auch eine Datei anzeigen. Lies das gespeicherte Rezept und prüfe beide Ziele vor dem Bau:
cat Dockerfile
Das gespeicherte Image bauen
docker build liest das Rezept und erstellt ein Image. -t vergibt Name und Tag: little-hour-menu ist der Name, 1 unser gewähltes Versionskennzeichen. Der abschließende Punkt wählt das aktuelle Verzeichnis als Build-Kontext, also die beim Bau verfügbaren Dateien. Ein Tag ist eine praktische Bezeichnung, kein Nachweis vollständiger Inhalte.
docker build -t little-hour-menu:1 .
Die Ausgabe hängt von der Docker-Version ab. Der Befehl soll erfolgreich enden und little-hour-menu:1 nennen. Schlägt ein COPY fehl, kontrolliere pwd, Quellnamen und das gespeicherte Dockerfile. Korrigiere das Rezept und baue erneut mit demselben Befehl. Ersetze weder die gelieferten Seiten noch kopiere das ganze Projekt, um einen Pfadfehler zu verdecken.
Dein Auslieferungs-Image ist jetzt gespeichert. Noch läuft kein Menü-Container.
Das Image als laufendes Menü veröffentlichen
Jetzt erstellst du deinen eigenen laufenden Container und öffnest seine Website. Beginne in Workstation.
Einen Container mit einem Website-Port verbinden
Nginx lauscht im Container auf Port 80. Ein Port kennzeichnet einen Netzwerkdienst. Wir veröffentlichen ihn auf Port 8081 dieser Laborinstanz, damit Your Menu ihn erreicht. Die Vorlage auf Port 8082 bleibt davon unberührt.
docker run erstellt und startet einen Container. -d führt ihn im Hintergrund aus, sodass das Terminal verfügbar bleibt. --name cafe-menu vergibt einen später nutzbaren Namen. -p 8081:80 verbindet Port 8081 des Labors mit Port 80 des Containers. Das letzte Argument wählt dein gebautes Image. Es werden weder Quellverzeichnis noch Volume eingebunden:
docker run -d --name cafe-menu -p 8081:80 little-hour-menu:1
Die lange Ausgabe ist die ID des neuen Containers und ändert sich bei jedem Start. Eine ID allein beweist nicht, dass die Anwendung weiterläuft. docker ps zeigt laufende Container:
docker ps
Suche cafe-menu, das Image little-hour-menu:1 und eine Zuordnung mit 8081->80/tcp. Andere Trainingscontainer können ebenfalls erscheinen; lasse sie unverändert.
Ist der Name bereits vergeben, starte nicht viele Kopien mit anderen Namen. Finde deinen Container mit docker ps und fahre fort, wenn er korrekt läuft. Ist er beendet oder der Port falsch zugeordnet, zeigt docker logs cafe-menu die Servermeldungen. Zum Ersetzen nur deines statischen Menüs stoppt und entfernt docker rm -f cafe-menu diesen benannten Container. Image und Quellen bleiben erhalten.
Nach einer Rezept- oder Portkorrektur baust du bei Bedarf erneut und wiederholst den ursprünglichen docker run-Befehl. Verwende den Löschbefehl nur für einen notwendigen Austausch, nicht nach jedem erfolgreichen Start.
Deine eigene Lieferung öffnen
Wechsle zu Your Menu. Falls du es vor dem Containerstart geöffnet hast, lade es neu. LITTLE HOUR sollte mit vollständigem Layout und Illustrationen erscheinen. Diese Seite kommt von Port 8081, nicht vom bereitgestellten Reference Menu.

Öffne Flat white unter A few good favourites. Die Detailseite soll Illustration, Preis, Portion und Allergene zeigen. Folge Find us, prüfe die Zeiten und wähle LITTLE HOUR, um im selben Tab zurückzukehren. Eine reine Textstartseite oder ein defektes Bild ist keine vollständige Lieferung.
Wechsle zu Topology. Dort kann jetzt Menu homepage reachable stehen. Das ist eine begrenzte Beobachtung, keine Abnahme aller Seiten. Als Nächstes prüfst du die Unabhängigkeit der Lieferung und die übrigen Kundenpfade.
Einen neuen Container und die ganze Website prüfen
Du startest eine neue Instanz deines Images und prüfst das gesamte Kundenerlebnis ohne Abhängigkeit vom Autorenverzeichnis. Beginne in Workstation.
Image und Container unterscheiden
Das Image bleibt gespeichert, wenn ein Container entfernt wird. Diese Website hat weder Kundeneingaben noch Datenbank; der Austausch dieses Containers verwirft daher keine Geschäftsdaten. Bei einer zustandsbehafteten Anwendung wäre diese Unterscheidung wichtig.
Entferne nur cafe-menu mit dem Austauschbefehl aus Schritt 2:
docker rm -f cafe-menu
Starte eine neue Instanz mit demselben veröffentlichten Port:
docker run -d --name cafe-menu -p 8081:80 little-hour-menu:1
Es erscheint eine andere Container-ID. Du hast weder neu gebaut noch das Autorenverzeichnis eingebunden: Die neue Instanz nutzt die bereits im Image gespeicherten Dateien.
docker inspect zeigt die tatsächliche Konfiguration. --format wählt ein Feld statt des gesamten Objekts. Die Vorlage in Anführungszeichen wandelt die Mount-Liste in JSON um:
docker inspect cafe-menu --format '{{json .Mounts}}'
[]
Die leere Liste bedeutet, dass keine Hostverzeichnisse oder Volumes eingebunden sind. Genau diesen Nachweis suchen wir: Quelldateien ergänzen nicht heimlich fehlende Bestandteile. Mounts sind in anderen Situationen sinnvoll; hier ist ein eigenständiges statisches Menü gefordert.
Die echten Kundenpfade testen
Wechsle zu Your Menu und lade neu. Öffne alle drei Favoriten nacheinander. Flat white kostet $4.00, Espresso $3.00, Iced oat latte $4.75. Jede Detailseite muss das richtige Bild und die richtigen Informationen zeigen. Kehre jeweils über LITTLE HOUR zurück. Öffne Find us und prüfe die Werktagszeiten 08:00–17:00. Bleibe in Your Menu; Reference Menu prüft einen anderen Server.

Wechsle zu Workstation. HTTP ist das Anfrage-Antwort-Protokoll des Browsers. Eine erfolgreiche Antwort hat Status 200; 404 bedeutet, dass die Ressource nicht gefunden wurde. Ein Verbindungsfehler ist etwas anderes: Es kam keine funktionierende Serverantwort an.
curl sendet eine Anfrage. -sS verbirgt den Fortschritt, zeigt aber Verbindungsfehler. -o /dev/null verwirft den Antwortinhalt. -w gibt das Format in Anführungszeichen aus: %{http_code} ist der Status und \n beendet die Zeile. In Workstation bezeichnet 127.0.0.1 diese Laborinstanz; führe diese Anfragen nicht im Terminal deines eigenen Computers aus.
curl -sS -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8081/menu/flat-white.html
Erwartet wird 200. Die Browserprüfung hat zusätzlich Inhalt und Illustration bestätigt; ein 200 mit der falschen Seite genügt nicht.
Autorennotizen dürfen nicht öffentlich sein. Rufe ihre mögliche URL ab:
curl -sS -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8081/notes/launch-notes.txt
Erwarte 404. Für die Paketgrenze ist dies das gewünschte Ergebnis. Curl endet normal, weil wir es nicht zum Fehlschlagen bei HTTP-Fehlerantworten aufgefordert haben. Die ganze Website anzuhalten würde die Menüprüfung nicht erfüllen.
Wechsle zurück zu Your Menu und über LITTLE HOUR zur Startseite. Das normale Menü muss nach der abgewiesenen Notizanfrage weiterhin funktionieren. Du hast vollständige Kundeninhalte und eine passende Antwort auf nicht ausgelieferte Ressourcen geprüft.
Zusammenfassung
Du hast ein vollständiges statisches Menü-Image gebaut, den Serverport veröffentlicht und einen neuen Container ohne Quell-Mounts gestartet. Du hast echte Kundenseiten, Bilder und Besuchsinformationen geprüft und Autorennotizen vom öffentlichen Angebot ausgeschlossen. Die nächste eigenständige Challenge überträgt diese Entscheidungen auf eine Bäckerei mit anderer Quellstruktur.



