This guide uses Docker Compose to run OpenCart 4.0 with a custom Docker image.
Current Version: 4.0.x (released 2023-2024)
⚠️ Important: No official OpenCart Docker image exists (Bitnami does NOT maintain one). You must build a custom image or use community images.
For Docker installation, see Docker.
Build your own OpenCart Docker image for production use.
FROM php:8.1-apache
# Install system dependencies
RUN apt-get update && apt-get install -y \
git \
curl \
libpng-dev \
libonig-dev \
libxml2-dev \
libzip-dev \
zip \
unzip \
&& docker-php-ext-install pdo_mysql bcmath zip gd mysqli \
&& 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
# Set working directory
WORKDIR /var/www/html
# Apache configuration for OpenCart
COPY apache-opencart.conf /etc/apache2/sites-available/000-default.conf
EXPOSE 80
version: '3.8'
services:
mariadb:
image: mariadb:10.6
container_name: opencart-mariadb
restart: unless-stopped
environment:
MYSQL_DATABASE: opencart
MYSQL_USER: opencart
MYSQL_PASSWORD: opencart-password-change-me
MYSQL_ROOT_PASSWORD: mariadb-root-password-change-me
volumes:
- mariadb_data:/var/lib/mysql
networks:
- opencart-net
opencart:
build: .
container_name: opencart
restart: unless-stopped
depends_on:
- mariadb
ports:
- "8080:80"
volumes:
- opencart_data:/var/www/html
networks:
- opencart-net
volumes:
mariadb_data:
opencart_data:
networks:
opencart-net:
# Build the Docker image
docker compose build
# Start the stack
docker compose up -d
# Install OpenCart via Composer
docker compose exec opencart bash
composer create-project opencart/opencart opencart
Then access http://YOUR-SERVER:8080 and complete the installation wizard.
⚠️ Warning: Community images may not be regularly updated. Verify before production use.
Some community-maintained images exist on Docker Hub, but none are official:
version: '3.8'
services:
mariadb:
image: mariadb:10.6
environment:
MYSQL_DATABASE: opencart
MYSQL_USER: opencart
MYSQL_PASSWORD: opencart-password-change-me
MYSQL_ROOT_PASSWORD: mariadb-root-password-change-me
volumes:
- mariadb_data:/var/lib/mysql
opencart:
image: docker24/opencart:4.0 # Community image, verify before use
ports:
- "8080:80"
depends_on:
- mariadb
environment:
DB_HOST: mariadb
DB_NAME: opencart
DB_USER: opencart
DB_PASSWORD: opencart-password-change-me
Note: Community images should be thoroughly tested before production use as they may not receive security updates.
For development/testing:
version: '3.8'
services:
mariadb:
image: mariadb:10.6
environment:
MYSQL_DATABASE: opencart
MYSQL_USER: opencart
MYSQL_PASSWORD: opencart-password-change-me
MYSQL_ROOT_PASSWORD: mariadb-root-password-change-me
volumes:
- mariadb_data:/var/lib/mysql
web:
image: php:8.1-apache
ports:
- "8080:80"
volumes:
- ./opencart:/var/www/html
command: >
bash -c "
apt-get update &&
apt-get install -y libpng-dev libonig-dev libxml2-dev libzip-dev &&
docker-php-ext-install pdo_mysql bcmath zip gd mysqli &&
a2enmod rewrite headers &&
apache2-foreground
"
Then manually install OpenCart:
docker compose up -d
docker compose exec web bash
cd /var/www/html
composer create-project opencart/opencart .
After installation, remove the install directory:
docker compose exec opencart rm -rf /var/www/html/opencart/install
OpenCart requires cron jobs:
docker compose exec opencart bash
crontab -e
Add:
0 * * * * cd /var/www/html/opencart && /usr/local/bin/php cli/cron.php
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