Knowledge Base Guide

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.yml definiert. Teilen Sie sie mit Ihrem Team, und alle erhalten ein identisches Setup.
  • Einfaches Aufräumen: Führen Sie docker compose down -v aus — 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/prestashop auf 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

AufgabeBefehl
Alle Container startendocker compose up -d
Alle Container stoppendocker compose down
Stoppen und alle Daten löschendocker compose down -v
Logs anzeigendocker compose logs -f
PS-Cache leerendocker exec CONTAINER rm -rf /var/www/html/var/cache/*
MySQL CLIdocker exec -it CONTAINER-db mysql -u root -p'PASS' prestashop
Datenbank exportierendocker exec CONTAINER-db mysqldump -u root -p'PASS' prestashop > backup.sql
Datenbank importierendocker exec -i CONTAINER-db mysql -u root -p'PASS' prestashop < backup.sql
Shell im Container öffnendocker exec -it CONTAINER bash
Ressourcenverbrauch prüfendocker stats --no-stream
Nach Dockerfile-Änderungen neu bauendocker compose up -d --build
PrestaShop-Konsole ausführendocker exec CONTAINER php bin/console cache:clear --env=prod
Composer im Modul ausführendocker 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_SERVER muss 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 Sie command: --default-authentication-plugin=mysql_native_password zum 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 localhost und 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.

Loading...
Back to top