Introduction
Pimcore is an open-source, enterprise-grade software platform that combines Product Information Management (PIM), Master Data Management (MDM), Digital Asset Management (DAM), and a Digital Experience Platform (DXP/CMS) into a single unified system.
You can learn more about its core features on the Pimcore Official Website.
Core Capabilities:
- PIM / MDM: Centralizes and cleans up all business and product data (like specs, prices, and supplier info) to act as a single source of truth.
- DAM: Manages digital media files like images, videos, and documents, linking them directly to product data.
- DXP / CMS: Manages website content, portals, and personalized digital experiences.
- Commerce: Provides frameworks to build B2B or B2C digital commerce solutions.
Key Technical Facts:
- Framework Nature: It is not a rigid, click-and-go tool like WordPress or Shopify; it is a flexible developer platform built on PHP and the Symfony framework.
- API-Driven: It supports headless architecture via REST and GraphQL APIs for easy integration into existing enterprise IT landscapes.
Installation
Install: Using Docker
1) Directory layout
/opt/pimcore/
├── docker-compose.yml
├── db_data/ # MariaDB database files
└── app/ # Pimcore source code, uploads, assets, and caches
2) Create the target directory:
3) Create docker-compose.yml:
Where restart: unless-stopped ensures restart when the host is rebooted.
services:
db:
image: mariadb:10.11
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: secretpassword
MYSQL_DATABASE: pimcore
MYSQL_USER: pimcore
MYSQL_PASSWORD: pimcorepassword
volumes:
- ./db_data:/var/lib/mysql
app:
image: pimcore/pimcore:php8.3-latest
restart: unless-stopped
environment:
PIMCORE_DB_HOST: db
PIMCORE_DB_NAME: pimcore
PIMCORE_DB_USER: pimcore
PIMCORE_DB_PASSWORD: pimcorepassword
volumes:
- ./app:/var/www/html
depends_on:
- db
web:
#user: "1000:1000" # Forces container to use your host user IDs
image: nginx:alpine
restart: unless-stopped
ports:
- target: 80
host_ip: 127.0.0.1
published: 8080
protocol: tcp
mode: host
# - "8080:80"
#- "10.0.11.X:8080:8083"
volumes:
- ./app:/var/www/html
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
depends_on:
- app
Create /opt/pimcore/nginx.conf.
server {
listen 80;
server_name localhost;
root /var/www/html/public;
index index.php;
location / {
try_files $uri /index.php$is_args$args;
}
location ~ ^/index\.php(/|$) {
fastcgi_pass app:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
}
}
4) Initialize the Pimcore project skeleton:
Normal:
In case of policy errors and to circumvent them:
docker compose run --rm app composer create-project pimcore/skeleton:^11.0 . --no-install
docker compose run --rm app composer config policy.advisories.block false
docker compose run --rm app composer update
Note: Delete the files first in the
/opt/pimcore/appdirectory.
5) Start the containers and run the installer:
Run the container in the background.
Execute the installer inside the container.
docker compose exec app vendor/bin/pimcore-install \
--mysql-host-socket=db \
--mysql-username=pimcore \
--mysql-password=pimcorepassword \
--mysql-database=pimcore \
--admin-username=admin \
--admin-password=AdminPassword123! \
--no-interaction
6) Fix the access to the var directory.
Bring the running composer down.
Fix the access for the Nginx webserver running as user www-data (33).
7) Run the container
Run in the foreground and show the log.
Run instantly in the background.
Backup
A shell script should stop the container and create a backup using a timestamped filename.
docker compose down
tar -czvf "pimcore-backup-$(date -u +"%Y%m%dT%H%M%S").tar.gz" -C /opt pimcore
docker compose up -d
Alternatives
Running as pimcore as a Service.
Create file /etc/systemd/system/pimcore.service.
[Unit]
Description=Pimcore Docker Compose Application
Requires=docker.service
After=docker.service
[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/pimcore
ExecStart=/usr/bin/docker compose up -d
ExecStop=/usr/bin/docker compose down
[Install]
WantedBy=multi-user.target
Register the new service and start it.