P

Praktikum II

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.

Erstellen Sie sich neues GitLab-Projekt mit geeignetem Namen für das Parktikum.

Ausgangspunkt

Sie erhalten im Labor einen Laptop mit einem nackten Ubuntu-Betriebssystem. Darüber hinaus haben Sie Zugang zum GitLab. Installieren Sie die erforderlichen Werkzeuge, die Sie aus den vorherigen Praktika kennen, bei Bedarf nach. An dieser Stelle arbeiten wir zunächst weiter mit der Anwendung aus dem letzten Praktikum.

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.

Erstellen Sie im Wiki des zuvor erstellten GitLab-Projekts ein Laborprotokoll. Notieren Sie hier strukturiert Ihre Arbeitschritte mit kopier- und ausführbaren Kommandozeilenbefehlen in dieser Form:

docker run hello-world

Das Laborprotokoll soll dem Laborpersonal am Ende gemeinsam mit der kurzen Vorführung der Ergebnisse gezeigt werden.

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 - Docker Netzwerk einrichten und einen Container damit verbinden

Bisher haben Sie ausschließlich mit Single Container Apps gearbeitet. Jetzt soll die Datenbank der ToDo-App durch MariaDB ersetzt werden. Generell gilt, dass jeder Container eine einzige Aufgabe erledigen sollte und diese dann gut erledigen soll. Das bedeutet, dass Sie heute zwei Container einrichten: einen für die Datenbank und einen weiteren für die ToDo-App aus dem letzten Praktikum. Die ToDo-App wird die MariaDB-Datenbank nutzen um die ToDo-Einträge abzulegen. Zu beachten ist an dieser Stelle, dass zwei Container ein Netzwerk benötigen, um miteinander kommunizieren zu können.

  • Erstellen sie zunächst das benötigte Netzwerk
  • Starten Sie anschließend einen MariaDB Container, beachten Sie hier:
    • Der Container soll mit dem zuvor erstellten Netzwerk verbunden werden
    • Mit der Option --network-alias können Sie dem Container einen Alias in dem Netzwerk geben. Dies erleichtert die folgenden Schritte.
    • MariaDB speichert seine Daten unter /var/lib/mysql

      Hinweis: Das Volume muss nicht vorab mittels docker volume create erstellt werden. Docker erstellt automatisch ein named Volume für Sie, wenn die entsprechende Option im docker run angegeben wird.

    • Setzen Sie mittels --env bzw. -e die benötigten Umgebungsvariablen für die Datenbank. Unter "Environment Variables" finden Sie in der MariaDB Docker Hub Doku die benötigten Informationen. Sorgen Sie dafür, dass beim Start des Containers eine Datenbank angelegt wird und notieren Sie sich den selbst gewählten Namen der Datenbank. Diesen werden Sie in Schritt 3 benötigen.

Nachdem Sie den Container gestartet haben, können Sie testen, ob alles wie gewünscht gestartet wurde. So ist es zum Beispiel möglich, dass Sie einen Befehl im Container ausführen und sich so direkt mit der Datenbank verbinden können. Geben Sie Ihr zuvor gewähltes Passwort ein und führen sie den folgenden Befehl aus: SHOW DATABASES;. In der Ausgabe sollte u.a. Ihre zuvor definierte Datenbank aufgelistet werden.

Schritt 2 - Container im Docker Netzwerk identifizieren

Jeder Container in einem Netzwerk hat seine eigene IP-Adresse. Wenn Sie Ihren SQL-Container nutzen möchten, müssen Sie also die zugehörige IP-Adresse in Erfahrung bringen. Recherchieren Sie zunächst selbstständig, wie Sie die IP-Adresse bestimmen können.

Hier ist eine mögliche Herangehensweise.

Nutzen Sie docker inspect. Diese Funktion stellt Ihnen low-level Informationen bereit. Sie können mit Hilfe von grep -i nach "ipaddress" suchen, nutzen Sie dafür eine Pipe

Hinweis: Die Nutzung von grep in Verbindung mit einer Pipe wird in der Linux-Kommandozeile häufig benötigt und kann Ihnen auch zukünftig helfen.

Alternativ können Sie natürlich auch die vordefinierte Funktion nutzen.

Falls Sie wie in Schritt 1 gefordert die Option --network-alias genutzt haben, können Sie auch Ihren Alias anstatt der IP-Adresse in den weiteren Schritten nutzen, da Docker diesen Alias entsprechend auflöst.

Schritt 3 - ToDo-App Container ins Netzwerk integrieren

Ihre ToDo-App unterstützt die folgenden Umgebungsvariablen, die die MariaDB-Verbindungseinstellungen spezifizieren:

  • MYSQL_HOST - Der Hostname des MariaDB-Servers
  • MYSQL_USER - Der Benutzername für die Verbindung
  • MYSQL_PASSWORD - Das Passwort für die Verbindung
  • MYSQL_DB - Name der zu nutzenden Datenbank

Wenn Sie diese Umgebungsvariablen beim Start des Containers angeben, verwendet Die App automatisch MariaDB, ohne dass Sie Änderungen an der App vornehmen müssen. Die ToDo-App steht unter /home/student/getting-started-master-app/app für Sie bereit.

Erweitern Sie Ihren docker run Befehl der App aus dem vorherigen Praktikum um diese Umgebungsvariablen und verbinden Sie den Container mit Ihrem zuvor erstellten Netzwerk. Darüber hinaus soll die App ab sofort unter localhost:4200 erreichbar sein und nutzen Sie die aktuelle LTS Version des Node.js Image als Grundlage.

Umgebungsvariable (=env vars) für Verbindungseinstellungen sollten ausschließlich nur für die Entwicklung genutzt werden. Im Produktiveinsatz wird streng davon abgeraten. Siehe auch hier.

Bei Bedarf können Sie in den Docker Logs überprüfen, ob die MariaDB-Datenbank genutzt wird.

Rufen Sie die App im Browser auf und fügen Sie der Liste einige Elemente hinzu. Verbinden Sie sich anschließend wie in Schritt 1 mit der Datenbank und fragen Sie alle Einträge Ihrer Datenbank ab. Überprüfen Sie so, ob die ToDo-App tatsächlich die Maria-DB nutzt. Falls Ihnen die Syntax nicht bekannt ist, informieren Sie sich hier.

Schritt 4 - Docker Compose

Mittlerweile müssen Sie sehr viele Schritte abarbeiten, um die Anwendung wie gewünscht zu starten. Sie müssen ein Netzwerk erstellen, zwei Container mit den entsprechenden Umgebungsvariablen und weiteren Parametern starten. Diese Schritte können Sie beispielsweise nicht mehr ganz so einfach an Ihre Kommiliton*innen weitergeben. Dieses Problem lässt sich mit Docker Compose lösen, indem die vollständige Konfiguration der gesamten Betriebsumgebung mit allen Containern in einer einzigen docker-compose.yml Datei definiert wird. Bitte lesen Sie sich in die zugehörige Doku ein.

Schritt 5 - Start per Docker Compose vorbereiten

Erstellen Sie im Wurzelverzeichnis Ihres App-Projekts die Datei docker-compose.yml. Öffnen Sie die Datei mit einem Editor Ihrer Wahl und fügen Sie die Versionsnummer ein. Grundsätzlich können Sie meistens die aktuellste Version nutzen.

version: "3.x"

Anschließend werden im folgenden Schritt die verschiedenen Services bzw. Container mittels services: definiert:

version: "3.x"

services:

Schritt 6 - App in die docker-compose.yml integrieren

Fügen Sie zunächst die App dem Compose-File hinzu. Inhaltlich können Sie sich dabei an Ihrem letzten docker run-Befehl aus Schritt 3 orientieren. Der Service kann einen beliebigen Namen haben, im Beispiel wurde app gewählt.

version: "3.x"

services:
   app:
      <Hier alles weitere einfügen>

Für eine vollständige Umsetzung benötigen Sie die folgenden Tags:

Arbeiten Sie diese schrittweise ab und überführen Sie die docker run-Optionen in das Compose-File.

Schritt 7 - Datenbank Container in die docker-compose.yml integrieren

Fügen Sie dem Compose-File wie in Schritt 6 jetzt den DB-Service hinzu. Sie können sich hier am docker-run-Befehl aus Schritt 1 orientieren. Im Beispiel heißt der Service db

version: "3.x"

services:
   app:
      <Einträge aus Schritt 6>
   db:
      <Hier alles weitere einfügen>

Im Falle von docker run wurde das named Volume automatisch erstellt. Dies ist bei Docker-Compose nicht der Fall. Auf top-level muss ein weiterer volumes:-Eintrag erfolgen, dessen Einhängepunkt im db-Service definiert werden muss. In diesem Fall reicht es nur den Namen zu definieren damit die Standardeinstellungen genutzt werden.

version: "3.x"

services:
   app:
      <Einträge aus Schritt 6>
   db:
      <Hier alles weitere einfügen>
volumes:
   <Hier Volume definieren>

Schritt 8 - Betriebsumgebung starten

In den vorherigen Schritten sollten Sie das Compose-File vollständig erstellt haben. Sie können die Anwendung mittels docker compose up -d starten. In der Ausgabe sollte unter anderem stehen, dass ein Netzwerk automatisch erstellt wurde.

Überprüfen Sie die Logs durch den Befehl docker compose logs -f. Warten Sie, bis alle Container gestartet wurden und überprüfen Sie die Funktionalität im Browser.

Falls Sie die Anwendung wieder beenden möchten, können Sie dies durch docker compose down erreichen. Sollten darüber hinaus auch die Volumes gelöscht werden, müssen Sie die Option --volumes ergänzen.

Hinweis: Sie können die Anwendung auch mittels docker compose up (ohne -d bzw. --detach) starten. Dann bleibt der Befehl im Terminal aktiv und Sie können die Ausgaben direkt verfolgen. Zum Beenden der Anwendung drücken Sie Ctrl-C. Dieses Vorgehen ist nur für die Entwicklung, nicht für den Produktivbetrieb zu empfehlen.

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 16.03.2023