Einführung
Afterlight ist eine kleine Gemeinschaftsausstellung. Besucher hinterlassen Gedanken im Gästebuch; ein Austausch der Anwendung darf diese Beiträge nicht löschen. Du probierst zunächst eine wegwerfbare Kopie aus und bindest dann die vorhandenen Daten des echten Gästebuchs wieder an, damit auch neue Nachrichten einen Anwendungsaustausch überstehen.
Grundlegende Terminalkenntnisse reichen aus. Docker, Compose, Datenpfade, Bearbeitung und HTTP werden bei Bedarf erklärt. Anwendung und Werkzeuge sind vorbereitet; du schreibst keinen Datenbankcode. Alle Besucherdaten sind erfunden.
Nutze Workstation für Befehle, Exhibition für das echte Gästebuch und Practice Copy nur für den absichtlichen Datenverlustversuch. Beide Websites verwenden unterschiedliche Container und Ports. Jede Einheit beginnt unabhängig; Website, Beschriftungen und Ausgaben bleiben englisch.
Gib Besucherdaten einen eigenen Speicherort
In diesem Schritt probierst du die Ausstellung aus, beobachtest den Verlust wegwerfbarer Daten und verbindest das echte Gästebuch mit seinen vorhandenen Einträgen. Beginne in Practice Copy, einer getrennten, bewusst wegwerfbaren Ausstellung ohne echte Besucher.
Probiere den normalen Besucherweg aus
Öffne About the exhibition, lies die Öffnungszeiten und wähle The wall. Wähle Leave a contribution, trage Visitor bei Your name und A small practice note. bei Your message ein und wähle Add to the wall. Die Detailseite zeigt deinen Beitrag. Über Back to the wall siehst du seine Karte. Details und Formular gehören zum normalen Geschäftsbetrieb, den du erhalten musst.
Beobachte, was ein Container nicht aufbewahrt
Wechsle zu Workstation. Das Terminal beginnt in /home/labex/project/afterlight. Ein Pfad bezeichnet eine Datei oder ein Verzeichnis; dieser absolute Pfad beginnt an der Dateisystemwurzel /. pwd zeigt das aktuelle Verzeichnis:
pwd
Docker führt die Anwendung in einem Container aus, einem Prozess mit eigener Sicht auf das Dateisystem. Ein Image ist das vorbereitete Anwendungspaket. afterlight:1 enthält Programm und Gestaltung, aber keine späteren Besucherbeiträge. Daten, die nur in die beschreibbare Schicht eines Containers geschrieben werden, verschwinden beim Löschen dieses Containers.
Entferne nur den wegwerfbaren Übungscontainer. docker rm entfernt ihn; -f stoppt ihn bei Bedarf zuerst:
docker rm -f afterlight-scratch
docker run erzeugt aus dem gespeicherten Image einen neuen Container. -d lässt ihn im Hintergrund laufen, --name vergibt seinen Namen. Ein Port bezeichnet einen Netzwerkdienst: -p 8082:8081 leitet Port 8082 der Lab-Instanz an Anwendungsport 8081 im Container weiter.
docker run -d --name afterlight-scratch -p 8082:8081 afterlight:1
Die lange Ausgabe ist die neue Container-ID. Wechsle zu Practice Copy, wähle The wall und lade neu. Deine Übungskarte ist verschwunden. Lade nicht immer wieder ihre alte Detail-URL: Diesen Eintrag gibt es nicht mehr. Der Verlust betrifft ausschließlich die wegwerfbare Kopie.
Binde die vorhandenen Gästebuchdaten an
Wechsle zu Exhibition. Die leere Wand nutzt dieselbe Anwendung, ihr fehlt jedoch die Datenanbindung. Der ursprüngliche Beitrag von Iris liegt sicher im vorbereiteten Docker-Volume afterlight_messages. Deine Hauptaufgabe ist, diese Daten wieder anzubinden und spätere Beiträge beim Anwendungsaustausch zu bewahren.
Ein benanntes Volume ist von Docker verwalteter Speicher außerhalb eines bestimmten Containers. Ein Mount verbindet ihn mit einem Pfad in der Anwendung. Diese schreibt ihre SQLite-Datenbank nach /data/wall.sqlite3. SQLite speichert Datensätze in einer Datei; du brauchst hier weder SQL noch Anwendungscode.
Wechsle zu Workstation. cat zeigt eine Datei an:
cat compose.yaml
Compose liest diese YAML-Konfiguration, um den Dienst anzulegen. YAML drückt Verschachtelung durch Einrückung mit Leerzeichen aus. services gruppiert Anwendungen, wall ist dieser Dienst. image, container_name und ports beschreiben Paket, Namen und Netzwerkzuordnung. environment liefert Anwendungseinstellungen. RELEASE wählt die Darstellungsausgabe; beide Ausgaben nutzen dasselbe Datenformat.
Du ergänzt einen Mount und eine Volume-Deklaration. messages:/data verbindet das logische Volume messages mit dem Containerverzeichnis /data; die Deklaration auf oberster Ebene gibt ihm den vorhandenen Docker-Namen afterlight_messages. external: true weist Compose an, das vorbereitete Volume wiederzuverwenden, statt ein neues anzulegen. Ein falscher Name erzeugt einen Fehler wegen eines fehlenden Volumes: Korrigiere den Namen, lösche nicht das Original und lege keinen leeren Ersatz an. Speicher nur zu deklarieren, ohne ihn mit dem Dienst zu verbinden, schützt keine Daten.
cat > compose.yaml ersetzt diese Konfiguration. Das in Anführungszeichen gesetzte YAML beginnt ein Here-Dokument: Füge den gesamten Block einschließlich des abschließenden YAML auf einer eigenen Zeile ein. Die Anführungszeichen erhalten den wörtlichen Inhalt; übernimm die gezeigten Leerzeichen.
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 prüft die Konfiguration ohne Ausgabe bei Erfolg. Keine Ausgabe bedeutet, dass sie lesbar ist; bei einem Fehler korrigierst du Einrückung oder Schreibweise und prüfst erneut, bevor du sie anwendest.
docker compose config -q
docker compose up -d erstellt oder ersetzt den Dienst im Hintergrund passend zur Datei. Benannte Volumes bleiben erhalten. Warte bis zum Ende:
docker compose up -d
Wechsle zu Exhibition, kehre zu The wall zurück und lade neu. Iris’ A beautiful place to pause. muss erscheinen. Öffne ihre Karte und kehre zurück. Ein bestehender Datensatz wurde aus seiner echten Datenbank wieder angebunden; er wird nicht bei jedem Start als Beispiel neu erzeugt.
Schreibe einen neuen Beitrag und erkenne seinen Speicherort
In diesem Schritt ergänzt du einen echten Beitrag und ordnest das sichtbare Ergebnis dem tatsächlichen Mount zu. Beginne in Exhibition. Erhalte die ursprüngliche Karte von Iris.
Wähle Leave a contribution. Trage Mira bei Your name und genau The light stays with us. bei Your message ein und wähle Add to the wall. Die Detailseite muss beide Werte zeigen. Wähle Back to the wall; Iris und Mira müssen vorhanden sein.
Wechsle zu Workstation. docker inspect liest die tatsächliche Containerkonfiguration. --format wählt ein Feld; einfache Anführungszeichen erhalten die geschweiften Klammern. Diese Vorlage zeigt die Mount-Liste als JSON:
docker inspect afterlight-wall --format '{{json .Mounts}}'
Suche "Type":"volume", "Name":"afterlight_messages", "Destination":"/data" und "RW":true. RW bedeutet, dass Lese- und Schreibzugriff erlaubt sind. Ein Name in der Konfigurationsdatei ist nur die Absicht; hier steht die tatsächliche Verbindung des laufenden Containers.
docker volume ls listet verfügbare Volumes auf:
docker volume ls
Weitere Plattform-Volumes können vorhanden sein; lasse sie unverändert. Bei einem falsch geschriebenen externen Volume-Namen hält Compose mit einem Fehler wegen eines fehlenden Volumes an. Korrigiere den Namen in der Datei und wende erneut an; lege keinen leeren Ersatz an. Wenn du versehentlich ein neues leeres Volume anbindest, beweist eine leere Wand nicht, dass die ursprünglichen Einträge gelöscht sind. Bewahre das Original-Volume, stelle afterlight_messages in compose.yaml wieder her, prüfe und wende erneut an. Lösche Volumes nicht als Fehlerbehebungsabkürzung. docker compose down -v entfernt von Compose verwaltete Volumes samt Daten, lässt aber mit external: true deklarierte Volumes bestehen. Das macht manuelles Löschen eines externen Volumes nicht sicher.
Berücksichtige jede Datenart
Ein Beitrag kann von mehreren Verzeichnissen abhängen. Dieses Gästebuch speichert Text in /data. Eine Fotowand speichert zusätzlich die hochgeladenen Bilddaten in /photos; ihre Datenbank enthält Bildtexte und zugehörige Dateinamen. Nur den Text zu erhalten kann ein kaputtes Bild zurücklassen.
| Containerpfad | Inhalt | Beim Austausch erhalten? |
|---|---|---|
/data |
Besuchereinträge und Foto-Text-Zuordnungen | Ja |
/photos bei der Fotowand |
Hochgeladene Fotos | Ja, getrennt von der Datenbank |
/app |
Vorbereitetes Programm, Gestaltung und Übungsdateien im Image | Aus dem bereitgestellten Image neu erzeugt |
Mehrere Datenverzeichnisse verwenden dieselbe Mount-Syntax: je einen Eintrag in der Dienstliste und eine Volume-Deklaration. Binde kein leeres Volume über /app ein; es würde das Programm verdecken. Cache- oder Image-Dateien sind nicht automatisch Besucherdaten.
Die eigenständige Challenge nutzt ein Fotoformular. Die Links River und Garden laden vorbereitete PNG-Übungsbilder auf deinen Computer herunter. Speichere das verlangte Bild, wähle es unter Photograph (PNG), ergänze Namen und Bildtext und sende Add to the wall ab. Der Browser sendet die gewählten Dateidaten; ein Upload-Werkzeug im Terminal ist nicht nötig.
Ersetze die Anwendung und halte die Ausstellung nutzbar
In diesem Schritt ersetzt du die Anwendung durch Ausgabe 2, erhältst beide Beiträge und nimmst einen neuen an. Beginne in Workstation.
nano ist ein Texteditor im Terminal. Öffne die Konfiguration:
nano compose.yaml
Ändere mit den Pfeiltasten ausschließlich RELEASE: "1" zu RELEASE: "2". Behalte Mounts, Image und Ports. Speichere mit Ctrl+O, Enter, und verlasse den Editor mit Ctrl+X. Lies und prüfe die gespeicherte Konfiguration:
cat compose.yaml
docker compose config -q
docker compose ps -q wall zeigt die aktuelle Container-ID. Merke sie dir oder behalte die Ausgabe zum Vergleichen; ein Bericht ist nicht erforderlich:
docker compose ps -q wall
Wende die Ausgabeänderung an. --force-recreate fordert auch bei sonst gleicher Konfiguration einen neuen Container an:
docker compose up -d --force-recreate
docker compose ps -q wall
Die ID muss sich unterscheiden. Das ist ein Austausch, kein bloßer Neustart. Falls der Start scheitert, zeigt docker compose logs wall Anwendungsmeldungen. Korrigiere die Konfiguration, prüfe und wiederhole up -d. Erhalte die ursprünglichen Volumes und lösche keine anderen Container.
Wechsle zu Exhibition, wähle The wall und lade neu. Im Fußbereich muss Edition 2 stehen. Iris und Mira müssen erhalten bleiben. Öffne beide Karten und kehre zurück. Gib Leon und genau Back for another look. ins Formular ein und sende ab. Zurück an der Wand funktionieren nun drei Beiträge in der neuen Anwendung.
Prüfe den Dienst ebenso wie die Daten
Wechsle zu Workstation. HTTP ist das Anfrage-Antwort-Protokoll des Browsers. Status 200 bedeutet eine erfolgreiche Antwort; 404 bedeutet, dass die angeforderte Ressource fehlt. Ein Verbindungsfehler heißt, dass keine Serverantwort eingetroffen ist.
curl sendet eine Anfrage. -sS verbirgt die Fortschrittsanzeige, zeigt jedoch Verbindungsfehler; -o /dev/null verwirft den Antwortinhalt. -w gibt das angegebene Format aus: %{http_code} ist der Status, \n beendet die Zeile. In Workstation bezeichnet 127.0.0.1 diese Instanz, Port 8081 ist Exhibition. Führe aus:
curl -sS -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8081/about
Erwarte 200. Öffne in Exhibition About the exhibition, kontrolliere die Öffnungszeiten und wähle The wall. Ein Erfolgsstatus allein beweist weder korrekte Inhalte noch erhaltene Beiträge.
Dein Volume schützt gegen diesen Containeraustausch. Es ist kein unabhängiges Backup und schützt nicht gegen Volume-Löschung oder Host-Verlust. Halte Anwendungsdateien reproduzierbar und speichere Besucherdaten getrennt.
Zusammenfassung
Du hast wegwerfbare Containerdateien von dauerhaften Besucherdaten unterschieden, das vorhandene benannte Volume angebunden und ursprüngliche sowie neue Nachrichten beim Austausch erhalten. Ein neuer Beitrag und die Ausstellungsseiten funktionieren weiterhin. Übertrage das Verfahren jetzt auf Bildtexte und getrennt gespeicherte Fotos.



