0
(0)

Experimentieren & testen: WordPress mit Docker-Containern

Erstellt am: 12. Februar 2024


ACHTUNG! Bitte lesen!

Du benutzt das hier Gezeigte natürlich, wie immer, auf eigenes Risiko!
Ich habe alles selbst durchgeführt und mir mein System nicht zerschossen oder sonst irgendwelche negativen Auffälligkeiten bemerkt.

Aber dennoch… Backups sind immer gut….
Für WordPress-Backups am besten mit UpdraftPlus

Ich übernehme keine Haftung für irgendwelche Schäden am System, der Hardware oder der Katze…. :-P

Affiliate - Links

Auf meiner Seite verwende ich sogenannte Affiliate-Links, diese sind mit einem gekennzeichnet, damit du diese auch direkt erkennen kannst.

Sobald du über so einen Link das Produkt kaufen würdest, erhalte ich möglicherweise eine Provision vom jeweiligen Anbieter.
Außerdem entstehen für Dich natürlich keine zusätzlichen Kosten!
Mich unterstützt du damit aber enorm und trägst dazu bei, dass es auch in Zukunft weitere Guides und Vorstellungen von mir hier geben wird.

Ich empfehle nur Tools / PlugIns / Anbieter / Produkte, hinter denen ich auch wirklich stehe, bzw. ich auch einen Mehrwert sehe.

DarkWolfCave.de ist Teilnehmer des Amazon-Partnerprogramm, das zur Bereitstellung eines Mediums für Webseiten konzipiert wurde, mittels dessen durch die Platzierung von Partner-Links zu Amazon.de Entgelte verdient werden können.

ec02448b6d9a444dac9e91ac8896fefd

WordPress in Docker Container installieren

Willkommen zu einem neuen Blogpost! Heute geht es um ein spannendes Thema für alle Technikbegeisterten und Bastler da draußen: Experimentieren und Testen mit WordPress und Docker-Containern. In diesem Beitrag nehme ich dich mit auf eine Reise durch meine Erfahrungen und teile meine persönliche Geschichte, wie ich WordPress mithilfe von Docker-Containern zum Laufen gebracht habe.
Also schnalle dich an und lass uns loslegen!

DarkWolfCave.de

WordPress in Docker Container – Was benötigen wir?

Direkt eine Info zu Beginn: Ich werde WordPress in einem Docker Container installieren, aber nur in meinem lokalen Netzwerk betreiben.
Dies dient bei mir lediglich als Developer-Umgebung. Also zum Entwickeln und Testen.
Vielleicht werde ich einen weiteren Artikel erstellen, was es ansonsten noch so zu beachten gibt, wenn du hier tatsächlich WordPress für das Internet bereitstellen willst. Aber alleine aus Sicht der Absicherung würde ich davon abraten.

Aber zurück zu der lokalen Installation. Hierfür habe ich dir eine kleine Übersicht erstellt, damit du weißt, worauf du dich hier einlässt:

Was benötigen wir?Notwendig oder optional?
Raspberry Pi 4 oder Raspberry Pi 5 (oder Server)Notwendig
Installierten Docker-DienstNotwendig
Installierte Portainer-Umgebungoptional
Im Prinzip die entsprechenden Images,
aber diese werden wir uns über docker compose files direkt laden
Notwendig
DarkWolfCave - Raspberry Pi

Auf dieser Hardware läuft meine Umgebung

Ich habe mehrere Umgebungen bei mir aufgebaut. Eine “Produktion” und diverse Testumgebungen.
Hardwaretechnisch sind aber alle fast gleich ausgestattet, da ich mit diesen Kombinationen bisher nie Problem hatte.
Einen Unterschied machen meine letzten aufgebauten Umgebungen, denn bei diesen nutze ich einen Raspberry Pi 5 4GB und einen Raspberry Pi 5 8GB 🙂

Werbung

Affiliate – Links

DarkWolfCave.de ist Teilnehmer des Amazon-Partnerprogramm, das zur Bereitstellung eines Mediums für Webseiten konzipiert wurde, mittels dessen durch die Platzierung von Partner-Links zu Amazon.de Entgelte verdient werden können.

WordPress in Docker Container – Legen wir los

Ich setze voraus, dass du weißt, wie du dich mit deinem Raspberry Pi verbinden kannst, sowie dass Docker und Portainer bei dir bereits laufen. Falls du zu diesen Installationen Hilfe benötigst, schaue bitte oben in der Tabelle nach. Dort habe ich die entsprechenden Artikel verlinkt.

Starten wir also Portainer über den Webbrowser und melden uns auf der GUI an.

Volume erstellen – MySQL Daten persistent ablegen

Erstellen wir zuerst ein Volume für die MySQL Datenbank, damit diese auch sicher gespeichert sind, und nicht bei einem neuen deploy des Containers verloren gehen.

  • Volumes
  • Add Volume

Vergib einfach einen Namen wordpress_mysqldb_data und klicke auf Create the volume. Alle anderen Punkte kannst du so belassen, wie sie sind.

Wordpress in Docker Container - Portainer Volume

Jetzt hast du ein neues Volume, welches auf deinem Raspberry in der Regel dann unter
/var/lib/docker/volumes/wordpress_mysqldb_data/_data angelegt wurde.

Volume erstellen – WordPress Daten persistent ablegen

Bei mir gibt es eine kleine Besonderheit. Denn ich lege die persistenten Daten für WordPress auf meiner NAS über NFS ab. Ansonsten müsste ich die Benutzerrechte auf dem Raspberry Pi, wo normal die Docker-Container eingerichtet werden, ändern, sodass ich über SFPT / SSH meine WordPress Daten ablegen kann.

Da aber auf der NAS deutlich mehr Speicherplatz zur Verfügung steht, und die Daten in einem Backup gesichert werden, nehme ich diese Möglichkeit. Bei mir läuft eine Synology NAS. Daher kann die Konfiguration bei dir etwas anders verlaufen.
In dem Fall, dass du deine persistenten Daten direkt auf deinem Raspberry Pi speichern möchtest, wähle in den folgenden Schritten dann einfach nur den Namen und als driver:local aus (also genauso wie wir es unter dem Punkt für das MySQL Volume durchgeführt haben). Alle anderen Schritte kannst du überspringen.

  • Volumes
  • Add Volume
  • Use NFS volume

Benenne das Volume, sehr sinnvoll, falls du mehrere unterschiedliche WordPress Seiten nutzen möchtest. Zum Beispiel: wordpress_seite_1 (oder den Namen deiner Webseite).
Ich switche den Button Use NFS volume nach rechts und fülle die nun erscheinenden Parameter entsprechend aus.

  • Address = die IP-Adresse deiner NAS
  • NFS Version = belasse ich bei NFS4, kommt darauf an, was deine NAS unterstützt
  • Mount Point = der Pfad auf deiner NAS. Also der freigegebene Ordner. Bei Synology wichtig der Doppelpunkt am Anfang und der Name des Volumes
  • Options = belasse ich mit den default Werten

Wie immer das Ganze mit dem Knöpfchen Create the volume beenden.

Wordpress in Docker Container - Portainer Volume NFS

Volume erstellen – Für eine spezielle WordPress.ini (php.ini)

Legen wir noch ein letztes Volume an. Hier werden wir später eine spezielle wordpress.ini Datei hinterlegen, die einige Werte in der php.ini innerhalb des Docker-Containers überschreiben wird.

Wir gehen wie gerade auch schon vor, ich überlasse es dir, ob auf deiner NAS oder direkt auf dem Raspberry Pi.
Bitte beachte aber, dass du einen eigenen Ordner dafür benutzt. Hier darf später nichts anderes enthalten sein.
Ich nenne dieses Volume wordpress_ini und habe den Ordner auf meinem NAS angelegt.

Wordpress in Docker Container - Portainer Volume

Anlegen der speziellen WordPress.ini

Wir benötigen später noch eine wordpress.ini, die ein paar Änderungen an der internen php.ini vornimmt.
Diese erstellen wir am besten jetzt schon und legen sie in dem gerade angelegten Volume (in meinem Beispiel wordpress_ini) ab.

Wir ändern ein paar Werte, denn Default in der php.ini im Container ist zum Beispiel upload_max_filesize = 2M, was für die wenigsten Plug-ins ausreichend wäre. Also, du könntest so kein größeres ZIP-File hochladen. Einfach die folgenden Werte in deine wordpress.ini hinzufügen und entsprechend auf dem Volume abspeichern.

file_uploads = On
memory_limit = 256M
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 300
max_input_time = 1000

WordPress in Docker Container – Erstellen wir uns Stacks

Ich habe mich für Stacks entschieden, da ich hier direkt mehrere Container mit einem Schritt erstellen kann.
Insgesamt werden es mindestens zwei Stacks, die wir erstellen werden. Im Ersten deployen wir MySQL und phpMyAdmin, denn diese sollen allen WordPress-Instanzen zur Verfügung gestellt werden.
Im Zweiten kommt dann die eigentliche WordPress-Instanz hinein.

Stack erstellen – MySQL und phpMyAdmin

Beginnen wir also direkt mit unserem ersten Stack für den MySQL und phpMyAdmin Container:

  • Stacks
  • Add stack
  • Create stack
Wordpress in Docker Container - Portainer compose editor

Als Namen verwende ich mysql_db_phpmyadmin und belasse die Auswahl bei “Web editor“.
In dem unteren Feld erstellen wir uns jetzt ein docker compose file:

Allgemeiner Hinweis zu den verwendeten Network Namen: Ich nutze hier dwcwp_db – solltest du diesen umbenennen, dann musst du dies überall ändern!

version : '3.9' 

services:
 #Hier erstellen wir einen Container für mysql
  mysqldb:
    image: mysql
    environment: #ab hier bitte deine Einträge entsprechend verwenden
      MYSQL_ROOT_PASSWORD: root #Passwort für den user root 
      MYSQL_DATABASE: name-deiner-datenbank #bei mehreren WordPress Instanzen bitte manuell in phpmyadmin anlegen und hier auskommentieren! Bitte Erklärung auf darkwolfcave.de beachten!
      MYSQL_USER: wordpressuser #dieser Benutzer wird erstellt/erhält Superuser-Rechte für die oben angegebene Datenbank (name-deiner-datenbank) 
      MYSQL_PASSWORD: wordpresspass #Passwort für den User
    restart: always 
    volumes:
      - wordpress_mysqldb_data:/var/lib/mysql #Die Daten im Container unter '/var/lib/mysql' persistent im benannten Volume mysqldb_data sichern
   
    networks:
      - dwcwp_db
     
 # phpMyAdmin service bereitstellen
  phpmyadmin:
    image: phpmyadmin:latest
    restart: always
    depends_on:
      - mysqldb
    ports:
      - 9999:80 #der Port darf nicht schon benutzt werden. Du kannst die 9999 entsprechend anpassen
    environment:
      PMA_HOST: mysqldb #Host unserer mysqldb
      MYSQL_ROOT_PASSWORD: root #Passwort für root, wenn du es oben geändert hast, dann auch bitte hier
    networks:
      - dwcwp_db

#Volumes definieren
volumes:
  wordpress_mysqldb_data:
    external: true #haben wir bereits angelegt, daher external

#Netzwerk definieren
networks:
  dwcwp_db:
   driver: bridge
   name: dwcwp_db

Gehen wir ein paar Punkte kurz gemeinsam durch. In dem Bereich environment können wir einige Einstellungen für die MySQL Datenbank anpassen.

MYSQL_ROOT_PASSWORD:Hier kannst du das Passwort für den root user vergeben (default: root)
MYSQL_DATABASE:Hier gibst du den Namen der Datenbank an. Solltest du mehrere WordPress
Instanzen benutzen wollen, kommentiere diesen Punkt bitte mit einer # aus.
(#MYSQL_DATABASE: ) und lege die Datenbanken später manuell über phpMyAdmin an.
MYSQL_USER:Namen des Users mit Superuser-Rechten für die Datenbank
MYSQL_PASSWORD:Passwort für den SuperUser

Im Bereich Volumes hängen wir unser vorher erstelltes Volume an. Hier musst du entsprechend den Namen anpassen, solltest du einen anderen gewählt haben: wordpress_mysqldb_data:/var/lib/mysql.

Im Service phpMyAdmin musst du den Port beachten, denn dieser darf bei dir bisher nicht verwendet werden (Port 9999 in meinem Beispiel). Auch hier gibt es einen Environment Bereich und den Punkt MYSQL_ROOT_PASSWORD. Solltest du weiter oben das Passwort für den root user geändert haben, dann musst du dieses auch hier eintragen (default: root).

Final auf “Deploy the stack” klicken und im Idealfall starten zwei Container (einer für MySQL und einer für phpMyAdmin).

Wordpress in Docker Container - Portainer Running Containers

Du kannst jetzt bereits die WebGui von deinem phpMyAdmin Container erreichen. Dazu öffne einfach die entsprechende IP-Adresse (Raspberry) mit dem passenden Port (9999) in deinem Webbrowser und logge dich mit root ein. Das Passwort aus meinem Beispiel wäre dann auch root, solltest du dieses geändert haben, nimmst du natürlich dein eigenes.

Wordpress in Docker Container - phpMyAdmin

Stack erstellen – WordPress

Damit wir nicht aus der Übung kommen, geht es auch direkt weiter mit dem Stack für unsere WordPress Instanz.
Wie gerade beschrieben, mit Add Stack ein neues erstellen, einen Namen (zum Beispiel wp_projekt_1) vergeben und in dem Textfeld Folgendes einfügen. Beachte bitte, dass du vorher, wie oben beschrieben, die Volumes alle erstellt hast.

version : '3.9' 

services:
  #Einstellungen für WordPress
  wordpress: 
    image: wordpress
    restart: always  
    ports: 
      - 8889:80    #interner Port (80 im Container) und externer 8889 (Raspberry)
    environment:
      WORDPRESS_DB_HOST: mysqldb #mysql db hostname
      WORDPRESS_DB_NAME: name-deiner-datenbank #Name deiner Datenbank
      WORDPRESS_DB_USER: wordpressuser #wie unter MYSQL_USER konfiguriert
      WORDPRESS_DB_PASSWORD: wordpresspass #wie unter MYSQL_PASSWORD konfiguriert
    volumes:
      - wordpress_seite_1:/var/www/html #Volume für persistente Daten (vorher erstellen)
      - wordpress_ini:/usr/local/etc/php/wordpress_ini #auch vorher erstellen
    command: ["sh", "-c", "cp /usr/local/etc/php/wordpress_ini/wordpress.ini /usr/local/etc/php/conf.d/wordpress.ini && docker-entrypoint.sh apache2-foreground"] #siehe darkwolfcave.de für Erklärung
    networks:
      - dwcwp_db

#Define volumes
volumes:
  wordpress_seite_1:
    external: true
  wordpress_ini:
    external: true

#Define networks
networks:
  dwcwp_db:
   external: true

Natürlich schauen wir uns auch wieder ein paar der Attribute etwas genauer an:

ports:
– 8889:80
Der vordere Port (8889) ist der, auf deinem Raspberry, und darf nicht doppelt vergeben sein.
Der Hintere (80) ist der innerhalb des Containers.
WORDPRESS_DB_HOSTWenn du nichts weiter geändert hast, dann ist es mysqldb.
WORDPRESS_DB_NAMEDer Datenbankname für deine WordPress-Instanz.
Entweder wie im ersten Stack angegeben oder wie in phpMyAdmin erstellt.
WORDPRESS_DB_USERWie unter MYSQL_USER angelegt
WORDPRESS_DB_PASSWORDWie unter MYSQL_PASSWORD angelegt
Volumes:
– wordpress_seite_1:Das Volume, welches wir weiter oben für die persistenten WordPress Daten angelegt haben.
– wordpress_ini:Das Volume, welches wir weiter oben für die WordPress.ini angelegt haben.
command: [“sh”, “-c”, “cp
/usr/local/etc/php/wordpress_ini/wordpress.ini /usr/local/etc/php/conf.d/wordpress.ini
&& docker-entrypoint.sh apache2-foreground”]
Dieser Befehl kopiert die wordpress.ini aus unserem Volume zu einem anderen Pfad innerhalb des Containers. Dafür muss natürlich die wordpress.ini vorher erstellt werden und in dem Volume vorhanden sein.
Nachdem du jetzt mit Deploy the stack, hoffentlich erfolgreich, deine WordPress Instanz veröffentlicht hast, wollen wir versuchen, die WebGui von WordPress zu erreichen.
Dafür gib die IP-Adresse deines Raspberry, gefolgt von dem konfiguriertem Port (8889) in deinem WebBrowser ein.
Es startet jetzt direkt die erste WordPress Konfiguration:

Wordpress in Docker Container - WordPress Installation

Herzlichen Glückwunsch! Du hast jetzt deine eigene WordPress Instanz auf deinem Raspberry, um damit lokal testen und ausprobieren zu können. Viel Spaß!

Warum denn zwei Stacks?

Jetzt fragst du dich vielleicht die ganze Zeit schon, warum packt der Kerl das in zwei getrennte Stacks? Warum nicht alles in einem, das würde doch auch gehen, oder?

Ja! Es würde auch funktionieren. Allerdings möchte ich mehrere unterschiedliche WordPress Instanzen in den Containern benutzen und diese auch gezielt starten und beenden können. Daher habe ich mich dazu entschlossen, jede WordPress Instanz in einem separatem Stack als Docker Container aufzusetzen.

Mein dritter Stack beinhalten ein passendes Volume, wo nur diese Daten abgelegt werden, und einen anderen Port. Der Rest bleibt also gleich. Es werden lediglich der Name, der Datenbankname und das Volume angepasst.

Falls du dies nachstellen möchtest, gibt es aber noch eine Sache zu beachten:

Manuelles erstellen der Datenbanken und User zuweisen

Falls du auch gerne mehrere WordPress Instanzen in deinen Docker Container laufen lassen möchtest, musst du in dem mysql_db_phpmyadmin Stack Folgendes durch eine # auskommentieren oder die Zeile ganz löschen:

MYSQL_DATABASE: name-deiner-datenbank #bei mehreren WordPress Instanzen bitte manuell in phpmyadmin anlegen und hier auskommentieren! Bitte Erklärung auf darkwolfcave.de beachten!

Jetzt wird natürlich auch keine Datenbank mehr automatisch erstellt und du musst dieses in phpMyAdmin selbst für jede verwendete Datenbank durchführen.

Nehmen wir kurz an, du möchtest für zwei Projekte von dir, jeweils eine WordPress Instanz in einem Docker Container laufen lassen.

  • Projekt1 = wordpressdb
  • Projekt2 = lerne_neue_sprachen

Der erste Stack bleibt, bis auf die Zeile mit dem MYSQL_DATABASE, so wie er ist.
Logge dich also in deinem phpMyAdmin (IP-Adresse:PORT) über deinen Webbrowser ein und führe folgenden Befehl aus. Solltest du den User auf andere Art benannt haben, musst du hier “wordpressuser” entsprechend ersetzen:

CREATE DATABASE IF NOT EXISTS `wordpressdb` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci;
GRANT ALL PRIVILEGES ON wordpressdb.* TO 'wordpressuser'@'%';
Wordpress in Docker Container - SQL Query

Für dein zweites Projekt startest du dann noch einmal den SQL-Befehl, aber mit deinem anderen Namen:

CREATE DATABASE IF NOT EXISTS `lerne_neue_sprachen` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci;
GRANT ALL PRIVILEGES ON lerne_neue_sprachen.* TO 'wordpressuser'@'%';

Jetzt musst du nur noch in deinem zweiten und dritten Stack die richtigen Datenbanknamen hinter WORDPRESS_DB_NAME: schreiben und das Volume anpassen.
Somit laufen bei dir zwei WordPress Instanzen in Docker Container, die du separat ein- und ausschalten kannst.

FAQ - Frequently Asked Questions DarkWolfCave

FAQ´s

Du benötigst entweder einen Raspberry Pi 4 oder einen neuen Raspberry Pi 5 (oder einen Server), einen installierten Docker-Dienst und optional eine installierte Portainer-Umgebung.

Die Verwendung von Docker-Containern ermöglicht eine saubere und isolierte Umgebung für die Entwicklung und das Testen von WordPress. Dies erleichtert auch die Portabilität und Skalierbarkeit der Anwendung.

Erstelle in Portainer einen Stack mit dem Namen “mysql_db_phpmyadmin” und füge das entsprechende docker-compose-File hinzu. Achte darauf, die MySQL-Datenbank und den Benutzer manuell über phpMyAdmin anzulegen, falls du mehrere WordPress-Instanzen betreiben möchtest. Alles Weitere findest du detaillierter in diesem Guide.

Ja, du kannst mehrere WordPress-Instanzen auf demselben Raspberry Pi betreiben, indem du separate Stacks für jede Instanz erstellst und entsprechende Anpassungen vornimmst.

Natürlich! Über eine entsprechende Patreon-Mitgliedschaft biete ich dir einen exklusiven und persönlichen Zugang in Discord an.
Hier stehe ich dir dann für deine Fragen zur Verfügung.
Gerne können wir auch in einem Discord-Call direkt an deinem PC alles Schritt für Schritt durchgehen.
Wenn du also detaillierte Einblicke in meine Blog-Reihe “Snippets aus der Praxis” oder spezifische Fragen zu WordPress, Webentwicklung oder anderen Themen hast, stehe ich dir über die entsprechende Patreon-Mitgliedschaft persönlich zur Verfügung.

Du hast weitere Fragen oder benötigst Hilfe? Gerne versuche ich im Rahmen meiner Möglichkeiten dich zu unterstützen. Dafür kannst du hier die Kommentar-Sektion (nicht vergessen Antworten zu abonnieren) nutzen oder du schaust auf meinem Discord-Kanal vorbei.

WERBUNG

Angebot Raspberry Pi 5 4Gb
Angebot Raspberry Pi 5 8GB mit 4 Aluminium Kühlkörpern 64-Bit Arm Cortex A76 2.4GHz...

Letzte Aktualisierung am 28.02.2024 (Preise können abweichen) / Infos zu Affiliate Links / Bilder von der Amazon Product Advertising API