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.
DarkWolfCave.de
Also schnalle dich an und lass uns loslegen!
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-Dienst | Notwendig |
Installierte Portainer-Umgebung | optional |
Im Prinzip die entsprechenden Images, aber diese werden wir uns über docker compose files direkt laden | Notwendig |
Auf dieser Hardware laufen meine Umgebungen
Bei mir gibt es mehrere sogenannter “Umgebungen”, die ich benutze.
Zum einen meine “Live” oder auch “Production” Umgebung, auf der alles läuft, was ich in meinem Netzwerk so benötige.
Dann gibt es noch Umgebungen für unterschiedliche Szenarien: eine Labor (LAB), eine Entwickler (DEV) und eine zum finalen Testen (UAT).
Hardwaretechnisch sind aber alle fast gleich ausgestattet, da ich mit diesen Kombinationen bisher nie Probleme hatte.
Lediglich meine neue Live-Umgebung setzt erstmalig auf ein NVMe-SSD.
Werbung
Aktuelle Produktions-Umgebung (live)
Vorschau | Produkt | Preis | |
---|---|---|---|
Raspberry Pi 5 8 GB | 92,55 EUR 86,50 EUR | Bei Amazon kaufen | |
offizieller Raspberry Pi 5 USB-C Netzteil 27W, USB-C… | 18,90 EUR 13,90 EUR | Bei Amazon kaufen | |
GeeekPi Raspberry Pi 5 Aluminiumgehäuse mit Official… | 23,99 EUR 22,88 EUR | Bei Amazon kaufen | |
GeeekPi N04 M.2 M-Key NVMe SSD Shield für Raspberry Pi… | 12,95 EUR | Bei Amazon kaufen | |
Crucial P3 Plus SSD 1TB M.2 PCIe Gen4 NVMe Interne SSD,… | 80,50 EUR 69,99 EUR | Bei Amazon kaufen | |
SanDisk Extreme 32 GB microSDHC Memory Card + SD… | 14,99 EUR 10,44 EUR | Bei Amazon kaufen | |
Transcend 32GB kleiner und kompakter USB-Stick 3.1 Gen… | 14,99 EUR 12,09 EUR | Bei Amazon kaufen | |
UGREEN USB C 312MB/S Kartenleser SD 4.0 Kartenleser USB… | 25,99 EUR | Bei Amazon kaufen |
Letzte Aktualisierung am 12.10.2024 (Preise können abweichen) / Infos zu Affiliate Links / Bilder von der Amazon Product Advertising API
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.
Werbung
Test-Umgebungen (UAT/DEV/LAB)
Letzte Aktualisierung am 13.10.2024 (Preise können abweichen) / Infos zu Affiliate Links / Bilder von der Amazon Product Advertising API
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.
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.
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.
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
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).
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.
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_HOST | Wenn du nichts weiter geändert hast, dann ist es mysqldb. |
WORDPRESS_DB_NAME | Der Datenbankname für deine WordPress-Instanz. Entweder wie im ersten Stack angegeben oder wie in phpMyAdmin erstellt. |
WORDPRESS_DB_USER | Wie unter MYSQL_USER angelegt |
WORDPRESS_DB_PASSWORD | Wie 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. |
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:
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'@'%';
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´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.