WordPress mit Docker Compose installieren
Wie installieren Sie WordPress mit Docker Compose? MariaDB- und WordPress-Container, Passwörter in .env, Nginx und SSL, Upload-Limits, Backup und Updates.

Inhalt
WordPress mit Docker Compose zu installieren bedeutet, WordPress und die Datenbank als zwei Container zu betreiben, die in einer einzigen Datei definiert sind. Sie müssen auf dem Server weder PHP noch einen Webserver oder eine Datenbank installieren; alles kommt aus offiziellen Images. Sie können auf demselben Server mehrere Websites voneinander isoliert betreiben und eine Website auf einen neuen Server umziehen, indem Sie ihren Ordner und ihre Daten kopieren.
In dieser Anleitung erklären wir, wie Sie WordPress und MariaDB mit Docker Compose installieren, Passwörter sicher speichern, Nginx und SSL davorschalten, Upload-Limits einstellen sowie Backups und Updates durchführen. Ist Docker noch nicht installiert, folgen Sie zuerst unserer Anleitung Docker installieren.
Ordnerstruktur
Legen Sie einen Ordner für die Website an:
mkdir -p ~/seiten/ihredomain && cd ~/seiten/ihredomain
In diesem Ordner liegen drei Dateien: compose.yaml, .env und uploads.ini.
Schritt 1: Passwörter in die .env schreiben
Statt die Passwörter direkt in die Compose-Datei zu schreiben, speichern Sie sie in einer eigenen Datei .env:
DB_PASSWORD=ein-langes-zufaelliges-passwort
DB_ROOT_PASSWORD=ein-anderes-langes-zufaelliges-passwort
Zufällige Passwörter erzeugen Sie mit dem Befehl openssl rand -base64 24. Schützen Sie die Datei so, dass nur Sie sie lesen können: chmod 600 .env. Wenn Sie diesen Ordner in einem Git-Repository verwalten, nehmen Sie die Datei .env in die .gitignore auf.
Schritt 2: compose.yaml
services:
db:
image: mariadb:11
restart: unless-stopped
environment:
MARIADB_DATABASE: wordpress
MARIADB_USER: wordpress
MARIADB_PASSWORD: ${DB_PASSWORD}
MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
volumes:
- db:/var/lib/mysql
wordpress:
image: wordpress:php8.3-apache
restart: unless-stopped
depends_on:
- db
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: ${DB_PASSWORD}
WORDPRESS_CONFIG_EXTRA: |
if (isset($$_SERVER['HTTP_X_FORWARDED_PROTO']) && $$_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
$$_SERVER['HTTPS'] = 'on';
}
ports:
- '127.0.0.1:8080:80'
volumes:
- wp:/var/www/html
- ./uploads.ini:/usr/local/etc/php/conf.d/uploads.ini:ro
volumes:
db:
wp:
- db: Die MariaDB-Datenbank. Die Daten liegen im Volume
db; sie gehen auch dann nicht verloren, wenn der Container gelöscht wird. - wordpress: Das offizielle WordPress-Image (einschließlich PHP und Apache). WordPress-Dateien, Uploads und Plugins liegen im Volume
wp. 127.0.0.1:8080:80: Öffnet WordPress nur für den Server selbst. Der Zugriff von außen erfolgt über Nginx davor. Dass von Docker veröffentlichte Ports die Firewall umgehen können, erklären wir in unserer Anleitung Docker installieren.WORDPRESS_CONFIG_EXTRA: Sorgt dafür, dass WordPress richtig erkennt, wenn Nginx davor HTTPS verwendet; andernfalls kann es zu Weiterleitungsschleifen kommen. In der Compose-Datei wird das Zeichen$als$$geschrieben.- Der Datenbankport wird nicht veröffentlicht. WordPress erreicht die Datenbank unter dem Namen
dbüber das interne Netzwerk von Docker; die Datenbank wird überhaupt nicht nach außen geöffnet.
Schritt 3: Upload-Limits
Die Datei uploads.ini legt die Upload- und Speichergrenzen von PHP fest:
upload_max_filesize = 64M
post_max_size = 64M
memory_limit = 256M
max_execution_time = 120
Wofür diese Einstellungen gut sind, erklären wir in unserer Anleitung PHP-Version ändern.
Schritt 4: Starten
docker compose up -d
docker compose ps
Beide Container müssen den Status running haben. Beim ersten Start dauert die Vorbereitung der Datenbank einige Sekunden.
Schritt 5: Nginx und SSL
Schalten Sie auf dem Server Nginx als Reverse Proxy vor den WordPress-Container. /etc/nginx/sites-available/ihredomain.de:
server {
listen 80;
listen [::]:80;
server_name ihredomain.de www.ihredomain.de;
client_max_body_size 64M;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Aktivieren Sie die Website und holen Sie sich mit Certbot ein SSL-Zertifikat:
sudo ln -s /etc/nginx/sites-available/ihredomain.de /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
sudo certbot --nginx -d ihredomain.de -d www.ihredomain.de
client_max_body_size muss dem Upload-Limit in der Datei uploads.ini entsprechen; andernfalls bricht Nginx große Uploads mit dem Fehler 413 ab. Öffnen Sie anschließend die Adresse https://ihredomain.de und schließen Sie den Installationsassistenten von WordPress ab. Details zu Nginx und SSL finden Sie in unserer Anleitung Nginx installieren.
Backup
Ein Backup einer WordPress-Website besteht aus zwei Teilen: der Datenbank und den Dateien.
Datenbank:
docker compose exec -T db sh -c 'mariadb-dump -uroot -p"$MARIADB_ROOT_PASSWORD" wordpress' > db-$(date +%F).sql
Dateien (Volume wp):
docker run --rm -v ihredomain_wp:/data -v "$(pwd)":/backup alpine \
tar -czf /backup/wp-$(date +%F).tar.gz -C /data .
Die Namen der Volumes beginnen mit Ihrem Ordnernamen (etwa ihredomain_wp); den vollständigen Namen sehen Sie mit docker volume ls. Wie Sie Backups mit Cron automatisieren und an einem vom Server unabhängigen Ort aufbewahren, erklären wir in unserer Anleitung Server Backup.
Updates
- WordPress, Plugins und Themes: Da die Dateien im Volume liegen, werden sie wie gewohnt im Adminbereich aktualisiert.
- Images (PHP, Apache, MariaDB): Aktualisieren Sie die Images regelmäßig, um Systempakete und Sicherheitskorrekturen zu erhalten:
docker compose pull docker compose up -d
Ein Update des Images überschreibt Ihre WordPress-Dateien nicht. Erstellen Sie unbedingt ein Datenbank-Backup, bevor Sie die Hauptversion von MariaDB wechseln.
Mehrere Websites
Legen Sie für jede Website in einem eigenen Ordner eine eigene compose.yaml an und geben Sie jeder einen anderen lokalen Port (127.0.0.1:8081:80, 127.0.0.1:8082:80 …). Nginx davor leitet jede Domain an den richtigen Port weiter. Wenn jede Website ihren eigenen Datenbank-Container hat, wirkt sich ein Problem auf einer Website nicht auf die anderen aus.
WordPress mit Docker bei Nodesty
Die Pakete AMD Ryzen 9 9950X vServer von Nodesty erzeugen PHP-Seiten dank hoher Single-Core-Leistung schnell; mit vollem Root-Zugang betreiben Sie Docker, Nginx und mehrere WordPress-Websites auf demselben Server. NVMe-Speicher, DDoS-Schutz durch nShield und kostenlose tägliche Backups mit 7 Tagen Aufbewahrung sind im Paket enthalten. Wenn Sie ohne Serververwaltung nur eine WordPress-Website veröffentlichen möchten, sind unsere Webhosting-Pakete mit LiteSpeed die praktischere Wahl; die Installation erklären wir in unserer Anleitung WordPress installieren.
Häufig gestellte Fragen
Docker oder Webhosting für WordPress?
Wenn Sie nur eine WordPress-Website veröffentlichen möchten, ist Webhosting einfacher; Serververwaltung, Updates und Sicherheit übernimmt der Anbieter. Wenn Sie auf demselben Server mehrere Websites oder andere Dienste betreiben, die Umgebung vollständig kontrollieren und Websites leicht umziehen möchten, gibt Ihnen Docker mehr Flexibilität.
Muss ich beim WordPress-Update den Container austauschen?
Da die WordPress-Dateien in einem Volume liegen, aktualisieren Sie Core, Plugins und Themes wie gewohnt im Adminbereich. Ein Update des Images erneuert die PHP-Version und die Systempakete; Ihre WordPress-Dateien werden dabei nicht überschrieben.
Kann ich mehrere WordPress-Websites auf demselben Server betreiben?
Ja. Legen Sie für jede Website einen eigenen Ordner und eine eigene compose.yaml an und geben Sie jeder einen anderen lokalen Port. Nginx davor leitet die Anfrage anhand der Domain an den richtigen Container weiter. Wenn jede Website ihren eigenen Datenbank-Container hat, sind die Websites voneinander isoliert.
Ich erhalte den Fehler Error establishing a database connection. Warum?
Der WordPress-Container kann sich nicht mit der Datenbank verbinden. Prüfen Sie mit docker compose ps, ob der Datenbank-Container läuft, stellen Sie sicher, dass die Passwörter aus der .env in beiden Containern gleich sind, und warten Sie bei der ersten Installation einige Sekunden, bis die Datenbank bereit ist.
Ich habe das Passwort in der .env geändert, aber es funktioniert nicht. Warum?
Das MariaDB-Image legt Benutzer und Passwort nur fest, wenn die Datenbank zum ersten Mal erstellt wird. Gibt es das Datenbank-Volume bereits, wirkt sich die Änderung in der .env nicht auf den vorhandenen Benutzer aus. Sie müssen das Passwort in der Datenbank selbst ändern oder bei einer neuen Installation das Volume löschen.
Wo liegen meine hochgeladenen Dateien und Plugins?
Alle Dateien von WordPress, einschließlich Uploads und Plugins, liegen im Volume wp, das in der Compose-Datei definiert ist. Selbst wenn Sie den Container löschen und neu erstellen, gehen Ihre Dateien nicht verloren, solange das Volume bestehen bleibt.
Über den Autor
Nodesty-Team · Infrastruktur und Support
Das Nodesty-Team betreibt unsere Server, unser Netzwerk und unseren DDoS-Schutz im Alltag und beantwortet Support-Anfragen rund um die Uhr. Diese Ratgeber entstehen aus dieser Arbeit.
Verwandte Artikel

Linux Zeitzone und NTP: Serverzeit richtig einstellen
Wie stellen Sie Zeitzone und NTP auf einem Linux-Server ein? timedatectl, UTC oder Ortszeit, chrony und timesyncd, Cron, Logs, 2FA und Windows Server.

Ollama installieren: KI-Modelle auf dem eigenen Server betreiben
KI-Modelle mit Ollama auf dem eigenen Server betreiben: Installation, Wahl von Modell und RAM, API, Open WebUI, sicherer Zugriff und CPU-Auslastung.

Server Monitoring: Ressourcen, Dienste und Alarme im Blick
Wie richten Sie Server Monitoring ein? Was Sie überwachen sollten, Netdata, Uptime Kuma von außen, Prometheus und Grafana, Alarmschwellen und Logs.