P

Praktikum I

Zurück zur Veranstaltung

Vorbereitung

Für die Vorbereitung des Praktikumsversuchs wird mit einem Selbststudienaufwand von 12 Zeitstunden kalkuliert.

Für die erfolgreiche Teilnahme am Praktikum ist die Einarbeitung in die verlinkten Onlinequellen erforderlich.

  1. Beschäftigen Sie sich mit der Versionsverwaltungssoftware Git:
  2. Lesen Sie sich in das Konzept verschiedener Betriebsumgebungen (Environments) ein:

Ausgangspunkt

Sie erhalten im Labor einen Laptop mit einem nackten Ubuntu-Betriebssystem. Darüber hinaus haben Sie Zugang zum GitLab.

Durchführung

Im Folgenden werden die Arbeitsschritte beschrieben, die Sie durchführen müssen, um das Praktikum erfolgreich zu absolvieren. Hinweise sind anhand der kursiven Schrift zu erkennen.

Nutzen Sie das Terminal mit der Shell und dem Editor Ihrer Wahl. Standardmäßig sind die Shell bash und der Editor nano installiert.

Schritt 1 - Einlesen in Docker

Lesen Sie den Überblick über Docker. Versuchen Sie das zugrunde liegende Konzept zu verstehen.

Schritt 2 - Docker installieren

Installieren Sie die Docker-Engine mithilfe des Paketmanagers apt entsprechend der verlinkten Anleitung.

Überprüfen Sie den Erfolg der Installation mit dem Docker-Image docker/getting-started.

Für die Einarbeitung eignen sich das Get-Started Tutorial von Docker sowie informatikrelevante Blogs. Arbeiten Sie sich ebenfalls in die CLI-Dokumentationen von Docker ein.

Schritt 3 - Anwendung mit Docker starten

Im weiteren Verlauf wird mit Hilfe einer kleinen Node.js-basierten Anwendung zur Aufgabenverwaltung gearbeitet. Zunächst müssen sie an den Quellcode der Anwendung gelangen, laden Sie dafür den ZIP-Ordner herunter und extrahieren Sie ihn an einer geeigneten Stelle in Ihrem Dateisystem.

Öffnen Sie anschließend den Ordner in einem Code-Editor Ihrer Wahl. Um die Anwendung mit Docker starten zu können, müssen Sie ein Dockerfile erstellen, in dem der Aufbau des Docker Images unserer Anwendung beschrieben wird. Zur Orientierung können Sie dieses Tutorial nutzen.

Anschließend muss das Image mit docker build gebaut werden. Nutzen Sie geeignete Parameter um dem Image zum Beispiel einen lesbaren Namen zu geben.

Starten Sie das Image mittels docker run und geeigneten Parametern. Docker erstellt jetzt einen Container, der auf dem zuvor gebauten Image beruht. Rufen Sie die App in Ihrem Browser auf und testen Sie die Funktionalität.

Schritt 4 - Anwendung verändern und neu starten

In diesem Schritt soll die App aktualisiert werden. Ersetzen Sie den Text für den Fall, dass noch keine Einträge vorhanden sind mit einer deutschen Übersetzung.

Anschließend muss das Image erneut gebaut und gestartet werden (siehe Schritt 3).

Sollten Sie den selben Port nutzen tritt an dieser Stelle ein Fehler auf, da der Port noch vom alten Image in Benutzung ist. Sie müssen also darauf achten, dass Sie die alte Version einer Anwendung mit der aktualisierten ersetzen, indem Sie den alten Container löschen. Finden Sie dafür mittels docker ps die ID des Containers und erzwingen Sie das Löschen anschließend mittels docker rm -f <ID>, sofern der Container weiterhin läuft.

Jetzt müssen sie die aktualisierte App erneut starten. Aktualisieren Sie im Anschluss das Browserfenster und die Änderungen sollte sichtbar sein.

Schritt 5 - Daten der Anwendung persistieren

Möglicherweise ist Ihnen aufgefallen, dass nach jedem Neustart die Einträge in der App verschwinden und die Datenbank wieder leer vorzufinden ist. Diesen Umstand sollen Sie in diesem Schritt beseitigen.

Dies kann unter anderem mit Container Volumes erreicht werden. Lesen Sie sich in die verlinkte Dokumentation ein, um ein grobes Verständnis zu erhalten.

Unsere App speichert ihre Daten in einer SQLite Datenbank. Ein detailliertes Wissen über diese Datenbank ist hier nicht notwendig, wichtig ist nur, dass diese aus einer einzelnen Datei besteht, die in unserem Fall unter /etc/todos/todo.db liegt und besonders praktisch für einen Schnellstart der Entwicklung ist.

Erstellen Sie mittels docker volume create ein geeignetes Volume. Denken Sie daran, den noch laufenden Container zu beenden und starten Sie den Container erneut. Beachten Sie, dass jetzt mittels --volume/-v das zuvor erstellte Volume verwendet werden soll.

Entwickeln Sie eine geeignete Teststrategie, um die Persistenz der Datenbank zu überprüfen.

Hinweis: Mittels docker volume inspect kann der tatsächliche Speicherort der Daten abgefragt werden.

Schritt 6 - selbstdefinierter Speicherort des Volumes

Im vorherigen Schritt war es für uns nicht von Bedeutung, wo genau die Daten der SQLite Datenbank gespeichert werden. Es gibt allerdings Fälle in denen wir den Einhängepunkt auf dem Host selbst festlegen möchten:

  • Wenn auf einem Produktionsserver eine Serverapplikation (z. B. eine Datenbank) Daten liest oder schreibt, sollen diese oft im Rahmen einer Backup-Strategie regelmäßig zentral gesichert werden. Dann ist es sinnvoll, dass der Speicherort der Volumes auf dem Produktionsserver explizit festgelegt und in den Backup-Skripten genutzt wird. Wenn der Speicherort des Volumes auf dem Host nicht explizit festgelegt wird, besteht die Gefahr, dass bei einem Update von Docker auch das Volumemanagement anders funktioniert als bisher und die bestehenden Volumes migriert werden müssen. Das zieht dann eine Reihe weiterer Änderungen z. B. in den Backup-Skripten nach sich.
  • Wenn eine Serverapplikation (z. B. mit Node.js) entwickelt wird kann es sein, dass die Applikation nicht direkt auf dem Entwicklungsrechner sondern in einem Docker-Container getestet werden soll. In diesem Fall würde auf dem Entwicklungsrechner ein Docker-Container hochgefahren werden, der das aktuell entwickelte Serversystem ausführt. Damit nicht nach jeder Änderung des Quellcodes der Container neu gebaut werden muss, kann man den Quellcodeordner als Volume in den Docker-Container einhängen. Dann muss nach Änderungen immer nur die Serverapplikation im Container, aber nicht der Container selbst, neu gestartet werden.

In diesem Schritt sollen Sie nicht den Speicherort des Datenbank-Volumes selbst festlegen, sondern den Speicherort des Quellcodes der Serverapplikation. So ist es möglich, den Quellcode der Anwendung direkt in den Container einzuhängen, damit der Container auf Änderungen am Code selbst reagieren kann. Dadurch kann man es sich zum Entwicklungszeitpunkt sparen, den Container nach jeder Änderung am Quellcode neu zu bauen und zu starten.

In diesem Schritt wird nodemon genutzt. Recherchieren Sie zuerst, was nodemon ist, wozu und wie er verwendet wird.

Um einen Entwicklungs-Workflow zu simulieren müssen Sie die folgenden Schritte abarbeiten:

  • Quellcode in den Container einhängen
  • Alle Abhängigkeiten inklusive der dev-Abhängigkeiten installieren
  • nodemon starten

Hinweis 1: Beachten Sie, dass Sie gegebenenfalls wieder Ihren laufenden Container beenden müssen.

Hinweis 2: Das Entwicklungsprojekt der Serverapplikation benutzt yarn als Paketmanager, schauen Sie sich auch die package.json an, hier können Sie sehen, wie nodemon gestartet werden kann. Recherchieren Sie zuerst, was yarn überhaupt tut und wie es verwendet werden kann. Finden Sie auch heraus, in welchem Zusammenhang yarn und die package.json stehen. Ohne diese Kenntnisse können Sie die Aufgabe zwar mit Hilfe von Tutorials lösen, verstehen jedoch nicht, was Sie eigentlich tun.

Mittels docker logs -f <container-id> können Sie beobachten, wie weit der Prozess vorangeschritten ist. Sobald Sie die folgende Ausgabe sehen, kann es weiter gehen:

 docker logs -f <container-id>
$ nodemon src/index.js
[nodemon] 2.0.13
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node src/index.js`
Using sqlite database at /etc/todos/todo.db
Listening on port 3000

Übersetzen Sie beispielsweise die englischen Texte wie den "Add Item"-Button in der entsprechenden Datei. Nach kurzer Zeit sollten die neuen Änderungen im aktualisierten Browserfenster sichtbar werden.

Bauen Sie abschließend ein frisches Image aus der abgeänderten App.

Zusatzaufgabe

Was müssen Sie tun, um neben dem Quellcodeverzeichnis auch den Speicherort des Volumes der Datenbank selbst festzulegen? Welcher Speicherort wäre für den Entwicklungsprozess sinnvoll? Welche weiteren Randbedingungen sollten dabei beachtet werden?

Legen Sie den Speicherort des Datenbank-Volumes entsprechend Ihrer Überlegungen selbst fest und erstellen Sie den Container neu.

Abtestat

Sofern Sie Ihre Arbeitsschritte verstanden haben, führen Sie das Endresultat dem Laborpersonal vor. Seien Sie bereit auf Fragen des Laborpersonals ausführlich antworten zu können.

Zurück zur Veranstaltung

Version

v2023a getestet am 13.03.2023