Test II - Zusammenfassung

Obama

Auflistung der Lernziele

  1. Sie kennen die Syntax von Dockerfiles

  2. Sie können das Beispiel von Dockerfiles nachvollziehen

  3. Sie können eigene Dockerfiles erstellen, testen und dokumentieren

  4. Sie kennen den Einsatzzweck von Docker Compose

  5. Sie verstehen den Aufbau einer YAML-Datei und können eigene YAML-Dateien erstellen

  6. Sie können Docker Compose anwenden

  7. Sie verstehen wie in Docker Compose mit Passwörtern oder sonstigen geheimen Informationen umgegangen wird

Detaillierte Erklärungen

1. Sie kennen die Syntax von Dockerfiles

Ein Dockerfile enthält Anweisungen zum Erstellen eines Docker-Images. Die wichtigsten Schlüsselwörter sind:

  • FROM: Definiert das Basis-Image (z.B. FROM ubuntu:latest)

  • LABEL: Fügt Metadaten zum Image hinzu (z.B. LABEL maintainer="email@example.com")

  • RUN: Führt Befehle während des Image-Builds aus (z.B. Paketinstallation)

  • COPY/ADD: Kopiert Dateien vom Host ins Image-Dateisystem

  • CMD: Definiert den Standardbefehl beim Containerstart

  • ENTRYPOINT: Definiert den Hauptprozess des Containers

  • ENV: Setzt Umgebungsvariablen (z.B. ENV PORT=3000)

  • EXPOSE: Legt Ports fest, die vom Container bereitgestellt werden

  • VOLUME: Definiert persistente Datenspeicherorte

  • USER: Setzt den Benutzer für folgende Befehle

  • WORKDIR: Legt das Arbeitsverzeichnis für folgende Befehle fest

2. Sie können das Beispiel von Dockerfiles nachvollziehen

Im Kursbeispiel wird ein einfacher Webserver mit Apache und PHP erstellt:

# Datei: bsp-apache-php/Dockerfile
FROM php:8-apache
COPY index.php /var/www/html

Dieses Dockerfile:

  1. Verwendet php:8-apache als Basis-Image

  2. Kopiert die lokale index.php in das Verzeichnis /var/www/html im Container

Der Workflow zum Testen ist:

# Image erstellen
docker build -t bsp-apache-php .

# Container starten
docker run -d --name bsp-apache-php-container -p 8080:80 bsp-apache-php

Anschließend ist die Webseite unter http://localhost:8080 erreichbar.

3. Sie können eigene Dockerfiles erstellen, testen und dokumentieren

Um ein eigenes Dockerfile zu erstellen:

  1. Erstellen Sie eine Datei namens Dockerfile im Projektverzeichnis

  2. Definieren Sie ein Basis-Image mit FROM

  3. Fügen Sie weitere Anweisungen hinzu (Installation von Paketen, Kopieren von Dateien, etc.)

  4. Erstellen Sie das Image mit docker build -t image-name .

  5. Testen Sie das Image, indem Sie einen Container starten: docker run -d --name container-name -p host-port:container-port image-name

Beispiel für einen eigenen Webserver:

FROM ubuntu:latest

LABEL maintainer="email@example.com"
LABEL description="Webserver Image für www.meine-webseite.ch"

# Umgebungsvariablen einstellen
ENV TZ="Europe/Zurich" \
    APACHE_RUN_USER=www-data \
    APACHE_RUN_GROUP=www-data \
    APACHE_LOG_DIR=/var/log/apache2

# Zeitzone einstellen und Apache installieren
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && \
    echo $TZ > /etc/timezone && \
    apt-get update && \
    apt-get install -y apt-utils apache2 && \
    apt-get -y clean && \
    rm -r /var/cache/apt /var/lib/apt/lists/* && \
    a2ensite default-ssl && \
    a2enmod ssl

# Ports freigeben
EXPOSE 80 443

# Webroot als Volume definieren
VOLUME /var/www/html

# Startkommando
CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]

4. Sie kennen den Einsatzzweck von Docker Compose

Docker Compose ist ein Tool zum Definieren und Ausführen von Multi-Container-Docker-Anwendungen. Die Hauptvorteile sind:

  • Vereinfachte Konfiguration: Alle Container-Konfigurationen in einer einzigen YAML-Datei

  • Mikrodienste: Einfache Verwaltung von mehreren miteinander kommunizierenden Diensten

  • Automatisierte Koordination: Gemeinsames Starten und Stoppen mehrerer Container mit einem Befehl

  • Wiederverwendbarkeit: Eine Anwendung kann einfach auf verschiedenen Umgebungen bereitgestellt werden

  • Umgebungsvariablen: Einfache Konfiguration über Umgebungsvariablen oder Dateien

  • Netzwerk und Volumes: Automatische Einrichtung von Netzwerken und Datenpersistenz

Mit Docker Compose können komplexe Anwendungen (wie eine Webanwendung mit Datenbank und Cache) in einer einzigen Datei definiert und mit docker-compose up gestartet werden.

5. Sie verstehen den Aufbau einer YAML-Datei und können eigene YAML-Dateien erstellen

YAML (YAML Ain’t Markup Language) ist ein menschenlesbares Datenserialiserungsformat, das in Docker Compose verwendet wird.

Grundlegende YAML-Syntax:

  • Kommentare beginnen mit #

  • Key-Value-Paare werden mit Doppelpunkt getrennt: key: value

  • Listen beginnen mit einem Bindestrich:

    - item1
    - item2
    
  • Einrückungen werden mit Leerzeichen (nicht Tabs) vorgenommen und sind bedeutungsvoll

  • Komplexe Strukturen werden durch Einrückungen dargestellt:

    person:
      name: John
      skills:
        - python
        - docker
    

Für Docker Compose ist die Struktur standardisiert mit:

  • version: Die Compose-Dateiversion

  • services: Die zu erstellenden Container

  • networks: Benutzerdefinierte Netzwerke

  • volumes: Persistente Daten-Volumes

  • secrets: Sichere Speicherung von Passwörtern

6. Sie können Docker Compose anwenden

Die Anwendung von Docker Compose umfasst:

  1. Erstellung einer docker-compose.yml-Datei im Projektverzeichnis:

    version: "3.8"
    services:
      web:
        image: nginx:latest
        ports:
          - "8080:80"
      database:
        image: mariadb
        environment:
          MYSQL_ROOT_PASSWORD: example
          MYSQL_DATABASE: mydb
    
  2. Starten der Anwendung mit:

    docker-compose up -d
    
  3. Stoppen der Anwendung mit:

    docker-compose down
    

Wichtige Service-Konfigurationen in docker-compose.yml:

  • image: Das zu verwendende Docker-Image

  • build: Das Verzeichnis mit dem Dockerfile (Alternative zu image)

  • ports: Port-Weiterleitungen (Host:Container)

  • volumes: Gemountete Datei-Volumes

  • environment: Umgebungsvariablen

  • networks: Zugewiesene Netzwerke

  • depends_on: Startabhängigkeiten zu anderen Diensten

7. Sie verstehen wie in Docker Compose mit Passwörtern oder sonstigen geheimen Informationen umgegangen wird

Docker Compose bietet mehrere Möglichkeiten zum Umgang mit vertraulichen Daten:

  1. Umgebungsvariablen in der docker-compose.yml:

    services:
      database:
        image: mariadb
        environment:
          MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
    

    Die Variable DB_PASSWORD kann in einer .env-Datei definiert werden:

    DB_PASSWORD=supersecure
    
  2. Secrets: Eine sicherere Methode für vertrauliche Daten:

    services:
      db:
        image: mysql:latest
        environment:
          MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_root_password
        secrets:
          - db_root_password
    
    secrets:
      db_root_password:
        file: db_root_password.txt
    

    Hier wird das Passwort aus der Datei db_root_password.txt gelesen und dem Container als Datei unter /run/secrets/db_root_password bereitgestellt.

Der Vorteil bei Secrets liegt in der Trennung sensibler Daten von der Konfiguration und der sicheren Verwaltung im Container-Dateisystem, wodurch die Passwörter nie in Logs oder der Kommandozeile sichtbar sind.