Docker für PrestaShop: Entwicklungsumgebung einrichten
Docker für PrestaShop einrichten — Multi-Versions-Tests, Modul-Workflow, Datenbankverwaltung, Xdebug-Debugging und Produktionsüberlegungen.
Warum Docker für die PrestaShop-Entwicklung?
Wenn Sie schon einmal versucht haben, PrestaShop 1.6, 1.7, 8.x und 9.x auf demselben Rechner zu betreiben, kennen Sie das Problem. Jede Version benötigt eine andere PHP-Version, eine andere MySQL-Version und eine andere Konfiguration. All das nativ zu installieren führt unweigerlich zu stundenlanger Fehlersuche.
Docker löst dieses Problem. Jede PrestaShop-Version läuft in einem eigenen, isolierten Container mit genau den Abhängigkeiten, die sie benötigt. Nichts kollidiert. Nichts geht kaputt.
- Multi-Version-Tests: Betreiben Sie PS 1.7, 8.x und 9.x gleichzeitig. Testen Sie ein Modul an einem einzigen Nachmittag über alle Versionen hinweg.
- Isolation: Jeder Container verfügt über eine eigene PHP-Laufzeitumgebung, MySQL-Datenbank und ein eigenes Dateisystem.
- Reproduzierbarkeit: Ihre gesamte Umgebung ist in einer einzigen
docker-compose.ymldefiniert. Teilen Sie sie mit Ihrem Team, und alle erhalten ein identisches Setup. - Einfaches Aufräumen: Führen Sie
docker compose down -vaus — und alles ist weg. In zwei Minuten steht alles wieder neu.
Wir betreiben über 25 PrestaShop-Container auf einem einzigen Server — von PS 1.6 bis PS 9.1 — für Modulentwicklung und Tests. Docker ist die einzige praktikable Möglichkeit, das zu verwalten. Dieser Leitfaden gibt die Muster weiter, die wir über Jahre realer Nutzung verfeinert haben.
Voraussetzungen
Docker installieren
Ubuntu/Debian: curl -fsSL https://get.docker.com | sh — anschließend sudo usermod -aG docker $USER, um Docker ohne sudo auszuführen.
macOS: Laden Sie Docker Desktop für Mac herunter (Intel und Apple Silicon werden unterstützt).
Windows: Installieren Sie zuerst WSL2, dann Docker Desktop mit aktiviertem WSL2-Backend.
Wichtige Docker-Konzepte
- Image: Eine schreibgeschützte Vorlage mit Betriebssystem, PHP, Apache und PrestaShop. Offizielle Images:
prestashop/prestashopauf Docker Hub. - Container: Eine laufende Instanz eines Images. Sie können mehrere Container aus demselben Image starten.
- Volume: Persistenter Speicher, der Container-Neustarts überlebt. Ohne Volumes gehen Daten beim Entfernen des Containers verloren.
- Network: Ein virtuelles Netzwerk, über das Container miteinander kommunizieren können — PrestaShop muss seinen MySQL-Container erreichen können.
Hardwareanforderungen
Planen Sie 1,5–2 GB RAM pro PrestaShop-Instanz ein (App + Datenbank). Für 2–3 Versionen sind 8 GB RAM und eine SSD ausreichend. Für 10+ Container werden 32 GB+ und schnelle SSDs empfohlen.
Grundkonfiguration: Einzelner PrestaShop-Container
Erstellen Sie ein Verzeichnis und fügen Sie diese docker-compose.yml hinzu:
version: '3.8'
services:
prestashop:
image: prestashop/prestashop:8.2
container_name: my-ps-shop
ports:
- "8080:80"
environment:
- DB_SERVER=db
- DB_USER=prestashop
- DB_PASSWD=prestashop_password
- DB_NAME=prestashop
- PS_DOMAIN=localhost:8080
- PS_FOLDER_ADMIN=admin-dev
- PS_FOLDER_INSTALL=disabled
- ADMIN_MAIL=admin@yourshop.com
- ADMIN_PASSWD=admin_password_123
volumes:
- ps-data:/var/www/html
depends_on:
- db
db:
image: mysql:8.0
container_name: my-ps-shop-db
environment:
- MYSQL_ROOT_PASSWORD=root_password
- MYSQL_DATABASE=prestashop
- MYSQL_USER=prestashop
- MYSQL_PASSWORD=prestashop_password
volumes:
- db-data:/var/lib/mysql
volumes:
ps-data:
db-data:
DB_SERVER muss mit dem Dienstnamen (db) übereinstimmen. PS_DOMAIN teilt PrestaShop mit, unter welcher Adresse der Shop erreichbar ist. PS_FOLDER_INSTALL=disabled überspringt den Installationsassistenten bei nachfolgenden Starts. Starten Sie mit docker compose up -d und verfolgen Sie die Erstinstallation mit docker compose logs -f prestashop (dauert 1–2 Minuten).
Rufen Sie Ihren Shop unter http://localhost:8080 und das Back Office unter http://localhost:8080/admin-dev auf.
Verwenden Sie immer benannte Volumes für Ihre Datenbank. Ohne Volumes gehen beim Entfernen eines Containers alle Daten verloren — Produkte, Bestellungen, alles. Benannte Volumes bleiben erhalten, bis Sie sie ausdrücklich löschen.
Multi-Version-Test-Setup
Hier zeigt Docker seine Stärke. Drei PrestaShop-Versionen parallel zu betreiben ist lediglich eine Frage der Definition in Ihrer Compose-Datei mit unterschiedlichen Ports:
version: '3.8'
services:
ps178:
image: prestashop/prestashop:1.7.8
ports: ["8081:80"]
environment:
- DB_SERVER=ps178-db
- PS_DOMAIN=localhost:8081
# ... gleiches Muster wie oben
volumes:
- ps178-data:/var/www/html
networks: [ps-network]
ps178-db:
image: mysql:5.7
volumes: [ps178-db-data:/var/lib/mysql]
networks: [ps-network]
ps82:
image: prestashop/prestashop:8.2
ports: ["8082:80"]
environment:
- DB_SERVER=ps82-db
- PS_DOMAIN=localhost:8082
volumes:
- ps82-data:/var/www/html
networks: [ps-network]
ps82-db:
image: mysql:8.0
command: --default-authentication-plugin=mysql_native_password
volumes: [ps82-db-data:/var/lib/mysql]
networks: [ps-network]
ps9:
image: prestashop/prestashop:9.0
ports: ["8083:80"]
environment:
- DB_SERVER=ps9-db
- PS_DOMAIN=localhost:8083
volumes:
- ps9-data:/var/www/html
networks: [ps-network]
ps9-db:
image: mysql:8.0
command: --default-authentication-plugin=mysql_native_password
volumes: [ps9-db-data:/var/lib/mysql]
networks: [ps-network]
networks:
ps-network:
driver: bridge
Wählen Sie ein einheitliches Port-Schema: 8081 für PS 1.7, 8082 für PS 8.x, 8083 für PS 9.x. Für mehr Komfort verwenden Sie Nginx Proxy Manager, um Hostnamen wie ps178.dev.local anstelle von Portnummern zuzuweisen.
Verwenden Sie immer separate Datenbanken. Teilen Sie niemals eine einzige MySQL-Instanz zwischen verschiedenen PrestaShop-Versionen — die Schemata unterscheiden sich zwischen den Versionen, und Migrationen würden Daten beschädigen.
Workflow für die Modulentwicklung
Binden Sie Ihr Modulverzeichnis per Bind-Mount in den Container ein, damit jede Änderung sofort verfügbar ist:
volumes:
- ps82-data:/var/www/html
- /home/user/modules/my_module:/var/www/html/modules/my_module
Um über alle Versionen hinweg zu testen, binden Sie dasselbe Verzeichnis in jeden Container ein. Bearbeiten Sie eine Datei, aktualisieren Sie drei Browser-Tabs — Ihre Änderung ist überall sofort wirksam.
Symlinks vs. Volume Mounts
Volume Mounts (empfohlen): Änderungen sind sofort wirksam, funktionieren auf allen Plattformen, saubere Trennung. Symlinks: Funktionieren nur, wenn die PrestaShop-Dateien auf dem Host-Dateisystem liegen, und vertragen sich schlecht mit Docker Volumes. Für die meisten Setups sind Volume Mounts die richtige Wahl.
Umgang mit dem Cache
PrestaShop speichert Templates und Konfigurationen aggressiv im Cache. Leeren Sie den Cache während der Entwicklung nach Änderungen:
docker exec ps82 rm -rf /var/www/html/var/cache/*
Alternativ können Sie den Template-Cache unter Back Office → Advanced Parameters → Performance während der aktiven Entwicklung deaktivieren. Aktivieren Sie ihn wieder, wenn die Tests abgeschlossen sind — Cache-bezogene Fehler sind real.
Datenbankverwaltung
Verbindung zu MySQL
# Interaktive MySQL-Sitzung
docker exec -it ps82-db mysql -u root -p'root' prestashop
# Einzelne Abfrage ausführen
docker exec ps82-db mysql -u root -p'root' -e "SELECT COUNT(*) FROM ps_product;" prestashop
phpMyAdmin-Container
phpmyadmin:
image: phpmyadmin:latest
ports: ["9090:80"]
environment:
- PMA_HOSTS=ps178-db,ps82-db,ps9-db
- PMA_USER=root
- PMA_PASSWORD=root
networks: [ps-network]
Import und Export
# Export
docker exec ps82-db mysqldump -u root -p'root' prestashop > backup.sql
# Import
docker exec -i ps82-db mysql -u root -p'root' prestashop < backup.sql
Persistent vs. flüchtig
Persistent (benannte Volumes): Daten überstehen Neustarts — verwenden Sie dies für Ihre Hauptentwicklungsumgebungen. Flüchtig (ohne Volume): Frische Installation bei jedem Start — nützlich für Tests wie „Installiert sich dieses Modul sauber auf einem leeren Shop?“
E-Mail-Tests mit Mailpit
Mailpit fängt alle ausgehenden E-Mails ab und zeigt sie in einer Web-Oberfläche an — unverzichtbar zum Testen von checkout-Abläufen, ohne echte E-Mails zu versenden.
mailpit:
image: axllent/mailpit
ports:
- "8025:8025" # Web UI
- "1025:1025" # SMTP
networks: [ps-network]
Im PrestaShop Back Office → Advanced Parameters → E-mail: Setzen Sie den SMTP-Server auf mailpit, Port 1025, keine Verschlüsselung, keine Authentifizierung. Aufgefangene E-Mails können Sie unter http://localhost:8025 einsehen.
Debugging mit Xdebug
Xdebug 3 — Konfiguration
Erstellen Sie ein benutzerdefiniertes Dockerfile:
FROM prestashop/prestashop:8.2
RUN pecl install xdebug && docker-php-ext-enable xdebug
COPY xdebug.ini /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
Die xdebug.ini:
[xdebug]
xdebug.mode=debug
xdebug.start_with_reqüst=yes
xdebug.client_host=host.docker.internal
xdebug.client_port=9003
xdebug.idekey=VSCODE
Unter Linux fügen Sie extra_hosts: ["host.docker.internal:host-gateway"] zu Ihrem Compose-Dienst hinzu — host.docker.internal existiert unter Linux standardmäßig nicht.
VS Code — Einrichtung
Installieren Sie die Erweiterung PHP Debug und fügen Sie Folgendes in .vscode/launch.json ein:
{
"version": "0.2.0",
"configurations": [{
"name": "Listen for Xdebug (Docker)",
"type": "php",
"reqüst": "launch",
"port": 9003,
"pathMappings": {
"/var/www/html/modules/my_module": "${workspaceFolder}"
}
}]
}
Die pathMappings sind entscheidend — sie teilen VS Code mit, wie Container-Pfade auf lokale Pfade abgebildet werden. Ohne diese Zuordnung werden Haltepunkte nicht ausgelöst.
PHPStorm
Settings → PHP → Servers: Fügen Sie einen Server mit localhost und dem Port Ihres Containers hinzu und ordnen Sie /var/www/html Ihrem lokalen Projekt zu. Setzen Sie den Xdebug-Port unter PHP → Debug auf 9003 und klicken Sie auf „Start Listening“.
Nützliche Docker-Befehle
| Aufgabe | Befehl |
|---|---|
| Alle Container starten | docker compose up -d |
| Alle Container stoppen | docker compose down |
| Stoppen und alle Daten löschen | docker compose down -v |
| Logs anzeigen | docker compose logs -f |
| PS-Cache leeren | docker exec CONTAINER rm -rf /var/www/html/var/cache/* |
| MySQL CLI | docker exec -it CONTAINER-db mysql -u root -p'PASS' prestashop |
| Datenbank exportieren | docker exec CONTAINER-db mysqldump -u root -p'PASS' prestashop > backup.sql |
| Datenbank importieren | docker exec -i CONTAINER-db mysql -u root -p'PASS' prestashop < backup.sql |
| Shell im Container öffnen | docker exec -it CONTAINER bash |
| Ressourcenverbrauch prüfen | docker stats --no-stream |
| Nach Dockerfile-Änderungen neu bauen | docker compose up -d --build |
| PrestaShop-Konsole ausführen | docker exec CONTAINER php bin/console cache:clear --env=prod |
| Composer im Modul ausführen | docker exec -w /var/www/html/modules/my_module CONTAINER composer install |
Überlegungen für den Produktivbetrieb
Für die meisten PrestaShop-Shops ist Docker ein Entwicklungswerkzeug. Produktive Shops laufen besser auf herkömmlichem Hosting, weil:
- Ein einzelner LAMP-Stack einfacher zu warten und zu überwachen ist
- Nativer Datei-I/O schneller ist als Docker Volumes (PrestaShop lädt Tausende PHP-Dateien pro Anfrage)
- Die meisten PrestaShop-Hoster cPanel/Plesk bereitstellen, nicht Docker
Docker im Produktivbetrieb ist sinnvoll, wenn: Sie ein großes Entwicklerteam mit CI/CD-Pipelines haben, automatische Skalierung bei Verkaufsaktionen benötigen, mehr als 10 Shops verwalten oder Deployments ohne Ausfallzeit durchführen möchten (neues Image bauen, austauschen, bei Problemen zurückrollen).
Docker Compose vs. Kubernetes: Compose bewältigt 20–30 Container auf einem einzelnen Server und ist einfach zu verwalten. Kubernetes bietet zusätzlich automatische Skalierung, Selbstheilung und Multi-Node-Orchestrierung, erfordert aber erhebliche Infrastruktur. Für die meisten PrestaShop-Deployments genügt Compose auf einem leistungsstarken Server.
Häufige Probleme und Lösungen
Dateiberechtigungsprobleme
Symptom: „Permission denied“-Fehler, Module lassen sich nicht hochladen oder Bilder nicht speichern.
Ursache: Apache läuft als www-data (UID 33) im Container, aber gemountete Host-Dateien gehören möglicherweise Ihrem Benutzer (UID 1000).
docker exec my-ps-shop chown -R www-data:www-data /var/www/html/var
docker exec my-ps-shop chown -R www-data:www-data /var/www/html/img
docker exec my-ps-shop chown -R www-data:www-data /var/www/html/modules
Container kann keine Verbindung zur Datenbank herstellen
DB_SERVERmuss exakt mit dem MySQL-Dienstnamen in Ihrer Compose-Datei übereinstimmen- MySQL ist möglicherweise noch nicht bereit — fügen Sie einen Healthcheck hinzu und verwenden Sie
depends_on: condition: service_healthy - Beide Container müssen sich im selben Docker-Netzwerk befinden
- MySQL 8.0 verwendet standardmäßig
caching_sha2_password— fügen Siecommand: --default-authentication-plugin=mysql_native_passwordzum MySQL-Dienst hinzu
Langsamer Datei-I/O unter macOS
Symptom: Seiten brauchen 10–30 Sekunden zum Laden bei Bind Mounts.
Lösungen:
- VirtioFS: Wechseln Sie in den Docker-Desktop-Einstellungen von gRPC FUSE zu VirtioFS — die größte einzelne Verbesserung
- Weniger mounten: Mounten Sie nur Ihr Modulverzeichnis, verwenden Sie benannte Volumes für den PrestaShop-Kern
- Mutagen: Schnelle bidirektionale Dateisynchronisation, die den macOS-Nachteil eliminiert
SSL in der Entwicklung
Zahlungsmodule und Social Login erfordern häufig HTTPS. Möglichkeiten:
- Nginx Proxy Manager: Übernimmt die SSL-Terminierung für alle Container. Der sauberste Ansatz.
- mkcert: Erzeugen Sie lokal vertraünswürdige Zertifikate mit
mkcert localhostund mounten Sie sie in Apache. - Träfik: Erkennt Container automatisch und stellt Zertifikate bereit.
Container hat nicht genügend Arbeitsspeicher
MySQL 8.0 ist standardmäßig speicherhungrig. Begrenzen Sie den Verbrauch:
command: >
--innodb-buffer-pool-size=128M
--max-connections=50
Erhöhen Sie unter Docker Desktop (macOS/Windows) das globale Speicherlimit unter Settings → Resources auf mindestens 6 GB für 3+ Container. Stoppen Sie Container, die Sie gerade nicht aktiv nutzen: docker compose stop ps178.
Endlosschleifen bei der Auto-Installation
Wenn sich PrestaShop bei jedem Neustart erneut installiert, stellen Sie sicher, dass Ihr /var/www/html-Volume persistent ist und PS_FOLDER_INSTALL=disabled in Ihren Umgebungsvariablen gesetzt ist.
Mixed Content nach Port-Änderung
Aktualisieren Sie die Domain in der Datenbank, wenn Sie die Port-Zuordnungen ändern:
docker exec ps82-db mysql -u root -p'root' -e "
UPDATE ps_configuration SET value='localhost:8082'
WHERE name IN ('PS_SHOP_DOMAIN','PS_SHOP_DOMAIN_SSL');
UPDATE ps_shop_url SET domain='localhost:8082', domain_ssl='localhost:8082';
" prestashop
Zusammenfassung
Docker verwandelt die PrestaShop-Entwicklung von einer fragilen Einzelversions-Erfahrung in einen reproduzierbaren Multi-Version-Workflow. Die Ersteinrichtung dauert einen Nachmittag. Danach können Sie jede PrestaShop-Version in Minuten starten, Module gleichzeitig über alle unterstützten Versionen testen und Ihre exakte Umgebung mit Ihrem Team teilen.
Beginnen Sie mit dem einfachen Einzel-Container-Setup. Sobald Sie sich sicher fühlen, fügen Sie weitere Versionen, phpMyAdmin, Mailpit und Xdebug hinzu. Die Compose-Dateien in diesem Leitfaden sind praxiserprobte Muster aus unserer eigenen Infrastruktur. Kopieren Sie sie, passen Sie sie an und bauen Sie darauf auf.
Das PrestaShop Docker-Repository auf GitHub ist eine hervorragende Ressource, um bei offiziellen Image-Updates und Best Practices auf dem Laufenden zu bleiben.
More guides available
Browse our knowledge base for more practical PrestaShop tutorials, or reach out if you need help.