docker plus symfony

Plus loin avec Symfony et docker

Spread the love

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 compose
services : liste des services
database : nom du service (vous pouvez le nommer comme vous le souhaitez)
image : nom et version de l’image sur le hub docker
commande : pour remplacer la commande par défaut
ports : port exposé : port mappé
environment : les variables d’environnement
restart : la police de redémarrage
volumes : 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.

chevron_left
chevron_right

Laisser un commentaire

%d blogueurs aiment cette page :