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 -vy 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/prestashopen 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
| Tarea | Comando |
|---|---|
| Iniciar todos los contenedores | docker compose up -d |
| Detener todos los contenedores | docker compose down |
| Detener y eliminar todos los datos | docker compose down -v |
| Ver registros | docker compose logs -f |
| Limpiar caché de PS | docker exec CONTAINER rm -rf /var/www/html/var/cache/* |
| CLI de MySQL | docker exec -it CONTAINER-db mysql -u root -p'PASS' prestashop |
| Exportar base de datos | docker exec CONTAINER-db mysqldump -u root -p'PASS' prestashop > backup.sql |
| Importar base de datos | docker exec -i CONTAINER-db mysql -u root -p'PASS' prestashop < backup.sql |
| Abrir shell en el contenedor | docker exec -it CONTAINER bash |
| Comprobar uso de recursos | docker stats --no-stream |
| Reconstruir tras cambios en Dockerfile | docker compose up -d --build |
| Ejecutar consola PrestaShop | docker exec CONTAINER php bin/console cache:clear --env=prod |
| Ejecutar Composer en un módulo | docker 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_SERVERdebe 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_passwordpor defecto — añadacommand: --default-authentication-plugin=mysql_native_passwordal 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 localhosty 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.