Tous les articles
  • Symfony
  • Docker
  • DevOps

Un environnement Docker propre pour un projet Symfony

PHP-FPM, Nginx et MySQL avec Docker Compose — une base simple et reproductible pour développer une application Symfony en équipe.

« Chez moi, ça marche » : avec Docker, cette phrase n'a plus de raison d'exister. Toute l'équipe partage le même environnement, de la version de PHP aux extensions installées. Voici la base que j'utilise pour démarrer un projet Symfony : trois services, un Dockerfile court et quelques commandes.

L'architecture

  • php : PHP-FPM avec les extensions dont Symfony a besoin ;
  • nginx : le serveur web, qui transmet les requêtes PHP à FPM ;
  • database : MySQL 8.

Le Dockerfile PHP

Dockerfile
FROM php:8.3-fpm

RUN apt-get update && apt-get install -y git unzip libicu-dev libzip-dev \
    && docker-php-ext-install intl pdo_mysql opcache zip \
    && rm -rf /var/lib/apt/lists/*

COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
WORKDIR /var/www/app

Copier Composer depuis son image officielle évite de l'installer à la main et garantit une version récente.

Le fichier compose.yaml

YAML
services:
  php:
    build: .
    volumes:
      - ./:/var/www/app
    depends_on: [database]

  nginx:
    image: nginx:1.27-alpine
    ports: ["8080:80"]
    volumes:
      - ./:/var/www/app
      - ./docker/nginx.conf:/etc/nginx/conf.d/default.conf:ro
    depends_on: [php]

  database:
    image: mysql:8.0
    environment:
      MYSQL_DATABASE: app
      MYSQL_USER: app
      MYSQL_PASSWORD: app
      MYSQL_ROOT_PASSWORD: root
    volumes:
      - db-data:/var/lib/mysql

volumes:
  db-data:

Le volume nommé db-data conserve la base de données entre deux redémarrages.

La configuration Nginx

Nginx
server {
    listen 80;
    root /var/www/app/public;

    location / {
        try_files $uri /index.php$is_args$args;
    }

    location ~ ^/index\.php(/|$) {
        fastcgi_pass php:9000;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        internal;
    }
}

fastcgi_pass php:9000 fonctionne car Docker Compose crée un réseau où chaque service est joignable par son nom.

Brancher Symfony

Dans .env.local, l'hôte de la base est simplement le nom du service :

Terminal
DATABASE_URL="mysql://app:app@database:3306/app?serverVersion=8.0"

Puis on démarre :

Terminal
docker compose up -d --build
docker compose exec php composer install
docker compose exec php bin/console doctrine:migrations:migrate

L'application répond sur http://localhost:8080.

Mes conseils

  • Un Makefile avec des raccourcis (make up, make sh, make migrate) fait gagner du temps à toute l'équipe.
  • Xdebug à la demande : installez-le dans une étape séparée du Dockerfile ou activez-le par variable d'environnement, pour ne pas ralentir le quotidien.
  • Ne versionnez jamais vos secrets : gardez les identifiants dans .env.local ou dans le coffre de secrets de Symfony.
  • Pour aller plus loin, le projet open source symfony-docker de Kévin Dunglas propose une base très complète avec FrankenPHP et HTTPS en local.

Cette base est volontairement minimale : elle se lit en deux minutes, et chacun peut la faire évoluer selon les besoins du projet.