Softwareentwicklung und Managed Hosting
ANEXIA
FEB
16
2017

WordPress Entwicklung mit Docker Compose

Geschrieben am  16. Februar 2017 von Harald Nezbeda

Entwicklungsumgebungen sind unerlässlich, um neue Software zum Leben zu erwecken. Jede Technologie hat ein eigenes Set an Werkzeugen, die man benutzen kann, um so eine Umgebung zu erschaffen. Und so ist es auch in der Webentwicklung. Früher wurden dazu Software-Stacks wie zum Beispiel XAMPP verwendet oder der Entwickler hat sich alles manuell auf einer virtuellen Maschine konfiguriert. Im besten Fall konnten diese virtuellen Maschinen als Vorlagen exportiert werden. Die Verwendung von benutzerdefinierten Skripten auf diesen Vorlagen ermöglichte die automatische Installation spezifischer Pakete. Um unser Leben zu erleichtern, haben wir dafür Vagrant eingesetzt. Damit ist es möglich, die Entwicklungsumgebung für ein bestimmtes Projekt mit alle beteiligten Entwicklern zu teilen. Allerdings dauert es einige Zeit, um die Skripte zu schreiben und auch die Laufzeit und die Speicherauslastung sind begrenzt (da dieses System VirtualBox verwendet). Dazu kommt, dass es zeitaufwendig ist, mehrere Instanzen der Maschine zu erstellen und Verbindungen zwischen ihnen herzustellen. Manuell konfigurierte VMs bringen also einige Probleme mit sich. Aber es gibt eine Lösung: hier kommt Docker ins Spiel.

Mit Docker sind die Skripte, die man für das Erstellen der Umgebungen benötigt, viel einfacher zu lesen und zu verwalten. Auch hat man die Möglichkeit Dockerimages zu erweitern, die von anderen Skripten erstellt wurden (das bietet die Möglichkeit zentralisiert zu arbeiten und weniger Code in den Docker-Dateien zu schreiben). Die finale Komponente in dieser Struktur ist Docker Compose. Dieses Paket ermöglicht die Erstellung einer Konfigurationsdatei, in der alle Befehle, die normalerweise in der Konsole ausgeführt werden, besser lesbar und erweiterbar geschrieben werden können. Es bietet auch die Möglichkeit, Container zu verbinden. So können Komponenten erstellt werden, die nur für einen Zweck verantwortlich sind: Webserver, Datenbank, E-Mail-Versand o.ä.

Mit dieser Power können wir einen einfacheren Workflow für WordPress Projekte implementieren, zum Beispiel bei der Entwicklung eines Plugins, eines Themes oder sogar bei einem vollständigen Projekt das auf WordPress basiert. Dafür wird WPDC (WordPress Docker Compose) verwenden: Hier nachzulesen in meinem GitHub directory.

Im Anschluss will ich hier nun vorstellen, wie Entwicklungsumgebungen für WordPress mit Docker Compose aufgesetzt werden können: Einmal für ein vollständig neues Projekt, einmal wie ein bestehendes Projekt importiert werden kann und einmal, wie die Entwicklungsumgebung für ein WordPress Plugin oder Theme aufgesetzt werden kann.

1. Starten eines neuen Projekts

Bei der Entwicklung eines neuen Projektes, das auf WordPress basiert, ist der Zugriff auf das gesamte wp-content Verzeichnis erforderlich, da hier die Arbeit eines Entwicklers stattfindet (Themes, Plugins, Übersetzungen usw.). Die Standardkonfiguration für die Volumes (./wp-app:/var/www/html) ordnet alle Dateien aus dem WordPress-Container im Verzeichnis /var/www/html dem Verzeichnis wp-app auf dem aktuellen Arbeitsverzeichnis. Dies bedeutet auch Zugriff auf den Kern von WordPress und Konfigurationsdateien. Dies bietet einen großen Vorteil bei der Durchführung von manuellen Updates und der Sicherung von Dateien in einem Versionskontrollsystem. So wird sichergestellt, dass die Komponenten noch funktionieren. Es gibt auch die Möglichkeit, das wp-content-Verzeichnis (./wp-content: /var/www/html/wp-content) direkt zuzuordnen. Durch die Verwendung dieser Konfiguration wird der WordPress-Kern nicht in das Versionskontrollsystem gelangen, aber es besteht das Risiko, mit einem defekten Projekt zu enden, wenn das Theme oder eines der Plugins nicht mit dem neuen Kern von WordPress kompatibel ist. Dies sollte für ein laufendes Projekt kein Problem sein, da es sowieso auf dem neuesten Kern aufbaut. Kommt es aber zu längeren Pausen im Projekt, können solche Probleme auftreten. Durch die Kontrolle über die Kern-Updates kann der Code besser verwaltet und getestet werden.

Die Datei docker-compose.yml verwendet die offiziellen WordPress- und MySQL-Dockerimages in den neuesten Versionen. Sie kann aber auch so konfiguriert werden, dass sie näher an den tatsächlichen Server-Anforderungen des Projekts ist. Das aktuelle wordpress:latest Dockerimage verwendet PHP 5.6 mit einem Apache-Server. Soll ein anderes Dockerimage verwendet werden, ist das mit Änderung des tags „latest“ auf „PHP7.0-Apache“, das PHP 7.0 bietet, möglich. Gleiches gilt für die Datenbank. Es gibt sogar eine Option um MariaDB anstelle von MySQL zu verwenden.

Nach der Entscheidung mit dem Team, wie die Volumes konfiguriert werden sollen und welche Dockerimages verwendet werden, ist es Zeit, die Container zu starten. Öffne ein Terminal, gehe in das Verzeichnis der docker-compose.yml Datei und führe folgenden Konsolen Befehl aus:

docker-compose up

Dadurch werden zwei neue Ordner im Arbeitsverzeichnis erstellt: Einer für die WordPress App (wp-app) und einer für die Datenbank (wp-data), der für den Moment leer sein wird.
Aus Gründen der Benutzerfreundlichkeit empfiehlt es sich, einen Hostnamen in der /etc/hosts Datei zu definieren, der auf 127.0.0.1 (default auf der docker-compose.yml) abgebildet wird, statt direkt die IP-Adresse im Browser zu verwenden. Danach kann die Seite im Browser geöffnet werden, um die WordPress-Installation abzuschließen.
Ab jetzt ist die Entwicklungsumgebung gesetzt und jeder kann mit der Konfiguration und Codierung des WordPress-Projekts beginnen.

Von Zeit zu Zeit sollte eines der Teammitglieder in Erwägung ziehen, eine Reihe von Testdaten in die Datenbank zu schreiben, auf die alle Entwickler Zugriff haben können. Es gibt ein kleines Shell-Skript mit dem Namen export.sh. Wenn du dies in der Konsole ausführst, wird ein Dump aus dem Datenbankcontainer in das wp-data-Verzeichnis erstellt. Dies ermöglicht einen Dump im Versionskontrollsystem zu haben.
Um die Datenbank im Dump-Zustand zu haben, genügt es, die Container zu entfernen und neu zu erstellen:

docker-compose down
docker-compose up

Das wp-data-Verzeichnis wird nun verwendet, wenn der Container für die Datenbank erstellt wird, und lädt alle darin verfügbaren SQL-Dateien (stelle sicher, dass nur eine Dump-Datei vorhanden ist).

2. Fortsetzung eines Projekts aus einer vorhandenen Quelle

Dieser Fall tritt ein, wenn bereits ein vollständiges WordPress-Projekt (einschließlich Kern) und ein SQL-Dump verfügbar sind. Erstelle ein wp-app-Verzeichnis und kopiere alle WordPress-Dateien hinein. Danach erstelle ein anderes Verzeichnis namens wp-data (dies basiert auf der Default-Konfiguration) und lege den Datenbank-Dump hinein. Achte darauf, passende Image-Tags zur docker-compose.yml-Datei hinzuzufügen, wenn andere PHP- oder MySQL-Versionen erforderlich sind. Danach kann die Entwicklungsumgebung gestartet werden:

docker-compose up

Nun ist ein Host-Eintrag erforderlich (wie oben beschrieben), den WordPress als neuen Host verwendet. Der einfachste Weg dazu ist die Definition von zwei Konstanten in der wp-config.php-Datei:

define('WP_HOME','http://wp-app.local');
define('WP_SITEURL','http://wp-app.local');

3. Entwicklung eines Themes oder Plugins

Mit Docker Compose ist es auch möglich, nur bestimmte Komponenten für WordPress, wie Themes und Plugins zu entwickeln. Alles was es braucht, ist eine richtige Konfiguration der Volumes in der docker-compose.yml-Datei.

Für Theme Entwicklung:

volumes:
- ./theme-name/trunk/:/var/www/html/wp-content/themes/theme-name

Für Plugin Entwicklung:

volumes:
- ./plugin-name/trunk/:/var/www/html/wp-content/plugins/plugin-name

Das Erstellen oder Fortführen der Entwicklung eines Themes oder Plugins funktioniert genauso wie für ein Projekt.

Fazit

Möglicherweise musst du einige Zeit aufbringen um Docker Compose zu installieren und dich zurecht zu finden mit den Befehlen von Docker, die die Entwicklungsumgebung zum Leben bringen. Es wird aber nicht all zu lange dauern und die Vorteile sind riesig. Dieses Prinzip kann auf alle WordPress-Projekte angewendet werden, und jedes Teammitglied kann davon profitieren und Zeit für den Entwicklungsprozess gewinnen. Wir sparen inzwischen auf jeden Fall viel Zeit und Nerven!