Erstellung des Docker Stacks

Kategorie: Docker / Projekt-Setup

Zuletzt aktualisiert: 28.11.2025


Das Herzstück unseres Projekts ist die Datei docker-compose.yml. Sie definiert unsere gesamte Infrastruktur als Code („Infrastructure as Code“). Hier legen wir fest, welche Container gestartet werden, wie sie vernetzt sind und wo Daten gespeichert werden.

Unser Stack besteht aus drei Hauptkomponenten:

  1. Traefik: Reverse Proxy & SSL-Manager.
  2. MariaDB: Die Datenbank für WordPress.
  3. WordPress: Die eigentliche Wiki-Anwendung.

Vorbereitungen

Bevor die YAML-Datei erstellt wird, muss eine leere Datei für die SSL-Zertifikate angelegt werden. Traefik benötigt hierfür spezielle Berechtigungen, sonst startet der Container nicht.

# 1. Projektordner erstellen (falls nicht vorhanden)
mkdir -p ~/projekt
cd ~/projekt

# 2. Leere Datei für Zertifikate anlegen
touch acme.json

# 3. Berechtigungen setzen (Nur der Besitzer darf lesen/schreiben - PFLICHT für Traefik!)
chmod 600 acme.json
Code-Sprache: PHP (php)

Die Konfigurationsdatei

Erstellen Sie die Datei docker-compose.yml im Projektordner:

nano docker-compose.yml
Code-Sprache: CSS (css)

Fügen Sie den folgenden Inhalt ein:

services:
  # -------------------------------------------------------
  # SERVICE 1: TRAEFIK (Reverse Proxy & SSL)
  # -------------------------------------------------------
  traefik:
    image: traefik:latest
    container_name: traefik
    restart: always
    command:
      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
      # Automatische Weiterleitung von HTTP auf HTTPS
      - "--entrypoints.web.http.redirections.entryPoint.to=websecure"
      - "--entrypoints.web.http.redirections.entryPoint.scheme=https"
      # Let's Encrypt Konfiguration (Resolver)
      - "--certificatesresolvers.myresolver.acme.tlschallenge=true"
      - "--certificatesresolvers.myresolver.acme.email=fritz_phil.student@bs-an.de"
      - "--certificatesresolvers.myresolver.acme.storage=/acme.json"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      - "./acme.json:/acme.json"
    networks:
      - proxy-net

  # -------------------------------------------------------
  # SERVICE 2: DATENBANK (MariaDB)
  # -------------------------------------------------------
  db:
    image: mariadb:latest
    container_name: wordpress-db
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: Schule1
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wp_user
      MYSQL_PASSWORD: Schule1
    volumes:
      - db_data:/var/lib/mysql
    networks:
      - internal-net

  # -------------------------------------------------------
  # SERVICE 3: WORDPRESS (Applikation)
  # -------------------------------------------------------
  wordpress:
    image: wordpress:latest
    container_name: wordpress-app
    restart: always
    depends_on:
      - db
    environment:
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_USER: wp_user
      WORDPRESS_DB_PASSWORD: Schule1
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - wp_data:/var/www/html
    networks:
      - internal-net
      - proxy-net
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.wp.rule=Host(`wordpressbsan.ddnsgeek.com`)"
      - "traefik.http.routers.wp.entrypoints=websecure"
      - "traefik.http.routers.wp.tls.certresolver=myresolver"
      # WICHTIG: Zwingt Traefik, das Proxy-Netzwerk zu nutzen (verhindert 504 Gateway Timeout)
      - "traefik.docker.network=projekt_proxy-net"

volumes:
  db_data:
  wp_data:

networks:
  proxy-net:
  internal-net:
Code-Sprache: YAML (yaml)

Erklärung der Komponenten

Netzwerk-Architektur

Wir nutzen zwei getrennte Netzwerke für erhöhte Sicherheit:

  • proxy-net: Hier kommunizieren Traefik und WordPress (öffentlich erreichbar).
  • internal-net: Hier kommunizieren WordPress und die Datenbank. Die Datenbank ist somit vom Internet isoliert.

Labels (Service Discovery)

Der WordPress-Container nutzt „Labels“, um sich bei Traefik zu registrieren.

  • Host(...): Legt fest, unter welcher Domain das Wiki erreichbar ist.
  • tls.certresolver: Weist Traefik an, automatisch ein SSL-Zertifikat via Let’s Encrypt zu beziehen.
  • traefik.docker.network: Gibt explizit an, welches Netzwerk für die Weiterleitung genutzt werden soll, um Routing-Fehler zu vermeiden.

Volumes (Persistenz)

Damit unsere Daten auch Container-Updates überstehen, nutzen wir Docker Volumes:

  • db_data: Speichert die Datenbankinhalte.
  • wp_data: Speichert WordPress-Dateien (Uploads, Plugins).

Projekt starten

Nachdem die Datei erstellt ist, wird der Stack mit folgendem Befehl gestartet:

docker compose up -d

Um den Status der Container zu überprüfen:

docker compose ps

Nächste Schritte:

  • Einrichtung und Anpassung von WordPress (Wiki-Theme)
  • Fehlersuche und Logs

Schreibe einen Kommentar 0

Your email address will not be published. Required fields are marked *