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:
- Traefik: Reverse Proxy & SSL-Manager.
- MariaDB: Die Datenbank für WordPress.
- 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