Pourquoi ?
Parce que vous souhaitez maîtriser votre environnement de développement.
Pour repartir de zéro sans tout installer.
Pour avoir un environnement Docker/Symfony aux petits oignons.
Qu’est-ce que docker-compose
Il s’agit d’un outil permettant de configurer la façon dont les conteneurs seront lancés avec une configuration en YAML.
De quel conteneur docker avez-vous besoin ?
Vous pouvez utiliser les images officielles mysql, redis, ngnix, php pour vous simplifier la vie.
configuration mysql
Vous n’avez pas besoin de configuration spécifique.
Suivez simplement la documentation ? :
#docker-compose.yml
version: '3.7'
services:
database:
image: mysql:8.0.20
command: ["--default-authentication-plugin=mysql_native_password"]
ports:
- 3306:3306
volumes:
- db-volume:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: symfony
MYSQL_USER: symfony
MYSQL_PASSWORD: symfony
restart: always
volumes:
db-volume
Quelques définitions :
version
: la version du fichier de docker composeservices
: liste des servicesdatabase
: nom du service (vous pouvez le nommer comme vous le souhaitez)image
: nom et version de l’image sur le hub dockercommande
: pour remplacer la commande par défautports
: port exposé : port mappéenvironment
: les variables d’environnementrestart
: la police de redémarragevolumes
: les volumes de données des conteneurs (vous ne perdez pas vos données lorsque vous supprimez votre conteneur)
redis
Vous pouvez utiliser une image alpine pour avoir un conteneur plus léger :
#docker-compose.yml
#...
redis:
image: redis:6.0.1-alpine3.11
restart: always
ngnix
Avec nginx, vous devez ajouter votre configuration spécifique :
#docker-compose.yml
#...
nginx:
image: nginx:1.18.0-alpine
ports:
- 80:80
volumes:
- /your/projects/path:/var/www
- ./symfony.conf:/etc/nginx/conf.d/symfony.conf
restart: always
C’est une configuration « spéciale ». Vous pouvez utiliser cette configuration avec une structure SF3 et une structure SF4/SF5.
# symfony.conf
server {
listen 80;
server_name ~^(?<project>[^\.]+)\.(?<domain>[^\.]+)$;
set $publicDir "public";
set $frontController "index";
#Determine if this is an application SF3 or SF4
if (-d /var/www/${project}/web){
set $publicDir "web";
set $frontController "app_dev";
}
root /var/www/${project}/$publicDir;
set $server_name_full $project.$domain;
location / {
try_files $uri @rewriteapp;
}
location @rewriteapp {
rewrite ^(.*)$ /$frontController.php/$1 last;
}
location ~ ^/(app_dev|index)\.php(/|$) {
fastcgi_pass php-upstream;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param HTTPS off;
fastcgi_param DOCUMENT_ROOT $realpath_root;
fastcgi_param SERVER_NAME $server_name_full;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
}
location ~ \.php$ {
return 404;
}
error_log /var/log/nginx/symfony_error.log;
access_log /var/log/nginx/symfony_access.log;
}
php
Vous permet de partager le dossier de vos projets :
#docker-compose.yml
#...
php:
image: php:7.4-fpm
volumes:
- /your/projects/path:/var/www
restart: always
Dépendance et réseau
Pour fonctionner, votre conteneur nginx a besoin du conteneur php, et votre conteneur php a besoin du conteneur mysql et redis.
Si vous hébergez de nombreuses applications et que les applications communiquent entre elles, vous devrez définir les IP des conteneurs.
#hosts
*.localhost 172.22.0.8
#docker-compose.yml
version: '3.7'
services:
database:
image: mysql:8.0.20
command: ["--default-authentication-plugin=mysql_native_password"]
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: symfony
MYSQL_USER: symfony
MYSQL_PASSWORD: symfony
volumes:
- db-volume:/var/lib/mysql
networks:
kiora_net:
ipv4_address: 172.22.0.2
restart: always
redis:
image: redis:6.0.1-alpine3.11
networks:
kiora_net:
ipv4_address: 172.22.0.4
restart: always
php:
image: php:7.4-fpm
volumes:
- /your/projects/path:/var/www
- ./hosts:/etc/hosts
- /tmp:/tmp
depends_on:
- database
- redis
networks:
kiora_net:
ipv4_address: 172.22.0.6
restart: always
nginx:
image: nginx:1.18.0-alpine
ports:
- 80:80
depends_on:
- php
volumes:
- /your/projects/path:/var/www
- ./hosts:/etc/hosts
- ./symfony.conf:/etc/nginx/conf.d/symfony.conf
networks:
kiora_net:
ipv4_address: 172.22.0.8
restart: always
networks:
kiora_net:
driver: bridge
ipam:
config:
- subnet: 172.22.0.0/24
volumes:
db-volume:
Plus de flexibilité
Vous pouvez ajouter des variables d’environnement pour personnaliser le chemin du projet et le port d’exposition.
# .env
DOCKER_VOLUME_PATH=/var/www /
NGNIX_PORT=80
DB_PORT=3306
#docker-compose.yml
# ...
nginx:
image: nginx:1.18.0-alpine
ports:
- ${NGNIX_PORT}:80
depends_on:
- php
volumes:
- ${DOCKER_VOLUME_PATH}:/var/www
# ...
Super ! Vous avez votre environnement Symfony ?
Après, vous pouvez aller plus loin. Avoir Blackfire ou même Rabbitmq et cela, avec quelques lignes en plus dans votre config.