Mit Docker lässt sich sehr leicht ein Entwicklungsserver für wordpress aufbauen. Auf ihm kann man beliebig installieren, löschen und testen, ohne dass ein Produktivsystem beeinträchtigt wird. Docker sorgt dafür, dass er auch schnell mal wieder frisch aufgesetzt werden kann, sollte einmal etwas schief gehen.
Docker ist ja bereits eingerichtet. Ein nginx Webserver und eine MariaDB laufen schon für NextCloud. Beides kann auch für die wordpress-Umgebung mitgenutzt werden. Was fehlt, ist zunächst eine Datenbank für die wordpress-Installation.
MariaDB für wordpress vorbereiten
In der Datenbank-Server muss lediglich eine Datenbank und ein zusätzlicher Nutzer für wordpress angelegt werden. Das erledigt man am besten in der Docker-Shell:
host# docker exec -it mariadb bash
docker# mysql -u root -p <mysql-root-passwort>
mysql# create database wordpress;
mysql# create user wordpress@localhost identified by '<mysql-nutzer-passwort>';
mysql# create user wordpress@'%' identified by '<mysql-nutzer-passwort>';
mysql# grant all privileges on wordpress.* to wordpress@localhost;
mysql# grant all privileges on wordpress.* to wordpress@'%';
wordpress unter Docker
Das offizielle wordpress-Docker-Image ist mit der omv-Docker-GUI schnell heruntergeladen: unter „Docker Images” den Knopf „Image bereitstellen” drücken und „wordpress” als Quelle eingeben. Das lädt das aktuelle offizielle wordpress-Image; unser watchtower sorgt später dafür, dass auch updates auf das jeweils letzte Image ausgeführt werden.
Jetzt muss der wordpress-Container noch so konfiguriert werden, dass er die Datenbank nutzen kann und über den Webserver von außen erreichbar ist. Das geschieht wieder, indem wir wordpress in der Image-Liste der omv-Docker-GUI auswählen und auf „Image starten” klicken.
Im Startdialog machen wir folgende Angaben:
- Container Name: wordpress
- Restart Policy: always
- Netzwerkmodus: Bridge
- Hostname: wordpress.mydmain.tld
- Portweiterleitung:
- Host IP: 0.0.0.0
- Host Port: 8800
- Exposed Port: 80
- Protocol: tcp
- Zusätzliche Umgebungsvariable:
- WORDPRESS_DB_HOST: <db-server-adresse>
- WORDPRESS_DB_USER: wordpress
- WORDPRESS_DB_PASSWORD: <mysql-nutzer-passwort>
- WORDPRESS_CONFIG_EXTRA:
define(‘WP_HOME’,‘https://wordpress.mydmain.tld ’);
define(‘WP_SITEURL’,‘https:// wordpress.mydmain.tld ’);
- Volumes and Bind mounts:
- Host path: /container/wordpress
- Container path: /var/www/html
Im Container bedient wordpress den Port 80. Da dieser extern nicht verfügbar ist, sorgt die Bridge dafür, dass er auf den externen Port 8800 umgesetzt wird.
Unter WORDPRESS_CONFIG_EXTRA wird WP_HOME und WP_SITEURL so definiert, wie sie von „außen” aufgerufen werden, sonst trägt wordpress die Angaben beim ersten Start mit der falschen Portnummer in die Datenbank ein.
Um auch an die wordpress-Daten unter /var/www/html des Docker-Containers zu kommen, werden sie über ein Volume-mount auf das Verzeichnis /container/wordpress des Hosts umgeleitet.
WORDPRESS_DB_HOST zeigt auf den MySQL-DB-Server, unter dem der MariaDB-Container erreichbar ist; im meinem Fall wäre das der Docker-Host selbst. Das WORDPRESS_DB_PASSWORD muss entsprechend des im MariaDB-Container genutzten gesetzt werden.
Der Container wird automatisch sofort nach dem Speichern der Konfiguration gestartet.
Reverse Proxy für nginx
Der Hostname wordpress.mydomain.tld (der natürlich an die eigene Domain angepasset werden muss) wird im DNS so eingerichtet, dass er auf die Adresse des Webservers auflöst. nginx kümmert sich dann um die Weiterleitung auf den entsprechenden Port.
Wie schon bei NextCloud muss im nginx-Dienst auch für wordpress ein eigener Reverse Proxy eingerichtet werden. Er leitet Anfragen an wordpress.mydomain.tld an den entsprechenden Port weiter, der dann schließlich von der Docker-Bridge an den korrekten Container durchgereicht wird.
Außerdem sorgt nginx dafür, dass der wordpress-Verkehr verschlüsselt wird und unverschlüsselte Anfragen auf den https-Port umgelenkt werden. Das SSL-Zertifikat muss zuvor in die omv-Konfiguration unter Zertifikate → Hinzufügen → Importieren eingetragen werden.
Den Proxy richten wir über Dienste → nginx → Server → Hinzufügen mit folgenden Angaben ein:
- Aktivieren
- Verzeichnis: keines
- Hosttyp: Namensbasiert
- Servername: wordpress.mydmain.tld
- SSL aktivieren
- Zertifikat: <auswählen>
- Only use SSL
- Zusätzliche Optionen:
location / {
proxy_pass http://127.0.0.1:8800;
proxy_http_version 1.1;
proxy_set_header Host $http_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;
proxy_redirect http:// https://;
}
Haben wir alles richtig gemacht, sollte nach dem Speichern und Aktivieren der Konfiguration unser wordpress jetzt unter https://wordpress.mydomain.tld erreichbar sein.
Zusätzlicher Tipp: spielt man während der Tests mit verschiedenen Konfigurationen, Adressen und Ports, hilft es ungemein, den Browser-Cache öfter zu leeren, sonst lenkt der Browser Anfragen hartnäckig auf zuvor genutzte URLs um. Insbesondere Chrome hat sich hier als sehr störrisch erwiesen.
Quellen:
- wordpress image on Docker Hub
- sitepoint.com: how to use the official docker wordpress image
Ein Kommentar