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
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
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
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 :
DATABASE_URL="mysql://app:app@database:3306/app?serverVersion=8.0"
Puis on démarre :
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.localou 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.