Docker-Compose File für lokale WordPress Instanz

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.