Oft möchte man mit mehreren Kollegen an einem WordPress Theme oder Plugin arbeiten. Ein guter Weg um gegenseitiges Überschreiben von Dateien zu vermeiden ist git zu nutzen. Aber wie kann man dafür sorgen das sich nicht jeder mühselig eine eigene Lokale WordPress Installation einrichten muss?
Dafür eignet sich Docker hervorragend. Und es ist nicht einmal so kompliziert sich eine eigene docker-compose.yml zu erstellen, mit der jeder, der das Projekt von git auscheckt, direkt, mit einer Zeile in der Cmd, die Umgebung für die lokale Entwicklung starten kann.
Docker Toolbox Konfiguration
Wenn Ihr, wie ich, Eine Windows Version nutzt die von der aktuellen Docker Version nicht unterstützt wird, dann müsst Ihr die Docker Toolbox nutzen. Da die Docker Toolbox das Docker System in einer Virtuellen Maschiene startet, muss man noch dafür sorgen das die Docker Container Zugriff auf den Projekt Ordner haben in dem Ihr arbeitet. Projekte die man direkt im C:/User Ordner anlegt, funktionieren ohne Probleme, allerdings ist es nicht wirklich praktisch dort Projekte zu bearbeiten, da man dort zum erstellen von Dateien Administrator Rechte benötigt.
Den Projekt Ordner außerhalb des C:/User Ordner verfügbar machen
Um auf den Projekt Ordner außerhalb des C:/USer Ordner zugreifen zu können müsst Ihr den Ordner in der Virtuellen Maschiene als Shared Folder anlegen:
– Startet den Virtual Box Manager
– Klickt auf die Vituelle Maschiene in der Docker ausgeführt wird. (Oft default)
– Klickt auf den Ändern Button oben im Menü
– Im Fenster das sich öffnet müsst Ihr jetzt zu “Gemeinsame Ordner” gehen.
– Klickt auf das Symbol mit dem Ordner mit dem grünen Plus
– Wählt den Ordner in dem Euer Projekt liegt aus.
– Bestätigt die Eingabe.
Solltet Ihr die Docker Maschiene schon gestartet haben, stopt sie und startet sie erneut.
docker-machine stop
docker-machine start
Wenn Ihr die “normale” Docker Version nutzt müsst Ihr die Konfiguration für Ordner außerhalb von C:/Users nicht machen. Dort habt ihr per Default Zugriff.
Wenn Ihr Docker Toolbox nutzt, dann müsst Ihr in den folgenden docker-compose Informationen bei den volumes statt ./ den Namen, der in der Virtuellen Maschine für den Gemeinsamen Ordner angegeben wurde, eingeben.
Beispiel: Der Ordner “C:/projekte/meinprojekt” wurde in der Virtuellen Maschine mit dem namen “meinprojekt” angelegt.
# aus
volumes:
- ./dumps/databasedump_local_latest.sql:/docker-entrypoint-initdb.d/importdump.sql
# wird
volumes:
- meinprojekt/dumps/databasedump_local_latest.sql:/docker-entrypoint-initdb.d/importdump.sql
Bestehendes WordPress Projekt nutzen
Ich muss meist bestehende Seiten die schon Live sind, an denen ich Änderungen vornehmen soll, bearbeiten. Daher habe ich den mysql dump der Datenbank als init import zugeordnet. Den folgen Code Teil in der docker-compose.yml könnt Ihr also weglassen, falls ihr eine neue WordPress instanz nutzt.
volumes:
- ./dumps/databasedump_local_latest.sql:/docker-entrypoint-initdb.d/importdump.sql
Wenn Ihr die Einrichtung des Inhalts auch lokal vornehmen wollt, könnt Ihr nach dem ersten start die Datenbank mit phpMyAdmin exportieren und in den Ordner dumps legen. Danch die Zeilen wieder in die docker-compose.yml eintragen. Danach wird die Datenbank bei einem Neustart wieder mit den Daten gefüllt.
Die Pfade in der Datenbank von localhost (oder den vergebenen Host Namen) in die Live URL ändern
Ich nutze für das Umschreiben der Domain Informationen in der Datenbank das Tool Database Search and Replace Script in PHP von interconnect/it
Das Tool habe ich in diesem Beispiel in den Ordner “searchandreplace” gelegt. Da ich die Host Adresse localwordpress verwende kann ich wenn das System gestartet wurde unter localwordpress/searchandreplace das Tool aufrufen.
phpMyAdmin aufrufen
In dem docker-compose File ist auch das phpMyAdmin Image vorhanden. Um das Tool im Browser zu öffnen müsst Ihr einfach localhost:8080 (oder hier localwordpress:8080) aufrufen. Die Logindaten für die Datenbank werden auch in der compose Datei vergeben.
db:
...
environment:
...
MYSQL_USER: username
MYSQL_PASSWORD: password
...
...
Die Ordner Struktur in meinem Projekt Ordner
Ich gehe hier von folgendem Aufbau aus:
wordpressProjekt
themes
plugins
searchandreplace
dumps
uploads
Im Ordner themes/ lege ich das Theme das ich bearbeite ab
Im Ordner plugins/ lege ich die benötigten Plugins ab
Im Ordner searchandreplace/ befindet sich das Tool mit dem ich die Datenbank durchsuchen und ersetzen kann
Im Ordner dumps/ lege ich die Datenbank dumps ab
Im Ordner uploads sind die Bild Uploads.
Diese Struktur nutze ich damit alles was man bracuht um die Seite schnell und einfach Lokal ans laufen zu bringen.
Alle benötigten Daten sind dann vorhanden.
Die docker-compose.yml Datei
Die docker-compose.yml muss dann so aussehen:
version: '3.1'
services:
wordpress:
image: wordpress:latest
restart: always
ports:
- 80:80
links:
- db:db
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: username
WORDPRESS_DB_PASSWORD: password
WORDPRESS_DB_NAME: wordpressdb
WORDPRESS_TABLE_PREFIX: wp_
volumes:
- ./themes:/var/www/html/wp-content/themes
- ./plugins:/var/www/html/wp-content/plugins
- ./uploads:/var/www/html/wp-content/uploads
# Dies wird nur benötigt wenn man zum Beispiel die URL in der Datenbank suchen und ersetzen möchte.
- ./searchandreplace:/var/www/html/searchandreplace
phpmyadmin:
image: phpmyadmin/phpmyadmin
ports:
- 8080:80
links:
- db:db
db:
image: mysql:5.7
restart: always
environment:
MYSQL_DATABASE: wordpressdb
MYSQL_USER: username
MYSQL_PASSWORD: password
MYSQL_RANDOM_ROOT_PASSWORD: '1'
volumes:
- ./dumps/databasedump_local_latest.sql:/docker-entrypoint-initdb.d/importdump.sql
# wenn man nicht immer wieder die daten importieren möchte, kann man den mysql Ordner auch auf den lokalen Rechner lenken.
# der folgende Eintrag sorgt dafür da die daten im root Ordner/mysql speichert und sie dauerhaft zur Verfügung stehen.
- ./mysql:/var/lib/mysql
Wenn man unter Windows 10 Home oder einer älteren Windows Version arbeitet, ist die Docker Toolbox im Einsatz. Hier gibt es das Problem das sich das ganze System in einer Virtuellen VM befindet, und man die Seite dann nicht über loalhost aufrufen kann. Um die IP Adresse herauszufinden unter der man die Seite dann im Browser aufrufen kann könnt Ihr folgenden Befehl in die CMD eingeben:
docker-machine ip default
Wenn man dann IP:80 aufruft lädt die WordPress Seite. Ruft man IP:8080 auf landet man im phpmyadmin.
In dem BEispiel weiter unten habe ich um nicht mit der IP zu arbeiten einen Hostnamen vergeben (localwordpress) damit das funktioniert muss in der Hosts Datei der Hostname auf die IP gemappt werden. Unter Windows findet Ihr die Hosts Datei unter C:/Windows/System/drivers/etc/
Dort dann einfach folgendes eintragen:
# die XXXe stehen für die IP die Ihr mit docker-machine ip default gefunden habt
XXX.XXX.XXX.XXX localwordpress
Starten des Systems
Wenn Ihr die normale (aktuelle) Docker Version nutzt, könnt Ihr jetzt mit
docker-compose up
das System starten. Mit dem oberen Befehl seht ihr in der CMD was alles gemacht wird. Wenn Ihr wisst das alles funktioniert könnt Ihr einfach ein -d an den Befehl anfügen um die Ausgabe zu unterdrücken. Auf etwas weniger starken Systemen schont das dann auch den Speicher.
docker-compose up -d
Anpassungen für die MU Installation
Solltet Ihr die WordPress Umgebung als MultiSite (MU) Installation nutzen wollen, gibt es ein paar Sachen die man noch beachten muss.
wp-config.php Definitionen hinzufügen
Die Zusätzlichen Informationen, die in die wp-config.php eingetragen werden müssen, können wir in der docker-compose.yml wie folgt eintragen:
WORDPRESS_CONFIG_EXTRA: |
define('WP_ALLOW_MULTISITE', true );
define('MULTISITE', true);
define('SUBDOMAIN_INSTALL', false);
# hier habe ich localwordpress eingetragen da ich einen hostnamen verwende
# bei Nutzung der aktuellen Docker Version kann auch einfach ohne hostname gearbeitet werden
# dann könnt ihr dort localhost eintragen
define('DOMAIN_CURRENT_SITE', 'localwordpress');
define('PATH_CURRENT_SITE', '/');
define('SITE_ID_CURRENT_SITE', 1);
define('BLOG_ID_CURRENT_SITE', 1);
Eigene .htaccess Datei in den Container mappen
Zusätzlich habe ich eine .htaccess Datei erstellt in die die Zusatz Informationen eingetragen sind, die für die MU Installation von WordPress benötigt werden.
Gleichzeitig wird die sunrise.php für das MU Plugin, in den Container gemappt:
- ./sunrise.php:/var/www/html/wp-content/sunrise.php
- ./.htaccess:/var/www/html/.htaccess
Die vollständigen Einstellungen für wordpress in der docker-compose.yml sehen dann so aus:
wordpress:
image: wordpress:latest
restart: always
hostname: localwordpress
ports:
- 80:80
links:
- db:db
environment:
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: admin
WORDPRESS_DB_PASSWORD: 987654321
WORDPRESS_TABLE_PREFIX: wp_
WORDPRESS_CONFIG_EXTRA: |
define('WP_ALLOW_MULTISITE', true );
define('MULTISITE', true);
define('SUBDOMAIN_INSTALL', false);
define('DOMAIN_CURRENT_SITE', 'localwordpress');
define('PATH_CURRENT_SITE', '/');
define('SITE_ID_CURRENT_SITE', 1);
define('BLOG_ID_CURRENT_SITE', 1);
volumes:
- ./themes:/var/www/html/wp-content/themes
- ./plugins:/var/www/html/wp-content/plugins
# Dies wird nur benötigt wenn man zum Beispiel die URL in der Datenbank suchen und ersetzen möchte.
- ./searchandreplace:/var/www/html/searchandreplace
- ./uploads:/var/www/html/wp-content/uploads
- ./sunrise.php:/var/www/html/wp-content/sunrise.php
- ./.htaccess:/var/www/html/.htaccess
Denkt daran das Ihr, wenn ihr mit Docker Toolbox arbeitet das mapping der volumes mit meinprojekt/ordner stat ./ordner machen müsst.