DDEV to wygodne narzędzie ale nie jedyna droga. Własny stack Docker Compose daje pełną kontrolę: dokładnie te wersje usług których potrzebujesz, własna sieć, integracja z CI/CD, możliwość wdrożenia na dowolnym serwerze bez zmian. Pokażę minimalny ale kompletny stack dla Magento 2 z PHP 8.4, MariaDB 10.6, Redis, OpenSearch i nginx.
Struktura projektu
magento-docker/
docker-compose.yml
docker-compose.override.yml # lokalne nadpisania (gitignore)
.env # zmienne środowiskowe
docker/
nginx/
default.conf # konfiguracja nginx dla Magento 2
php/
Dockerfile # PHP 8.4 + rozszerzenia
php.ini
php-fpm.conf
mysql/
my.cnf
docker-compose.yml
services:
nginx:
image: nginx:1.27-alpine
ports:
- "80:80"
- "443:443"
volumes:
- .:/var/www/html:cached
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
- ./docker/ssl:/etc/nginx/ssl:ro
depends_on: [php]
networks: [magento]
php:
build:
context: ./docker/php
args:
PHP_VERSION: "8.4"
volumes:
- .:/var/www/html:cached
- ./docker/php/php.ini:/usr/local/etc/php/php.ini:ro
environment:
PHP_IDE_CONFIG: "serverName=magento"
XDEBUG_MODE: "${XDEBUG_MODE:-off}"
XDEBUG_CLIENT_HOST: host-gateway
extra_hosts:
- "host-gateway:host-gateway"
networks: [magento]
db:
image: mariadb:10.6
environment:
MARIADB_ROOT_PASSWORD: root
MARIADB_DATABASE: magento
MARIADB_USER: magento
MARIADB_PASSWORD: magento
volumes:
- db_data:/var/lib/mysql
- ./docker/mysql/my.cnf:/etc/mysql/conf.d/magento.cnf:ro
ports:
- "3306:3306"
networks: [magento]
redis:
image: redis:7.2-alpine
command: redis-server --maxmemory 512mb --maxmemory-policy volatile-lru
ports:
- "6379:6379"
networks: [magento]
opensearch:
image: opensearchproject/opensearch:2.13.0
environment:
discovery.type: single-node
DISABLE_SECURITY_PLUGIN: "true"
OPENSEARCH_JAVA_OPTS: "-Xms512m -Xmx512m"
volumes:
- opensearch_data:/usr/share/opensearch/data
ports:
- "9200:9200"
networks: [magento]
mailpit:
image: axllent/mailpit:latest
ports:
- "8025:8025" # web UI
- "1025:1025" # SMTP
networks: [magento]
volumes:
db_data:
opensearch_data:
networks:
magento:
driver: bridge
Dockerfile PHP
FROM php:8.4-fpm-alpine
ARG PHP_VERSION=8.4
RUN apk add --no-cache \
freetype-dev libjpeg-turbo-dev libpng-dev \
libzip-dev oniguruma-dev libxml2-dev \
icu-dev git unzip
RUN docker-php-ext-configure gd --with-freetype --with-jpeg && \
docker-php-ext-install -j$(nproc) \
bcmath gd intl mbstring opcache pdo_mysql \
soap sockets xml zip
RUN pecl install redis xdebug && \
docker-php-ext-enable redis
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
WORKDIR /var/www/html
RUN addgroup -g 1000 magento && \
adduser -u 1000 -G magento -s /bin/sh -D magento
USER magento
Komendy codziennej pracy
# Uruchom stack docker compose up -d # Shell PHP docker compose exec php sh # Magento CLI docker compose exec php bin/magento cache:flush # Composer docker compose exec php composer require vendor/package # Włącz Xdebug (przez override) XDEBUG_MODE=debug docker compose up -d php # Logi docker compose logs -f php docker compose logs -f nginx # Zatrzymaj docker compose down
Podsumowanie
Własny Docker Compose daje pełną kontrolę kosztem konfiguracji. DDEV robi to samo ale automatycznie – wybór zależy od potrzeb. Własny stack warto mieć gdy: używasz niestandardowych wersji usług, integrujesz z CI/CD (ten sam docker-compose.yml na dev i pipeline), lub potrzebujesz specyficznej konfiguracji sieci. DDEV wygrywa przy szybkim starcie i prostych projektach.
