logo-guide-logos-1

Workshop | Docker

Von am 30.12.2024

Mein Workshop im 1. Semester konzentrierte sich auf Docker. Im Workshop habe ich die Grundprinzipien von Docker erklärt und diesen dann anhand von praktischen Beispielen hergezeigt. Für den Theorieteil habe ich eine Präsentation erstellt, um meine Erklärungen grafisch zu unterstützen:

Was ist Docker?

Docker ist eine Open-Source-Plattform, welche es Entwicklern ermöglicht, Anwendungen in Containern zu erstellen, bereitzustellen und auszuführen. Container sind leichtgewichtige, standardisierte Einheiten, die alle benötigten Voraussetzungen einer Anwendung bündeln, sodass sie unabhängig von der zugrunde liegenden Infrastruktur konsistent laufen können.

Dies erleichtert die Zusammenarbeit zwischen Teams, beschleunigt den Entwicklungsprozess und sorgt für Skalierbarkeit sowie Portabilität von Anwendungen. Man kann zum Beispiel einen Docker Container für ein Projekt erstellen, welcher die Entwicklungsumgebung ist. Jedes Teammitglied hat dann durch diesen Container die gleiche Entwicklungsumgebung. Wenn es dann ans Deployment geht, kann man diesen Entwicklungscontainer für eine Produktivumgebung anpassen und ihn sofort hochstellen, wodurch er genauso wie auch in der lokalen Entwicklung funktionieren sollte.

Übungsbeispiel

Um auch einen praktischen Teil in meinem Workshop einzubauen habe ich ein Übungsprojekt erstellt. Es bestand aus einem simplen PHP Projekt, welches einfach Daten aus einer Datenbank anzeigen soll und die Möglichkeit bietet, neue Daten hinzufügen und Daten zu löschen. Weiters habe ich auch ein SQL Datei zur Erstellung der Datenbank für dieses Projekt hinterlegt.

Vor dem Workshop habe ich alle gebeten, das sie sich Docker Desktop herunterladen. Diese Software wird benötigt, um Docker Befehle auf Windows und Mac ausführen zu können. Weiters sollten sie auch ‘docker run hello-world’ ausführen, um zu sehen, ob alles richtig funktioniert. Dieser Befehl startet einen einfachen Docker Container, welcher einen Begrüßungstext ausgibt, um zu überprüfen, ob die Docker Installation richtig funktioniert.

Die Übung selbst bestand aus drei Teilen.

1. Teil

Ziel des ersten Teiles war es, die Funktion von Docker anhand von einfachen Befehlen herzuzeigen. Dafür habe ich das hello-world Image benutzt, um das erstellen, laufen, stoppen und löschen von Container zu zeigen. Auch wurde das Anzeigen von laufenden und gestoppten Container wie auch von lokalen Images hergezeigt.

Danach wurden der erste richtige Container erstellt. Mit dem offiziellen php:8.2-apache Image wurde ein PHP Container erstellt. Dieser Container wurde dann genauer angeschaut und erklärt, um besser verstehen zu können, was Container sind und wie sie aufgebaut sind. Danach wurde mithilfe von sogenannte Volumes das PHP Projekt in den Container gespiegelt. Durch das Volume werden alle neuen Änderungen, welche man im code vornimmt, in den Container gespiegelt. Genauso können auch Änderungen im Docker ins Lokale gespiegelt werden, um persistenten Daten zu haben, falls der Container gelöscht wird.

Ein PDF welches als Cheatsheet für viele der wichtigen Docker Befehle dient, ist hier angehängt:

Mit den Grundkenntnissen nun erworben und erklärt, ging es weiter in den zweiten Teil.

2. Teil

Im zweiten Teil ging es dann darum, eigene Docker Images zu erstellen, um hiermit dann eine Datenbankverbindung im Projekt aufbauen zu können.

Zum Erstellen der Images schreibt man ein sogenanntes Dockerfile. In diesem gibt man ein bestehendes Image an, welches als Basis für den Container verwendet werden soll. Danach kann man verschiedenen Sachen angeben, welche beim Erstellen des Containers ausgeführt werden sollen. Zum Beispiel das Kopieren von Dateien oder das Ausführen von Befehlen.

Zuerst wurde ein Image für den PHP Container erstellt. Dieses Image wurde benötigt, um den PHP Datenbanktreiber für MySQL zu installieren. Das PHP Dockerfile:

# Das Basisimage, auf dem aufgebaut wird
FROM php:8.2-apache

# Setze den Ordner, indem die Befhle ausgeführt werden
WORKDIR /var/www/html

# Führe folgenden Befehl aus, diser installiert den pdo Treiber für die Datenabnk
RUN docker-php-ext-install pdo pdo_mysql

Danach musste auch ein zweites Dockerfile erstellt werden. Dieses war für die MySQL Datenbank. Hierbei mussten die nötigen Umgebungsvariablen, wie das Root Passwort oder der Datenbankbenutzer angegeben werden, und das davor vorbereitete SQL Datei wurde in den Container kopiert, damit die Datenbank beim Erstellen des Containers mit erstellt wird. Das MySQL Dockerfile:

# Das Basisimage, auf dem aufgebaut wird
FROM mysql

# Setze Umgebungsvariablen für User und Datenbank
ENV MYSQL_ROOT_PASSWORD=rootpw
ENV MYSQL_DATABASE=testdb
ENV MYSQL_USER=testus
ENV MYSQL_PASSWORD=testpw

# Kopiere Datenbank Datei in den vom Image definierten Ordner, damit einen Datenbank davon erstellt wird
COPY ./db/sample_db1.sql /docker-entrypoint-initdb.d/

Zuletzt musste man noch die Verbindung der Container durch ein Docker Network ermöglichen. Damit konnte man dann die Verbindungsdaten der Datenbank in PHP angeben und dann mit dem Starten der beiden Container das Projekt ganz normal benutzen.

3. Teil

Der letzte Teil bestand aus einem einfachem herzeigen aufgrund der Zeit. Hergezeigt wurde Docker Compose. Dies ist ein Werkzeug um einfach mehrerer Container mit nur einem Befehl starten und diese auch leicht verwalten zu können.

In der Docker-Compose Datei, eine YAML Datei, kann man für jeden Container die Argumente angeben, mit denen er gestartet werden soll. Zum Beispiel welches Image verwendet, oder auch von welchem Dockerfile das Image erstellt werden soll, die Ports, die Volumes, etc. Diese Argumente ähneln denen, welche man beim Erstellen und starten eines Containers angeben muss. Zum Beispiel die Datei aus der Übung ist:

version: '3.8' # Version von Docker compose, (ist vor kruzem Reddunadnsat geworden, kann man nun entferenen)

services: # Services sind die Docker Container welche getsratet werden sollen

  my-php: # Container Name
    build: # Buildcontext für das Image und den Container
      context: ./docker
      dockerfile: Dockerfile_php
    volumes: # Volume; lokaler Ordner, welche in den Docker Container gespiegelt werden soll 
      - ./src:/var/www/html
    ports: # Welcher lokaler Port mit dem Docker Port verbunden werden soll
      - 8082:80

  my-sql: # Container Name
    build:  # Buildcontext für das Image und den Container
      context: ./docker
      dockerfile: Dockerfile_mysql
    ports: # Welcher lokaler Port mit dem Docker Port verbunden werden soll
      - 3308:3306
    env_file: # env Datei, welche die Umgebungsvariablen enthält und diese im Container setzt. Sollte normal verwendet werden um diese zu setzen, anstatt sie ins Dockerfile zu schreiben.
      - .env

Sobald die docker-compose.yml Datei erstellt ist, kann man es ganz einfach mit docker compose up starten und die mit docker compose down beenden.

Fazit

Die Vorbereitung hat einiges an Zeit gekostet. Zum einen das Erstellen des Übungsprojektes, wie auch das Erstellen der Folien. Am meisten Zeit hat aber das Einlesen gebraucht, damit meine Docker Kenntnisse ausreichend sind, um mögliche Fragen meiner KollegInnen beantworten zu können. Hierbei konnte ich aber auch mein bestehendes Docker Wissen um vieles festigen und hatte zu folgen, dass ich nun um einiges besser mit Docker umgehen konnte als davor.

In der eigentlichen Stunde habe ich dann auch wirklich den Zeitstress gespürt. Ich hatte viel Stoff, was meiner Meinung aber auch sehr wichtige Grundkenntnisse für Docker waren, weshalb ich sie schwer auslassen konnte. Auch das eigentlich erklären, damit alle einen guten Überblick gewinnen können, hat Zeit gebraucht. Aber ich war dann sehr zufrieden als meinen KollegInnen gemeint haben, dass es zwar viel Stoff war, aber es überschaubar und gut erklärt wurde. Zusammenfassend war der Workshop eine tolle Erfahrung, die mir viel neues Wissen eingebracht hat und welcher hoffentlich auch anderen, neues Wissen beibringen konnte.

Beitrag kommentieren

(*) Pflichtfeld