Knowledge Base Guide

Docker pour PrestaShop : Configuration de l'environnement de développement

Configurez Docker pour le développement PrestaShop — tests multi-versions, workflow modules, gestion de base de données, Xdebug et production.

Pourquoi Docker pour le développement PrestaShop ?

Si vous avez déjà essayé de faire tourner PrestaShop 1.6, 1.7, 8.x et 9.x sur la même machine, vous connaissez la difficulté. Chaque version nécessite une version différente de PHP, une version différente de MySQL et une configuration différente. Tout installer nativement est la recette idéale pour des heures de dépannage.

Docker résout ce problème. Chaque version de PrestaShop s’exécute dans son propre conteneur isolé avec exactement les dépendances dont elle a besoin. Aucun conflit. Rien ne casse.

  • Tests multi-versions : Exécutez PS 1.7, 8.x et 9.x simultanément. Testez un module sur toutes les versions en un après-midi.
  • Isolation : Chaque conteneur possède son propre runtime PHP, sa propre base de données MySQL et son propre système de fichiers.
  • Reproductibilité : L’ensemble de votre environnement est défini dans un seul fichier docker-compose.yml. Partagez-le avec votre équipe et tout le monde obtient une configuration identique.
  • Nettoyage facile : Exécutez docker compose down -v et tout disparaît. Recréez tout en deux minutes.
Nous exécutons plus de 25 conteneurs PrestaShop sur un seul serveur — de PS 1.6 à PS 9.1 — pour le développement et le test de modules. Docker est la seule manière concrète de gérer cela. Ce guide partage les pratiques que nous avons affinées au fil d’années d’utilisation en conditions réelles.

Prérequis

Installer Docker

Ubuntu/Debian : curl -fsSL https://get.docker.com | sh — puis sudo usermod -aG docker $USER pour utiliser Docker sans sudo.

macOS : Téléchargez Docker Desktop pour Mac (Intel et Apple Silicon pris en charge).

Windows : Installez d’abord WSL2, puis Docker Desktop avec le backend WSL2 activé.

Concepts clés de Docker

  • Image : Un modèle en lecture seule contenant un OS, PHP, Apache et PrestaShop. Images officielles : prestashop/prestashop sur Docker Hub.
  • Conteneur : Une instance en cours d’exécution d’une image. Vous pouvez lancer plusieurs conteneurs à partir de la même image.
  • Volume : Un stockage persistant qui survit aux redémarrages des conteneurs. Sans volumes, les données sont perdues lorsque le conteneur est supprimé.
  • Réseau : Un réseau virtuel permettant aux conteneurs de communiquer — PrestaShop doit pouvoir atteindre son conteneur MySQL.

Configuration matérielle requise

Prévoyez 1,5 à 2 Go de RAM par instance PrestaShop (application + base de données). Pour 2 à 3 versions, 8 Go de RAM et un SSD suffisent largement. Pour 10 conteneurs ou plus, 32 Go+ et des SSD rapides sont recommandés.

Configuration de base : un seul conteneur PrestaShop

Créez un répertoire et ajoutez ce fichier docker-compose.yml :

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 doit correspondre au nom du service (db). PS_DOMAIN indique à PrestaShop où il est accessible. PS_FOLDER_INSTALL=disabled ignore l’assistant d’installation lors des démarrages suivants. Lancez avec docker compose up -d et suivez l’installation initiale avec docker compose logs -f prestashop (1 à 2 minutes).

Accédez à votre boutique sur http://localhost:8080 et au Back Office sur http://localhost:8080/admin-dev.

Utilisez toujours des volumes nommés pour votre base de données. Sans volumes, la suppression d’un conteneur détruit toutes les données — produits, commandes, tout. Les volumes nommés persistent jusqu’à ce que vous les supprimiez explicitement.

Configuration multi-versions pour les tests

C’est là que Docker excelle. Exécuter trois versions de PrestaShop côte à côte revient simplement à les définir dans votre fichier compose avec des ports différents :

version: '3.8'
services:
  ps178:
    image: prestashop/prestashop:1.7.8
    ports: ["8081:80"]
    environment:
      - DB_SERVER=ps178-db
      - PS_DOMAIN=localhost:8081
      # ... same pattern as above
    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

Choisissez un schéma de ports cohérent : 8081 pour PS 1.7, 8082 pour PS 8.x, 8083 pour PS 9.x. Pour plus de confort, utilisez Nginx Proxy Manager pour attribuer des noms d’hôte comme ps178.dev.local au lieu de numéros de port.

Utilisez toujours des bases de données séparées. Ne partagez jamais une seule instance MySQL entre différentes versions de PrestaShop — le schéma diffère selon les versions, et les migrations corrompront les données.

Workflow de développement de modules

Montez en bind-mount le répertoire de votre module dans le conteneur afin que chaque modification soit immédiatement disponible :

volumes:
  - ps82-data:/var/www/html
  - /home/user/modules/my_module:/var/www/html/modules/my_module

Pour tester sur toutes les versions, montez le même répertoire dans chaque conteneur. Modifiez un fichier, rafraîchissez trois onglets de navigateur — votre modification est active partout.

Liens symboliques vs montages de volumes

Montages de volumes (recommandé) : Les modifications sont instantanées, fonctionne sur toutes les plateformes, séparation propre. Liens symboliques : Fonctionnent uniquement si les fichiers PrestaShop sont sur le système de fichiers hôte, ne fonctionne pas bien avec les volumes Docker. Dans la plupart des cas, les montages de volumes sont le bon choix.

Gérer le cache

PrestaShop met en cache de manière agressive les templates et les configurations. Pendant le développement, videz le cache après chaque modification :

docker exec ps82 rm -rf /var/www/html/var/cache/*

Ou désactivez le cache des templates dans Back Office → Advanced Parameters → Performance pendant le développement actif. Réactivez-le une fois les tests terminés — les bugs liés au cache sont bien réels.

Gestion de la base de données

Se connecter à MySQL

# Interactive MySQL session
docker exec -it ps82-db mysql -u root -p'root' prestashop

# Run a single query
docker exec ps82-db mysql -u root -p'root' -e "SELECT COUNT(*) FROM ps_product;" prestashop

Conteneur phpMyAdmin

  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 et 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

Persistant vs éphémère

Persistant (volumes nommés) : Les données survivent aux redémarrages — à utiliser pour les environnements de développement principaux. Éphémère (sans volume) : Installation fraîche à chaque fois — utile pour tester « ce module s’installe-t-il correctement sur une boutique vierge ? »

Test des e-mails avec Mailpit

Mailpit intercepte tous les e-mails sortants et les affiche dans une interface web — indispensable pour tester les flux de checkout sans envoyer de vrais e-mails.

  mailpit:
    image: axllent/mailpit
    ports:
      - "8025:8025"  # Web UI
      - "1025:1025"  # SMTP
    networks: [ps-network]

Dans PrestaShop Back Office → Advanced Parameters → E-mail : configurez le serveur SMTP sur mailpit, port 1025, sans chiffrement, sans authentification. Consultez les e-mails interceptés à l’adresse http://localhost:8025.

Débogage avec Xdebug

Configuration de Xdebug 3

Créez un Dockerfile personnalisé :

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

Le fichier xdebug.ini :

[xdebug]
xdebug.mode=debug
xdebug.start_with_request=yes
xdebug.client_host=host.docker.internal
xdebug.client_port=9003
xdebug.idekey=VSCODE

Sous Linux, ajoutez extra_hosts: ["host.docker.internal:host-gateway"] à votre service compose — host.docker.internal n’existe pas par défaut sous Linux.

Configuration de VS Code

Installez l’extension PHP Debug et ajoutez dans .vscode/launch.json :

{
  "version": "0.2.0",
  "configurations": [{
    "name": "Listen for Xdebug (Docker)",
    "type": "php",
    "request": "launch",
    "port": 9003,
    "pathMappings": {
      "/var/www/html/modules/my_module": "${workspaceFolder}"
    }
  }]
}

Les pathMappings sont essentiels — ils indiquent à VS Code comment les chemins du conteneur correspondent aux chemins locaux. Sans cela, les points d’arrêt ne se déclencheront pas.

PHPStorm

Settings → PHP → Servers : ajoutez un serveur avec localhost et le port de votre conteneur, en mappant /var/www/html vers votre projet local. Définissez le port Xdebug sur 9003 dans PHP → Debug et cliquez sur « Start Listening ».

Commandes Docker utiles

TâcheCommande
Démarrer tous les conteneursdocker compose up -d
Arrêter tous les conteneursdocker compose down
Arrêter et supprimer toutes les donnéesdocker compose down -v
Voir les logsdocker compose logs -f
Vider le cache PSdocker exec CONTAINER rm -rf /var/www/html/var/cache/*
CLI MySQLdocker exec -it CONTAINER-db mysql -u root -p'PASS' prestashop
Exporter la base de donnéesdocker exec CONTAINER-db mysqldump -u root -p'PASS' prestashop > backup.sql
Importer la base de donnéesdocker exec -i CONTAINER-db mysql -u root -p'PASS' prestashop < backup.sql
Ouvrir un shell dans le conteneurdocker exec -it CONTAINER bash
Vérifier l’utilisation des ressourcesdocker stats --no-stream
Reconstruire après modification du Dockerfiledocker compose up -d --build
Exécuter la console PrestaShopdocker exec CONTAINER php bin/console cache:clear --env=prod
Lancer Composer dans un moduledocker exec -w /var/www/html/modules/my_module CONTAINER composer install

Considérations pour la production

Pour la plupart des boutiques PrestaShop, Docker est un outil de développement. Les boutiques en production fonctionnent mieux sur un hébergement traditionnel car :

  • Une pile LAMP sur un seul serveur est plus simple à maintenir et surveiller
  • Les E/S fichiers natifs sont plus rapides que les volumes Docker (PrestaShop charge des milliers de fichiers PHP par requête)
  • La plupart des hébergeurs PrestaShop proposent cPanel/Plesk, pas Docker

Docker en production a du sens lorsque : vous avez une grande équipe de développement avec des pipelines CI/CD, vous avez besoin d’auto-scaling lors d’événements commerciaux, vous gérez plus de 10 boutiques, ou vous avez besoin de déploiements sans interruption (construire une nouvelle image, la mettre en place, revenir en arrière en cas de problème).

Docker Compose vs Kubernetes : Compose gère jusqu’à 20–30 conteneurs sur un seul serveur et est simple à administrer. Kubernetes ajoute l’auto-scaling, l’auto-réparation et l’orchestration multi-nœuds, mais nécessite une infrastructure conséquente. Pour la plupart des déploiements PrestaShop, Compose sur un serveur puissant est suffisant.

Problèmes courants et solutions

Problèmes de permissions de fichiers

Symptôme : Erreurs « Permission denied », impossible de téléverser des modules ou d’enregistrer des images.

Cause : Apache s’exécute en tant que www-data (UID 33) à l’intérieur du conteneur, mais les fichiers montés depuis l’hôte peuvent appartenir à votre utilisateur (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

Le conteneur ne peut pas se connecter à la base de données

  • DB_SERVER doit correspondre exactement au nom du service MySQL dans votre fichier compose
  • MySQL peut ne pas être prêt — ajoutez un healthcheck et utilisez depends_on: condition: service_healthy
  • Les deux conteneurs doivent être sur le même réseau Docker
  • MySQL 8.0 utilise caching_sha2_password par défaut — ajoutez command: --default-authentication-plugin=mysql_native_password au service MySQL

E/S fichiers lentes sur macOS

Symptôme : Les pages mettent 10 à 30 secondes à se charger avec les bind mounts.

Solutions :

  • VirtioFS : Passez de gRPC FUSE à VirtioFS dans les paramètres de Docker Desktop — la plus grande amélioration en un seul changement
  • Montez moins : Ne montez que le répertoire de votre module, utilisez des volumes nommés pour le cœur de PrestaShop
  • Mutagen : Synchronisation bidirectionnelle rapide qui élimine la pénalité de performance sur macOS

SSL en développement

Les modules de paiement et la connexion via les réseaux sociaux nécessitent souvent HTTPS. Options :

  • Nginx Proxy Manager : Gère la terminaison SSL pour tous les conteneurs. L’approche la plus propre.
  • mkcert : Générez des certificats de confiance locale avec mkcert localhost et montez-les dans Apache.
  • Traefik : Découvre automatiquement les conteneurs et provisionne les certificats.

Le conteneur manque de mémoire

MySQL 8.0 est gourmand en mémoire par défaut. Limitez-le :

command: >
  --innodb-buffer-pool-size=128M
  --max-connections=50

Sur Docker Desktop (macOS/Windows), augmentez la limite de mémoire globale dans Settings → Resources à au moins 6 Go pour 3 conteneurs ou plus. Arrêtez les conteneurs que vous n’utilisez pas activement : docker compose stop ps178.

Boucles d’installation automatique

Si PrestaShop se réinstalle à chaque redémarrage, assurez-vous que votre volume /var/www/html persiste et que PS_FOLDER_INSTALL=disabled est défini dans votre environnement.

Contenu mixte après changement de port

Mettez à jour le domaine dans la base de données lorsque vous modifiez les mappages de ports :

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

Résumé

Docker transforme le développement PrestaShop d’une expérience fragile et mono-version en un workflow reproductible et multi-versions. La mise en place initiale prend un après-midi. Ensuite, vous pouvez lancer n’importe quelle version de PrestaShop en quelques minutes, tester des modules sur toutes les versions prises en charge simultanément, et partager votre environnement exact avec votre équipe.

Commencez par la configuration de base avec un seul conteneur. Une fois à l’aise, ajoutez d’autres versions, phpMyAdmin, Mailpit et Xdebug. Les fichiers compose de ce guide sont des modèles éprouvés en production, issus de notre propre infrastructure. Copiez-les, adaptez-les et construisez dessus.

Le dépôt Docker de PrestaShop sur GitHub est une excellente ressource pour rester à jour avec les mises à jour des images officielles et les bonnes pratiques.

More guides available

Browse our knowledge base for more practical PrestaShop tutorials, or reach out if you need help.

Loading...
Back to top