This guide uses Docker Compose to run Magento 2.4.8 with all required services: OpenSearch, Redis, and RabbitMQ.
Current Version: 2.4.8 (released April 8, 2025)
⚠️ Important: Magento 2.4+ requires Elasticsearch or OpenSearch. Redis and RabbitMQ are required for production deployments.
For Docker installation, see Docker.
Bitnami maintains an official Magento 2 Docker image with all dependencies.
version: '3.8'
services:
opensearch:
image: opensearchproject/opensearch:2.11.0
container_name: opensearch
environment:
- discovery.type=single-node
- plugins.security.disabled=true
- 'OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m'
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- opensearch_data:/usr/share/opensearch/data
networks:
- magento-net
restart: unless-stopped
redis:
image: redis:7-alpine
container_name: redis
networks:
- magento-net
restart: unless-stopped
volumes:
- redis_data:/data
rabbitmq:
image: rabbitmq:3-management-alpine
container_name: rabbitmq
environment:
RABBITMQ_DEFAULT_USER: magento
RABBITMQ_DEFAULT_PASS: magento-password-change-me
ports:
- "15672:15672" # Management UI
- "5672:5672" # AMQP port
networks:
- magento-net
restart: unless-stopped
volumes:
- rabbitmq_data:/var/lib/rabbitmq
mariadb:
image: mariadb:11.4
container_name: mariadb
environment:
MYSQL_DATABASE: magento
MYSQL_USER: magento
MYSQL_PASSWORD: magento-password-change-me
MYSQL_ROOT_PASSWORD: magento-root-password-change-me
volumes:
- mariadb_data:/var/lib/mysql
networks:
- magento-net
restart: unless-stopped
magento:
image: bitnami/magento:2.4
container_name: magento
ports:
- "8080:8080"
environment:
- MAGENTO_DATABASE_HOST=mariadb
- MAGENTO_DATABASE_PORT=3306
- MAGENTO_DATABASE_NAME=magento
- MAGENTO_DATABASE_USER=magento
- MAGENTO_DATABASE_PASSWORD=magento-password-change-me
- MAGENTO_DATABASE_ROOT_PASSWORD=magento-root-password-change-me
- MAGENTO_HOST=your-domain.com
- MAGENTO_MODE=production
- ELASTICSEARCH_HOST=opensearch
- ELASTICSEARCH_PORT=9200
- REDIS_HOST=redis
- REDIS_PORT=6379
- RABBITMQ_HOST=rabbitmq
- RABBITMQ_PORT=5672
- RABBITMQ_USER=magento
- RABBITMQ_PASSWORD=magento-password-change-me
volumes:
- magento_data:/bitnami/magento
depends_on:
- mariadb
- opensearch
- redis
- rabbitmq
networks:
- magento-net
restart: unless-stopped
volumes:
opensearch_data:
redis_data:
rabbitmq_data:
mariadb_data:
magento_data:
networks:
magento-net:
docker compose up -d
Wait 2-3 minutes for all services to initialize, then access at http://YOUR-SERVER:8080
Access the Magento admin at http://YOUR-SERVER:8080/admin and complete the setup wizard.
For more control, build your own Magento 2 container:
FROM php:8.3-apache
# Install system dependencies
RUN apt-get update && apt-get install -y \
git \
curl \
libpng-dev \
libonig-dev \
libxml2-dev \
libzip-dev \
libicu-dev \
freetds-dev \
libxslt1-dev \
zip \
unzip \
&& docker-php-ext-install pdo_mysql bcmath intl zip xsl soap \
&& 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
# Create Magento user
RUN useradd -G www-data,root -u 1000 magento || true
# Set working directory
WORKDIR /var/www/html
# Apache configuration for Magento
COPY apache-magento.conf /etc/apache2/sites-available/000-default.conf
EXPOSE 80
version: '3.8'
services:
opensearch:
image: opensearchproject/opensearch:2.11.0
environment:
- discovery.type=single-node
- plugins.security.disabled=true
- 'OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m'
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- opensearch_data:/usr/share/opensearch/data
networks:
- magento-net
redis:
image: redis:7-alpine
networks:
- magento-net
volumes:
- redis_data:/data
rabbitmq:
image: rabbitmq:3-management-alpine
environment:
RABBITMQ_DEFAULT_USER: magento
RABBITMQ_DEFAULT_PASS: magento-password-change-me
ports:
- "15672:15672"
- "5672:5672"
networks:
- magento-net
volumes:
- rabbitmq_data:/var/lib/rabbitmq
mariadb:
image: mariadb:11.4
environment:
MYSQL_DATABASE: magento
MYSQL_USER: magento
MYSQL_PASSWORD: magento-password-change-me
MYSQL_ROOT_PASSWORD: magento-root-password-change-me
volumes:
- mariadb_data:/var/lib/mysql
networks:
- magento-net
magento:
build: .
ports:
- "8080:80"
environment:
- MAGENTO_DB_HOST=mariadb
- MAGENTO_DB_NAME=magento
- MAGENTO_DB_USER=magento
- MAGENTO_DB_PASSWORD=magento-password-change-me
volumes:
- magento_app:/var/www/html
depends_on:
- mariadb
- opensearch
- redis
- rabbitmq
networks:
- magento-net
volumes:
opensearch_data:
redis_data:
rabbitmq_data:
mariadb_data:
magento_app:
networks:
magento-net:
# Build the container
docker compose build
# Start services
docker compose up -d
# Install Magento 2 via Composer
docker compose exec magento bash
composer create-project --repository=https://repo.magento.com/ magento/project-community-edition magento2
Magento 2 requires three cron jobs. Add to crontab inside the container:
docker compose exec magento bash
crontab -e
Add:
* * * * * /usr/local/bin/php /var/www/html/magento2/bin/cron.php
* * * * * /usr/local/bin/php /var/www/html/magento2/update/cron.php
* * * * * /bin/bash /var/www/html/magento2/bin/cron.sh
docker compose exec magento bash
cd /var/www/html/magento2
php bin/magento deploy:mode:set production
php bin/magento setup:static-content:deploy -f
php bin/magento cache:enable
RabbitMQ management UI: http://YOUR-SERVER:15672
magentomagento-password-change-me