This guide uses Docker Compose to run PrestaShop 9.0 with the official Docker image.
Current Version: 9.0.x (released 2025-2026)
For Docker installation, see Docker.
PrestaShop maintains an official Docker image.
version: '3.8'
services:
mariadb:
image: mariadb:10.6
container_name: prestashop-mariadb
restart: unless-stopped
environment:
MYSQL_DATABASE: prestashop
MYSQL_USER: prestashop
MYSQL_PASSWORD: prestashop-password-change-me
MYSQL_ROOT_PASSWORD: mariadb-root-password-change-me
volumes:
- mariadb_data:/var/lib/mysql
networks:
- prestashop-net
prestashop:
image: prestashop/prestashop:latest
container_name: prestashop
restart: unless-stopped
depends_on:
- mariadb
ports:
- "8080:80"
environment:
DB_SERVER: mariadb
DB_NAME: prestashop
DB_USER: prestashop
DB_PASSWD: prestashop-password-change-me
DB_PREFIX: ps_
PS_LANGUAGE: en
PS_COUNTRY: us
PS_USE_SSL: 'false'
MAIL_METHOD: '1'
SMTP_SERVER: 'localhost'
SMTP_LOGIN: ''
SMTP_PASSWORD: ''
SMTP_PORT: '25'
PS_ERASE_DB: 'false'
PS_REMOVE_DEFAULT_SAMPLE: 'true'
volumes:
- prestashop_data:/var/www/html
networks:
- prestashop-net
volumes:
mariadb_data:
prestashop_data:
networks:
prestashop-net:
docker compose up -d
Wait 2-3 minutes for PrestaShop to initialize.
Access at http://YOUR-SERVER:8080
The official PrestaShop image runs the installer automatically on first run. Access http://YOUR-SERVER:8080 and complete the setup wizard with:
For better performance, use the Nginx-based image:
version: '3.8'
services:
mariadb:
image: mariadb:10.6
container_name: prestashop-mariadb
restart: unless-stopped
environment:
MYSQL_DATABASE: prestashop
MYSQL_USER: prestashop
MYSQL_PASSWORD: prestashop-password-change-me
MYSQL_ROOT_PASSWORD: mariadb-root-password-change-me
volumes:
- mariadb_data:/var/lib/mysql
networks:
- prestashop-net
prestashop:
image: prestashop/prestashop:latest-nginx
container_name: prestashop
restart: unless-stopped
depends_on:
- mariadb
ports:
- "8080:80"
environment:
DB_SERVER: mariadb
DB_NAME: prestashop
DB_USER: prestashop
DB_PASSWD: prestashop-password-change-me
DB_PREFIX: ps_
PS_LANGUAGE: en
PS_COUNTRY: us
volumes:
- prestashop_data:/var/www/html
networks:
- prestashop-net
volumes:
mariadb_data:
prestashop_data:
networks:
prestashop-net:
For maximum control, build your own PrestaShop container:
FROM php:8.2-apache
# Install system dependencies
RUN apt-get update && apt-get install -y \
git \
curl \
libpng-dev \
libonig-dev \
libxml2-dev \
libzip-dev \
libicu-dev \
zip \
unzip \
&& docker-php-ext-install pdo_mysql bcmath intl zip gd \
&& a2enmod rewrite headers ssl \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
# Install Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
WORKDIR /var/www/html
# Apache configuration for PrestaShop
COPY apache-prestashop.conf /etc/apache2/sites-available/000-default.conf
EXPOSE 80
version: '3.8'
services:
mariadb:
image: mariadb:10.6
environment:
MYSQL_DATABASE: prestashop
MYSQL_USER: prestashop
MYSQL_PASSWORD: prestashop-password-change-me
MYSQL_ROOT_PASSWORD: mariadb-root-password-change-me
volumes:
- mariadb_data:/var/lib/mysql
prestashop:
build: .
ports:
- "8080:80"
depends_on:
- mariadb
volumes:
- prestashop_app:/var/www/html
volumes:
mariadb_data:
prestashop_app:
docker compose up -d
# Install PrestaShop via Composer
docker compose exec prestashop bash
composer create-project prestashop/prestashop prestashop
PrestaShop requires cron jobs for scheduled tasks:
docker compose exec prestashop bash
crontab -e
Add:
0 * * * * curl -s http://localhost/modules/autoupgrade/cron.php
docker compose exec prestashop bash
cd /var/www/html/prestashop
php console cache:clear
php console asset:install
For production, use a reverse proxy (Nginx/Traefik) with Let’s Encrypt:
# Add to docker-compose.yml
services:
traefik:
image: traefik:v2.10
command:
- "--providers.docker=true"
- "--entrypoints.web.address=:80"
- "--entrypoints.websecure.address=:443"
- "--certificatesresolvers.letsencrypt.acme.tlschallenge=true"
- "--certificatesresolvers.letsencrypt.acme.email=your@email.com"
- "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
ports:
- "80:80"
- "443:443"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
- letsencrypt:/letsencrypt