WordPress Docker Development Environment mit SSL und lokaler Domain einrichten

1. Vorarbeit 👨🏭
- Herunterladen von Docker-Desktop hier: https://www.docker.com/products/docker-desktop/
- Aktuelle Version von WordPress herunterladen: https://wordpress.org/download/
- Wenn du möchtest kannst du unser Setup von unserem dafür eingerichteten Github-Repository herunterladen: https://github.com/webviaofficial/wordpressdocker
2. Ordnerstruktur anlegen 📁
Erstelle einen Projektordner in dem folgende Unterordner und Dateien liegen. Die Dateien localhost.crt und localhost.key werden im nächsten Schritt via Terminal erzeugt. Das heruntergeladene WordPress muss in den gleichnamigen Ordner entpackt werden.
.
├── docker-compose.yml
├── certs/
│ ├── localhost.crt
│ └── localhost.key
├── apache/
│ └── ssl.conf
├── db-data/
├── wordpress/
├── php.ini
└── .env
3. Lokale Domain anlegen 🌐
Um eine eigene Domain in der Entwicklungsumgebung auf localhost verwenden zu können, muss diese in der hosts-Datei hinterlegt werden. Im Finder am Mac wird über „Gehe zu“ > „Gehe zu Ordner“ > „/etc/hosts“ eingeben, zu der hosts-Datei navigiert. Als Domain kann z.B. der Domain-Name in Production mit .test als Top-Level-Domain verwendet werden. Der Eintrag sieht dann wie folgt aus:
127.0.0.1 myuseddomain.test
4. SSL-Zertifikate generieren 🔐
Im Ordner „certs“ im Terminal folgenden Befehl ausführen (dies ist natürlich auch an anderer Stelle möglich, nur müssen dann die localhost.crt- und localhost.key-Dateien in den Ordner kopiert werden). Beim letzten Parameter müssen die eigenen passenden Werten angegeben werden.
mkdir -p certs
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout certs/localhost.key -out certs/localhost.crt \
-subj "/C=DE/ST=DeinBundesland/L=DeineStadt/O=MeineFirma/CN=localhost"
5. Apache-Server SSL-Konfiguration 🗄️
Folgende Apache-Konfigurations-Datei muss erstellt werden, damit die erstellten Zertifikate in den Docker-Container gemountet werden können, https aktiviert und http auf https weitergeleitet wird.
Diese Datei benennen wir „ssl.conf“ und wird im „apache“-Ordner abgelegt.
ServerName localhost
<VirtualHost *:443>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/localhost.crt
SSLCertificateKeyFile /etc/apache2/ssl/localhost.key
<Directory /var/www/html>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
Redirect permanent / https://localhost/
</VirtualHost>
6. .env-Datei 📄
Die Environment-Datei wird dazu verwendet, um Variablen, die in der Docker-Konfigurations-Datei verwendet werden, anzulegen. Für die lokale Entwicklungsumgebung ist es natürlich egal, aber in Production sollte sie niemals in das Git-Repository gepusht werden.
Als HOSTNAME wird hier die zuvor in die hosts-Datei eingetragene Domain verwendet. Als CONTAINER_NAME der Einfachheit halber die Second-Level-Domain.
Als DATABASE_NAME kann wieder die Second-Level-Domain oder einfach ein Projektname verwendet werden. Die Definition von DATABASE_USER, DATABASE_PASSWORD und DATABASE_ROOT_PASSWORD sind in der Development-Umgebung relativ egal und können auch verhältnismäßig einfach gewählt werden. So sieht der Inhalt der Datei dann aus:
DATABASE_NAME=myuseddomain
DATABASE_USER=wp_user_xyz
DATABASE_PASSWORD=wp_password_xyz
DATABASE_ROOT_PASSWORD=root_password_xyz
HOSTNAME=myuseddomain.test
CONTAINER_NAME=myuseddomain
7. Die Docker-Konfigurations-Datei docker-compose.yml, der Kern des Setups 📄
In der Docker-Konfigurationsdatei docker-compose.yml wird die dreiteilige lokale WordPress-Entwicklungsumgebung mit YAML definiert. Dazu werden 3 Services definiert: die Datenbank, phpmyadmin zur Datenbankverwaltung und ein WordPress-Service von Docker. PHP 8.2 ist die höchste PHP-Version, die von WordPress aktuell (Stand Juli 2025) vollständig unterstützt wird, deswegen wird diese ausgewählt und MariaDB als relationale Datenbank, die vollständige Open Source ist (ein Ableger von MySQL und u.a. von Wikipedia verwendet).
services:
database:
image: mariadb
restart: unless-stopped
ports:
- 3306:3306
env_file: .env
environment:
MYSQL_ROOT_PASSWORD: '${DATABASE_ROOT_PASSWORD}'
MYSQL_DATABASE: '${DATABASE_NAME}'
MYSQL_USER: '${DATABASE_USER}'
MYSQL_PASSWORD: '${DATABASE_PASSWORD}'
volumes:
- ./db-data:/var/lib/mysql
networks:
- wordpress-network
deploy:
resources:
limits:
memory: 2048m
phpmyadmin:
depends_on:
- database
image: phpmyadmin/phpmyadmin
restart: unless-stopped
ports:
- 8081:80
env_file: .env
environment:
PMA_HOST: database # use this host for installing WordPress
DATABASE_ROOT_PASSWORD: '${DATABASE_ROOT_PASSWORD}'
networks:
- wordpress-network
wordpress:
depends_on:
- database
image: wordpress:6.8.2-php8.2-apache
restart: unless-stopped
ports:
- 8080:80
- 8443:443
env_file: .env
environment:
WORDPRESS_DB_HOST: database:3306 # use the same name as database service
WORDPRESS_DB_NAME: '${DATABASE_NAME}'
WORDPRESS_DB_USER: '${DATABASE_USER}'
WORDPRESS_DB_PASSWORD: '${DATABASE_PASSWORD}'
volumes:
- ./wordpress:/var/www/html/
- ./certs:/etc/apache2/ssl
- ./apache/ssl.conf:/etc/apache2/sites-available/000-default.conf:ro
- ./php.ini:/usr/local/etc/php/conf.d/uploads.ini
networks:
- wordpress-network
command: >
bash -c "
a2enmod ssl rewrite &&
apache2-foreground
"
volumes:
db-data:
networks:
wordpress-network:
driver: bridge
7. 1 Überblick über die Dienste (Services) 🔍
7.1.1 Database (MariaDB) 🛢️
Aufgabe:
- Stellt die relationale Datenbank zur Verfügung, die WordPress benötigt.
Details:
image: mariadb
- Nutzt neueste MariaDB
ports:
- 3306:3306
- Öffnet Port 3306 für Datenbankverbindungen (z. B. von phpMyAdmin oder WordPress).
env_file: .env
- Lädt Umgebungsvariablen aus einer
.env
-Datei.
environment:
MYSQL_ROOT_PASSWORD: '${DATABASE_ROOT_PASSWORD}'
MYSQL_DATABASE: '${DATABASE_NAME}'
MYSQL_USER: '${DATABASE_USER}'
MYSQL_PASSWORD: '${DATABASE_PASSWORD}'
- Initialisiert Datenbank mit Benutzer, Passwort und Root-Passwort aus
.env
.
volumes:
- ./db-data:/var/lib/mysql
- Speichert Daten persistent im lokalen Ordner
./db-data
.
networks:
- wordpress-network
- Ist Teil eines benutzerdefinierten Netzwerks für die interne Kommunikation.
deploy:
resources:
limits:
memory: 2048m
- Begrenzung des Arbeitsspeichers auf 2 GB
7.1.2 Phpmyadmin 🧩
Aufgabe:
- Web-Oberfläche zur Verwaltung der MariaDB-Datenbank.
depends_on:
- database
- Startet erst, wenn
database
läuft.
ports:
- 8081:80
- Erreichbar unter
http://localhost:8081
environment:
PMA_HOST: database
DATABASE_ROOT_PASSWORD: '${DATABASE_ROOT_PASSWORD}'
- Verbindet sich mit dem
database
-Service über den Container-Namen im Docker-Netzwerk. - Nutzt das Root-Passwort aus
.env
.
7.1.3 WordPress 🌐
Aufgabe:
- Der eigentliche WordPress-Webserver mit Apache und PHP, plus HTTPS/SSL-Support.
image: wordpress:6.8.2-php8.2-apache
- Verwendet ein offizielles WordPress-Image von Docker mit PHP 8.2 und Apache-Webserver.
ports:
- 8080:80
- 8443:443
- Port 8080 für HTTP, 8443 für HTTPS (über selbst-signiertes Zertifikat).
environment:
WORDPRESS_DB_HOST: database:3306
WORDPRESS_DB_NAME: '${DATABASE_NAME}'
WORDPRESS_DB_USER: '${DATABASE_USER}'
WORDPRESS_DB_PASSWORD: '${DATABASE_PASSWORD}'
- Verbindet WordPress mit der Datenbank (per Umgebungsvariablen aus
.env
).
volumes:
- ./wordpress:/var/www/html/
- ./certs:/etc/apache2/ssl
- ./apache/ssl.conf:/etc/apache2/sites-available/000-default.conf:ro
- ./php.ini:/usr/local/etc/php/conf.d/uploads.ini
- Bindet lokale Verzeichnisse/Dateien in den Container ein:
./wordpress
: Enthält die WordPress-Dateien../certs
: Enthält SSL-Zertifikate (z. B.apache.key
undapache.crt
).ssl.conf
: Eigene Apache-Konfiguration mit aktivem SSL.- php.ini: Eigene PHP-Konfiguration zur Erhöhung der Upload-Größe
command: >
bash -c "
a2enmod ssl rewrite &&
apache2-foreground
"
- Aktiviert das Apache-Module
ssl
undrewrite
. - Startet Apache im Vordergrund (Docker benötigt das für Prozessverwaltung).
7.1.5 Netzwerk 📡
networks:
wordpress-network:
driver: bridge
Alle drei Services kommunizieren intern über dieses Docker-Netzwerk. Das verhindert unnötige Portfreigaben nach außen.
7.1.6 Volumes 📦
volumes:
db-data:
- Named Volume für MariaDB-Daten, damit sie beim
docker-compose down
(dem Herunterfahren von Docker) erhalten bleiben (außer sie werden mit dem Parameter-v
gelöscht).
8. php.ini
Um nach der WordPress-Installation eventuell große Backups einspielen zu können, muss über die php.ini die Upload-Größen höher gesetzt werden. Diese sind standardmäßig nur auf 2MB gesetzt.
upload_max_filesize = 2048M
post_max_size = 2048M
memory_limit = 4096M
upload_max_filesize = 2048M
- Maximale Größe einer einzelnen hochgeladenen Datei
post_max_size = 2048M
- Maximale Größe aller Daten, die per POST gesendet werden (Formulardaten, Dateien, etc.)
- Muss gleich groß oder größer sein als
upload_max_filesize
memory_limit = 4096M
- Maximaler RAM, den ein PHP-Skript verbrauchen darf
- Muss groß genug sein, um z. B. große Uploads oder Bildverarbeitung zu schaffen
9. Endpunkte nach dem Start ✅
Service | URL |
---|---|
WordPress | http://localhost:8080, myuseddomain.test:8080 |
WordPress SSL | https://localhost:8443, myuseddomain.test:8443 |
phpMyAdmin | http://localhost:8081, myuseddomain.test:8081 |
10. Docker starten 🚀
Mit docker-compose up im Terminal im Projektordner wird der Docker-Container gestartet. Mit „docker-compose down“ wieder gestoppt.
11. WordPress Installation 📥
Nach dem Start von Docker, sollte über https://localhost:8443 beziehungsweise myuseddomain.test:8443 die WordPress-Installation angesteuert werden und in der berühmten 5-Minuten-Installation von WordPress schnell aufgesetzten werden können. Als Datenbank-Host bei der WordPress-Installation müssen mit der oben verwendeten Konfiguration „database“ und die Werte aus der .env-Datei verwendet werden.
Ist bereits eine WordPress-Website vorhanden, die nun mit Docker verwendet werden soll, empfiehlt sich das WordPress-Plugin Duplicator zum Erstellen eines Backups, das dann über das WordPress-Dashboard über den Menüpunkt „Import“ in der Pro-Version des Plugins importiert werden kann. Dieser Weg hat sich bei unseren Projekten als der beste herauskristallisiert.
12. Quellen und zusätzliche Ressourcen
- https://bloggerpilot.com/
- https://www.youtube.com/watch?v=gEceSAJI_3s
- https://hub.docker.com/_/mariadb
- https://duplicator.com/
- https://www.docker.com/
- https://wordpress.org/download/
- https://github.com/webviaofficial/wordpressdocker
- https://make.wordpress.org/hosting/handbook/compatibility/#wordpress-php-mysql-mariadb-versions