WordPress mit Varnish in Docker Ubuntu/Debian

WordPress mit Varnish, Apache und MariaDB auf dem eigenen Server oder VPS in Docker aufsetzen: Docker-Repository einbinden, die fertige docker-compose-Vorlage starten und anschließend Domain, Mailversand und Datenbank anpassen.

Ein aktuelles WordPress mit Varnish als Cache, Apache und MariaDB läuft in Docker nach einer Handvoll Befehlen. Diese Anleitung richtet sich an alle, die einen eigenen Server oder VPS mit Debian oder Ubuntu betreiben. Klassisches Webhosting (Strato, 1&1, All-inkl) behandelt sie nicht.

Du brauchst einen Benutzer mit Root- oder sudo-Rechten und ein paar Minuten Zeit. Docker selbst richtest du in den ersten Schritten aus dem offiziellen Repository ein.

Alle Befehle laufen auf dem Server, in einer SSH-Sitzung. Unter Linux und macOS reicht dafür das Terminal, unter Windows ein Programm wie PuTTY. Mit ssh user@ServerIP meldest du dich an. Wie du dich statt mit Passwort mit einem Schlüssel anmeldest, zeigt SSH Key erstellen. Wer erst ausprobieren will, führt die Schritte zunächst auf dem eigenen Rechner aus und wiederholt sie später auf dem Server.

Den Anfang machen die Pakete, die das Docker-Repository und die Vorlage voraussetzen:

sudo apt update

sudo apt install ca-certificates curl git nano -y

Dann holst du den GPG-Schlüssel von Docker und bindest das Repository ein. Docker führt für Debian und Ubuntu getrennte Repositorys, linux/debian und linux/ubuntu (Installationsanleitung für Ubuntu). Welches davon gilt, lesen die Befehle aus /etc/os-release, ebenso den Codenamen deiner Version. So laufen sie unverändert auf allen Versionen, die Docker derzeit unterstützt: Debian 12 und 13 sowie die Ubuntu-LTS-Versionen ab 22.04. Wie in Dockers aktueller Anleitung landet der Schlüssel unter /etc/apt/keyrings und die Paketquelle in der Datei docker.sources.

sudo install -m 0755 -d /etc/apt/keyrings

sudo curl -fsSL https://download.docker.com/linux/$(. /etc/os-release && echo "$ID")/gpg -o /etc/apt/keyrings/docker.asc

sudo chmod a+r /etc/apt/keyrings/docker.asc

sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/$(. /etc/os-release && echo "$ID")
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF

sudo apt update

Jetzt installierst du Docker. Die erste Zeile räumt vorher Pakete ab, die Debian und Ubuntu selbst unter Namen wie docker.io oder docker-compose liefern. Unter Debian 13 bricht die Installation sonst mit einem Dateikonflikt ab. Auf einem frischen Server findet die Zeile nichts, und stehen die Pakete schon drauf, fragt apt vor dem Entfernen nach.

sudo apt remove $(dpkg --get-selections docker.io docker-compose docker-compose-v2 docker-doc docker-buildx podman-docker containerd runc 2>/dev/null | cut -f1)

sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

Compose kommt damit als docker-compose-plugin direkt von Docker. Der Befehl heißt docker compose, mit Leerzeichen statt Bindestrich. Ältere Anleitungen, auch frühere Fassungen dieser hier, installieren stattdessen das Paket docker-compose aus den Paketquellen der Distribution. Debian 12 und Ubuntu 24.04 liefern darüber Compose 1.29.2, Debian 13 Compose 2.26.1 (Debian, Ubuntu). Docker zählt es in seiner Anleitung für Debian zu den inoffiziellen Paketen, die vor der Installation weichen müssen, deshalb steht es oben in der ersten Zeile.

Die eigentliche Einrichtung übernimmt eine Docker-Vorlage auf GitHub. Sie startet vier Container: WordPress auf Debian mit Apache und PHP 8.5, davor Varnish als Cache, dazu MariaDB und phpMyAdmin. Für die Vorlage legst du einen Ordner an, in dem alle Docker-Daten liegen, und klonst sie hinein. Der Ordner liegt unter /var und gehört root, deshalb laufen mkdir und git clone mit sudo.

Gib Folgendes in deine Shell ein:

sudo mkdir /var/docker

cd /var/docker

sudo git clone https://github.com/studplus/wordpress_docker.git

cd wordpress_docker

Im Ordner wordpress_docker liegen jetzt die docker-compose.yml und die Unterordner mit den Einstellungen für WordPress, Varnish und MariaDB.

Ob alles läuft, prüfst du mit einem ersten Start. Soll die Installation danach gleich produktiv laufen, ändere vorher die Zugangsdaten der Datenbank in der docker-compose.yml (mehr dazu weiter unten). MariaDB übernimmt sie nur beim allerersten Start, solange der Datenordner leer ist (MariaDB-Image auf Docker Hub). Gestartet wird mit:

sudo docker compose up -d

Beim ersten Start baut Docker das WordPress-Image aus dem Dockerfile der Vorlage und lädt die fertigen Images für Varnish, MariaDB und phpMyAdmin herunter.

Sind alle Container gestartet, sieht die Ausgabe so aus:

Die Anfragen nimmt Varnish auf Port 80 entgegen. Im Browser rufst du deshalb die IP-Adresse deines Servers auf, bei einem Test auf dem eigenen Rechner http://0.0.0.0. Erscheint der Einrichtungsassistent von WordPress, läuft alles. Direkt, ohne Cache, antwortet WordPress auf Port 8080, phpMyAdmin auf Port 8081.

Damit WordPress unter deiner Domain läuft und Mails verschicken kann, passt du vier Dateien im Ordner custom-wordpress an und danach die docker-compose.yml. Das Dockerfile kopiert die vier Dateien beim Bauen ins Image. Änderungen daran greifen deshalb erst, wenn du das Image neu baust, etwa mit sudo docker compose up -d --build. Die Dateien gehören wie der ganze Ordner root, du öffnest sie deshalb mit sudo nano.

aliases legt fest, wohin Mails an lokale Konten gehen. Hinter root: trägst du eine Adresse deines Servers ein, an der du erkennst, woher eine Mail kommt. Hinter Wordpress: kommt die offizielle Adresse, etwa für Kunden. Die erste Zeile leitet postmaster auf diesen Eintrag weiter.

sudo nano custom-wordpress/aliases

Speichern und beenden: Strg+X, dann J (oder Y) und Enter drücken

app.conf ist die Apache-Konfiguration. Setze ServerAlias auf deine Domain, zum Beispiel meinedomain.de, und ServerAdmin auf deine E-Mail-Adresse.

cronjob ruft jede Minute wp-cron.php auf. Ersetze darin http://0.0.0.0 durch deine Adresse, also etwa https://meinedomain.de.

msmtprc regelt den Mailversand. Ich empfehle dafür einen E-Mail-Dienst. Das kann ein gewöhnliches Postfach bei IONOS, STRATO oder GoDaddy sein oder ein SMTP-Anbieter wie Amazon SES, SendGrid oder Mailgun. Entferne die Raute (#) vor host, port, user und password. Bei host trägst du den SMTP-Server ein, zum Beispiel smtp.ionos.com, bei port zum Beispiel 587, dazu Benutzername und Passwort. Hinter from steht die Adresse, von der die Mails kommen.

docker-compose.yml: Ändere Benutzer und Passwort der Datenbank und den Namen unter MYSQL_DATABASE. In der Vorlage lautet jedes Passwort password, auch MYSQL_ROOT_PASSWORD. Die Ports kannst du hier ebenfalls anpassen.

Auf einem öffentlichen Server ist das mehr als Kosmetik. Die Vorlage veröffentlicht neben Port 80 auch 8080, 8081 und die Datenbank auf 3306. Veröffentlichte Ports sind bei Docker standardmäßig von außen erreichbar (Docker-Dokumentation), und ufw hilft dagegen nicht: Docker leitet den Verkehr um, bevor die Firewall-Regeln greifen (Docker und ufw). Schreibst du einen Port als 127.0.0.1:3306:3306, erreicht ihn nur noch der Server selbst. Welche Ports offen sind, zeigt Genutzte Ports in Linux anzeigen.

WordPress einrichten: Rufst du 0.0.0.0 oder deine Domain auf, startet der Einrichtungsassistent. Dort gibst du Datenbankname, Benutzer und Passwort so an, wie sie in der docker-compose.yml unter db stehen. Als Datenbank-Host genügt db. Compose meldet jeden Dienst unter seinem Namen bei einem internen DNS an (Networking in Compose), deshalb findet WordPress die Datenbank ohne IP-Adresse.

Wie du die Datenbank später sicherst und zurückspielst, steht in MariaDB-Backup und Wiederherstellung in Docker.

Viel Spaß!