Knowledge Base Guide

Docker para PrestaShop: Configuración del entorno de desarrollo

Configure Docker para desarrollo en PrestaShop — pruebas multiversión, flujo de trabajo con módulos, gestión de bases de datos, depuración con Xdebug y producción.

¿Por qué Docker para el desarrollo de PrestaShop?

Si alguna vez ha intentado ejecutar PrestaShop 1.6, 1.7, 8.x y 9.x en la misma máquina, conoce el problema. Cada versión necesita una versión diferente de PHP, una versión diferente de MySQL y una configuración diferente. Instalar todo eso de forma nativa es una receta para horas de solución de problemas.

Docker resuelve esto. Cada versión de PrestaShop se ejecuta en su propio contenedor aislado con exactamente las dependencias que necesita. Nada entra en conflicto. Nada se rompe.

  • Pruebas multiversión: Ejecute PS 1.7, 8.x y 9.x simultáneamente. Pruebe un módulo en todos ellos en una sola tarde.
  • Aislamiento: Cada contenedor tiene su propio entorno PHP, base de datos MySQL y sistema de archivos.
  • Reproducibilidad: Todo su entorno está definido en un único archivo docker-compose.yml. Compártalo con su equipo y todos obtendrán una configuración idéntica.
  • Limpieza fácil: Ejecute docker compose down -v y todo desaparece. Recréelo desde cero en dos minutos.
Ejecutamos más de 25 contenedores PrestaShop en un solo servidor — desde PS 1.6 hasta PS 9.1 — para el desarrollo y pruebas de módulos. Docker es la única forma práctica de gestiónar eso. Esta guía comparte los patrones que hemos perfeccionado a lo largo de años de uso real.

Requisitos previos

Instalación de Docker

Ubuntu/Debian: curl -fsSL https://get.docker.com | sh — luego sudo usermod -aG docker $USER para ejecutar Docker sin sudo.

macOS: Descargue Docker Desktop para Mac (compatible con Intel y Apple Silicon).

Windows: Instale primero WSL2, luego Docker Desktop con el backend WSL2 habilitado.

Conceptos clave de Docker

  • Imagen: Una plantilla de solo lectura que contiene un SO, PHP, Apache y PrestaShop. Imágenes oficiales: prestashop/prestashop en Docker Hub.
  • Contenedor: Una instancia en ejecución de una imagen. Puede ejecutar múltiples contenedores a partir de la misma imagen.
  • Volumen: Almacenamiento persistente que sobrevive a los reinicios del contenedor. Sin volúmenes, los datos se pierden cuando se elimina el contenedor.
  • Red: Una red virtual que permite la comunicación entre contenedores — PrestaShop necesita acceder a su contenedor MySQL.

Requisitos de hardware

Calcule 1,5–2 GB de RAM por instancia de PrestaShop (aplicación + base de datos). Para 2–3 versiones, 8 GB de RAM y un SSD es suficiente. Para más de 10 contenedores, se recomiendan 32 GB o más y SSDs rápidos.

Configuración básica: un solo contenedor PrestaShop

Cree un directorio y añada este 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 debe coincidir con el nombre del servicio (db). PS_DOMAIN indica a PrestaShop dónde es accesible. PS_FOLDER_INSTALL=disabled omite el asistente de instalación en los inicios posteriores. Inicie con docker compose up -d y observe la primera instalación con docker compose logs -f prestashop (tarda 1-2 minutos).

Acceda a su tienda en http://localhost:8080 y al Back Office en http://localhost:8080/admin-dev.

Utilice siempre volúmenes con nombre para su base de datos. Sin volúmenes, eliminar un contenedor destruye todos los datos — productos, pedidos, todo. Los volúmenes con nombre persisten hasta que usted los elimine explícitamente.

Configuración para pruebas multiversión

Aquí es donde Docker brilla. Ejecutar tres versiones de PrestaShop en paralelo es simplemente cuestión de definirlas en su archivo compose con diferentes puertos:

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

Elija un esquema de puertos consistente: 8081 para PS 1.7, 8082 para PS 8.x, 8083 para PS 9.x. Para una mejor experiencia, utilice Nginx Proxy Manager para asignar nombres de host como ps178.dev.local en lugar de números de puerto.

Utilice siempre bases de datos separadas. Nunca comparta una sola instancia MySQL entre versiones de PrestaShop — el esquema difiere entre versiones, y las migraciónes corromperán los datos.

Flujo de trabajo para desarrollo de módulos

Monte el directorio de su módulo dentro del contenedor mediante bind-mount para que cada edición esté disponible de inmediato:

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

Para probar en todas las versiones, monte el mismo directorio en cada contenedor. Edite un archivo, actualice tres pestañas del navegador — su cambio está activo en todas partes.

Symlinks vs montajes de volúmenes

Montajes de volúmenes (recomendado): Los cambios son instantáneos, funciona en todas las plataformas, separación limpia. Symlinks: Solo funciona si los archivos de PrestaShop están en el sistema de archivos del host, no funciona bien con volúmenes Docker. Para la mayoría de las configuraciónes, los montajes de volúmenes son la opción correcta.

Gestión de la caché

PrestaShop almacena en caché de forma agresiva las plantillas y configuraciónes. Durante el desarrollo, limpie la caché después de los cambios:

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

O desactive la caché de plantillas en Back Office → Advanced Parameters → Performance durante el desarrollo activo. Reactivéla cuando las pruebas estén completas — los errores relacionados con la caché son reales.

Gestión de bases de datos

Conexión a 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

Contenedor 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]

Importación y exportación

# 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

Persistente vs efímero

Persistente (volúmenes con nombre): Los datos sobreviven a los reinicios — úselo para los entornos de desarrollo principales. Efímero (sin volumen): Instalación limpia cada vez — útil para pruebas del tipo "¿se instala este módulo correctamente en una tienda vacía?".

Pruebas de correo electrónico con Mailpit

Mailpit captura todos los correos salientes y los muestra en una interfaz web — esencial para probar flujos de checkout sin enviar correos reales.

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

En PrestaShop Back Office → Advanced Parameters → E-mail: configure el servidor SMTP como mailpit, puerto 1025, sin cifrado, sin autenticación. Vea los correos capturados en http://localhost:8025.

Depuración con Xdebug

Configuración de Xdebug 3

Cree un Dockerfile personalizado:

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

El archivo xdebug.ini:

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

En Linux, añada extra_hosts: ["host.docker.internal:host-gateway"] a su servicio compose — host.docker.internal no existe por defecto en Linux.

Configuración de VS Code

Instale la extensión PHP Debug y añada a .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}"
    }
  }]
}

Los pathMappings son críticos — indican a VS Code cómo las rutas del contenedor se corresponden con las rutas locales. Sin esto, los puntos de interrupción no se activarán.

PHPStorm

Settings → PHP → Servers: añada un servidor con localhost y el puerto de su contenedor, mapeando /var/www/html a su proyecto local. Configure el puerto de Xdebug a 9003 en PHP → Debug y haga clic en “Start Listening”.

Comandos Docker útiles

TareaComando
Iniciar todos los contenedoresdocker compose up -d
Detener todos los contenedoresdocker compose down
Detener y eliminar todos los datosdocker compose down -v
Ver registrosdocker compose logs -f
Limpiar caché de PSdocker exec CONTAINER rm -rf /var/www/html/var/cache/*
CLI de MySQLdocker exec -it CONTAINER-db mysql -u root -p'PASS' prestashop
Exportar base de datosdocker exec CONTAINER-db mysqldump -u root -p'PASS' prestashop > backup.sql
Importar base de datosdocker exec -i CONTAINER-db mysql -u root -p'PASS' prestashop < backup.sql
Abrir shell en el contenedordocker exec -it CONTAINER bash
Comprobar uso de recursosdocker stats --no-stream
Reconstruir tras cambios en Dockerfiledocker compose up -d --build
Ejecutar consola PrestaShopdocker exec CONTAINER php bin/console cache:clear --env=prod
Ejecutar Composer en un módulodocker exec -w /var/www/html/modules/my_module CONTAINER composer install

Consideraciones para producción

Para la mayoría de las tiendas PrestaShop, Docker es una herramienta de desarrollo. Las tiendas en producción funcionan mejor con hosting tradicional porque:

  • Una pila LAMP en un solo servidor es más sencilla de mantener y monitorear
  • La E/S nativa de archivos es más rápida que los volúmenes Docker (PrestaShop carga miles de archivos PHP por solicitud)
  • La mayoría de los proveedores de hosting para PrestaShop ofrecen cPanel/Plesk, no Docker

Docker en producción tiene sentido cuando: tiene un equipo de desarrollo grande con pipelines de CI/CD, necesita autoescalado durante eventos de ventas, gestióna más de 10 tiendas, o necesita despliegues sin tiempo de inactividad (construir nueva imagen, intercambiar, revertir si falla).

Docker Compose vs Kubernetes: Compose maneja hasta 20–30 contenedores en un solo servidor y es sencillo de administrar. Kubernetes añade autoescalado, autorrecuperación y orquestación multinodo, pero requiere una infraestructura significativa. Para la mayoría de los despliegues PrestaShop, Compose en un servidor potente es suficiente.

Problemas comunes y soluciónes

Problemas de permisos de archivos

Síntoma: Errores de “Permission denied”, no se pueden subir módulos ni guardar imágenes.

Causa: Apache se ejecuta como www-data (UID 33) dentro del contenedor, pero los archivos montados del host pueden pertenecer a su usuario (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

El contenedor no puede conectarse a la base de datos

  • DB_SERVER debe coincidir exactamente con el nombre del servicio MySQL en su archivo compose
  • MySQL puede no estar listo — añada un healthcheck y utilice depends_on: condition: service_healthy
  • Ambos contenedores deben estar en la misma red Docker
  • MySQL 8.0 usa caching_sha2_password por defecto — añada command: --default-authentication-plugin=mysql_native_password al servicio MySQL

E/S de archivos lenta en macOS

Síntoma: Las páginas tardan 10–30 segundos en cargar con bind mounts.

Soluciones:

  • VirtioFS: Cambie de gRPC FUSE a VirtioFS en la configuración de Docker Desktop — la mayor mejora individual
  • Monte menos: Monte solo el directorio de su módulo, utilice volúmenes con nombre para el núcleo de PrestaShop
  • Mutagen: Sincronización bidirecciónal rápida de archivos que elimina la penalización de macOS

SSL en desarrollo

Los módulos de pago y el inicio de sesión social a menudo requieren HTTPS. Opciones:

  • Nginx Proxy Manager: Gestiona la terminación SSL para todos los contenedores. El enfoque más limpio.
  • mkcert: Genere certificados de confianza local con mkcert localhost y móntelos en Apache.
  • Traefik: Detecta contenedores automáticamente y aprovisiona certificados.

El contenedor se queda sin memoria

MySQL 8.0 consume mucha memoria por defecto. Limítelo:

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

En Docker Desktop (macOS/Windows), aumente el límite global de memoria en Settings → Resources a por lo menos 6 GB para 3 o más contenedores. Detenga los contenedores que no esté usando activamente: docker compose stop ps178.

Bucles de autoinstalación

Si PrestaShop se reinstala en cada reinicio, asegúrese de que su volumen /var/www/html persiste y de que PS_FOLDER_INSTALL=disabled está configurado en su entorno.

Contenido mixto tras cambio de puerto

Actualice el dominio en la base de datos cuando cambie los mapeos de puertos:

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

Resumen

Docker transforma el desarrollo de PrestaShop de una experiencia frágil y de una sola versión en un flujo de trabajo reproducible y multiversión. La configuración inicial lleva una tarde. Después, puede levantar cualquier versión de PrestaShop en minutos, probar módulos en todas las versiones compatibles simultáneamente y compartir su entorno exacto con su equipo.

Comience con la configuración básica de un solo contenedor. Una vez que se sienta cómodo, añada más versiones, phpMyAdmin, Mailpit y Xdebug. Los archivos compose de esta guía son patrones probados en producción de nuestra propia infraestructura. Cópielos, adáptelos y construya sobre ellos.

El repositorio Docker de PrestaShop en GitHub es un excelente recurso para mantenerse actualizado con las novedades de las imágenes oficiales y las mejores prácticas.

More guides available

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

Cargando...
Volver arriba