Cet article contient toutes les étapes nécessaires pour créer un projet Symfony 5 avec docker-compose, nginx et PHP 7.4.
Structure des dossiers
Pour commencer, nous allons avoir besoin d’un dossier docker qui va contenir tous les dossiers nécessaires pour chaque container. Pour notre exemple, nous allons utiliser nginx, php ainsi que MariaDB

Une fois que cela est fait, nous rajoutons les Dockerfiles pour créer notre structure.

Maintenant il est nécessaire de créer le dossier qui contiendra le code de Symfony.
Pour cela, dans le terminal, la commande suivante importe tous les fichiers voulus. Dans cet exemple, je crée le dossier « symfony »
symfony new symfony --full --no-git
En utilisant –no-git, le dépôt git de Symfony ne sera pas configuré et il est possible d’ajouter les fichiers à votre repository sans problème.

Commencer les fichiers Dockerfile
L’utilisation des versions alpine permet d’avoir toutes les fonctionnalités nécessaires sans le superflu.
Dossier database
Modifier le fichier Dockerfile dans le dossier database
FROM mariadb:latest CMD ["mysqld"] EXPOSE 3306
FROM: indique à Docker quelle image il doit utiliser, dans le format repository:version
CMD: indique quelle commande il doit lancer au départ. Dans cet exemple, il démarre le serveur de la base de données
EXPOSE: indique quels ports doivent être visibles sur le réseau interne de Docker. Les autres containers peuvent utiliser ces informations pour se connecter à celui-ci.
Dans le dossier nginx
Le fichier Dockerfile dans le dossier nginx
FROM nginx:alpine CMD ["nginx"] EXPOSE 80 443
Dans le dossier php-fpm
FROM php:fpm-alpine RUN docker-php-ext-install pdo_mysql CMD ["php-fpm"] EXPOSE 9000
Afin de pouvoir utiliser une base de données, nous installons aussi l’extension pdo_mysql.
Création du fichier docker-compose
À la racine du dossier docker, créer un fichier nommé docker-compose.yml. C’est dans celui-ci que nous configurons et connectons tous les containers entre eux.
version: '3.8' services: php-fpm: nginx: database:
Le Build context
Pour pouvoir atteindre les autres containers, il est nécessaire de définir le build context avec un chemin relatif à celui-ci. Par exemple
services:
database:
build:
context: ./database
Configuration de la base de données
Pour la base de données, certains attributs sont obligatoires: le mot de passe root ainsi qu’une base de données.
C’est dans la section environment que l’on peut indiquer des variables à Docker. Dans la nôtre: le nom de la base de données, le mot de passe ainsi qu’un utilisateur par exemple. Dans notre exemple, cela ressemble à cela:
database:
build:
context: ./database
environment:
- MYSQL_DATABASE=symfonydb
- MYSQL_USER=user
- MYSQL_PASSWORD=secret
- MYSQL_ROOT_PASSWORD=dockerConfiguration du php-fpm
Par défaut Docker ne peut ni voir nos fichiers ni y accéder. Pour ce faire on utilise la section volume dans notre fichier docker-compose.yml
php-fpm:
build:
context: ./php-fpm
volumes:
- ../symfony:/var/www/symfonyle format est – host:container
Configuration du serveur nginx
Pour le serveur nginx l’accès au fichier est aussi nécessaire
nginx:
build:
context: ./nginx
volumes:
- ../symfony:/var/www/symfony
Malheureusement cela ne suffit pas pour faire fonctionner un serveur, nous avons aussi besoin d’exposer les ports et d’avoir des fichiers de configuration.
Exposer les ports
La section ports permet de définir quels ports doivent être accessibles depuis notre machine. Pour nginx il s’agit de 80 et 443
nginx:
build:
context: ./nginx
volumes:
- ../symfony:/var/www/symfony
ports:
- "80:80"
- "443:443"Par défaut, nginx ne permet que de charger des fichiers HTML. Pour Symfony nous avons besoin de php-fpm.
Fichiers de configuration
Pour commencer nous allons avoir besoin de nouveaux fichiers de configuration

Comme notre service php-fpm est dans son propre container, nous devons indiquer à Nginx où le trouver. Dans le fichier conf.d/default.conf il suffit d’ajouter ces lignes
#conf.d/default.conf
upstream php-upstream {
server php-fpm:9000;
}Ensuite dans le dossier site, nous pouvons créer le fichier de configuration nécessaire pour Symfony. Il s’agit d’une variante de celui trouvé sur le site de Symfony.
#sites/default.conf
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
server_name localhost;
root /var/www/symfony/public;
index index.php index.html index.htm;
location / {
try_files $uri /index.php$is_args$args;
}
location ~ ^/index.php(/|$) {
fastcgi_pass php-upstream;
fastcgi_split_path_info ^(.+.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
internal;
}
location ~ .php$ {
return 404;
}
}
Dans le fichier on peut voir fastcgi_pass php-upstream; qui correspond à notre container; il s’agit de la référence à celui créé dans conf.d/default.conf
Maintenant il faut aussi changer le fichier de configuration nginx.conf
#nginx.conf
user nginx;
worker_processes 4;
daemon off;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
access_log /var/log/nginx/access.log;
# Switch logging to console out to view via Docker
#access_log /dev/stdout;
#error_log /dev/stderr;
sendfile on;
keepalive_timeout 65;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-available/*.conf;
}Les deux lignes include configurent nginx avec les deux autres fichiers créés.
Maintenant il est nécessaire de rajouter tous ces fichiers dans le container en modifiant la section nginx dans docker-compose.yml
nginx:
build:
context: ./nginx
volumes:
- ../symfony:/var/www/symfony
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/sites/:/etc/nginx/sites-available
- ./nginx/conf.d/:/etc/nginx/conf.d
depends_on:
- php-fpm
ports:
- "80:80"
- "443:443"En ajoutant depends_on on indique qu’il faut démarrer php-fpm avant nginx.
docker-compose.yml final
Lorsque l’on met toutes les pièces ensemble, le fichier ressemble à cela:
version: '3.8'
services:
php-fpm:
build:
context: ./php-fpm
volumes:
- ../symfony:/var/www/symfony
nginx:
build:
context: ./nginx
volumes:
- ../symfony:/var/www/symfony
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/sites/:/etc/nginx/sites-available
- ./nginx/conf.d/:/etc/nginx/conf.d
depends_on:
- php-fpm
ports:
- "80:80"
- "443:443"
database:
build:
context: ./database
environment:
- MYSQL_DATABASE=symfonydb
- MYSQL_USER=user
- MYSQL_PASSWORD=secret
- MYSQL_ROOT_PASSWORD=dockerEnsuite dans le terminal dans le dossier docker:
docker-compose up
Ensuite on peut appeler l’URL: http://localhost/
Et voilà, votre Symfony est prêt:

