Configurer un environnement pour Symfony 3 avec PHP 7.1.0fpm , Mysql 8, Nginx 1.11 sous Docker

Configurer un environnement pour Symfony 3 avec PHP 7.1.0fpm , Mysql 8, Nginx 1.11 sous Docker

L’objectif de cet article n’est pas de vous apprendre Docker mais de mettre à disposition une stack récente et bien configurée. Je vous conseille de d’abord lire la documentation officielle sur Docker et Docker Compose.

Pour mon article je me suis beaucoup inspiré de cet article qui explique très bien le principe de Docker et ses avantages, n’hésitez pas à le lire également :

https://www.baptiste-donaux.fr/tutoriel-docker-symfony-docker-compose/

J’ai donc exactement construit ma configuration de la même façon :

un docker-compose.yml qui contient ma configuration réel et qui n’est pas sur dépot Git et  un docker-compose.dist qui est la base versionnée sous Git à la racine de mon projet Symfony.

Et on créé également un dossier docker qui contiendra la configuration des différents containers.

Ce docker-compose.yml est donc divisé en 3 parties :

  • [front] Le serveur web NGINX 1.11
  • [engine] L’engine PHP7-FPM
  • [db] La Base de donnée Mysql 8.0

Voici le fichier :

front:
    image: nginx:1.11.10
    ports:
        - "81:80"
    links:
        - "engine:engine"
    volumes:
        - ".:/home/docker:ro"
        - "./docker/front/default.conf:/etc/nginx/conf.d/default.conf:ro"
engine:
    build: ./docker/engine/dev/
    volumes:
        - ".:/home/docker:rw"
        - "./docker/engine/php.ini:/usr/local/etc/php/conf.d/custom.ini:ro"
    links:
        - "db:db"
    working_dir: "/home/docker"

db:
    image: mysql:8.0.0
    ports:
        - "3307:3306"
    environment:
        - MYSQL_ROOT_PASSWORD=mypwd
        - MYSQL_USER=myusermysql
        - MYSQL_PASSWORD=mypwd
        - MYSQL_DATABASE=mydatabasename

Pour le container front je vous conseille de fixer la version de nginx en précisant la version sinon il prendra la dernière version, on redirige le port 80 du container vers le 81 de votre machine physique on lie le container front avec le container engine pour qu’ils puissent communiquer.

On monte un volume pour pouvoir avoir la configuration du serveur nginx sur notre machine physique dont voici la configuration (docker/front/default.conf) :

Cette version est configurer pour un environnement de développement :

server {
    listen 80;
    root   /home/docker/web;

    rewrite ^/app_dev\.php/?(.*)$ /$1 permanent;

    location / {
        try_files $uri @rewriteapp;
    }

    gzip on;
    gzip_buffers 4 32k;
    gzip_min_length 1100;
    gzip_types text/plain application/x-javascript text/xml text/css;
    gzip_vary on;

    location ~ ^/(app|app_dev|config)\.php(/|$) {
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass engine:9000;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
    }

    location ~* \.(jpg|jpeg|gif|css|png|js|ico|html|eof|woff|ttf)$ {
        if (-f $request_filename) {
            expires 30d;
            access_log off; 
        } 

        try_files $uri @rewriteapp;
    }

    location @rewriteapp {
        rewrite ^(.*)$ /app_dev.php/$1 last;
    }
}

Ensuite nous avons un container engine qui lui ne contient pas une image directement disponibile sur le DockerHub mais un Dockerfile qui contient toutes les directives pour faire une image personnalisé (docker/engine/dev/Dockerfile)

J’ai construit deux fichiers différents uniquement pour activer xDebug en environnement de développement. Par rapport à l’article mis en lien plus haut j’ai aussi amélioré ce Dockerfile puisqu’il contient maintenant l’extension apcu pour que le cache apc fonctionne correctement sur mon projet Symfony 3

Voici le fichier :

FROM php:7.1.0-fpm
MAINTAINER Laurent Masforne <laurent.masforne@gmail.com>
ENV PHP_APCU_VERSION 5.1.8
ENV PHP_XDEBUG_VERSION 2.5.0
RUN apt-get update \
    && apt-get install -y \
        libicu-dev \
        zlib1g-dev \

    && docker-php-source extract \
    && curl -L -o /tmp/apcu-$PHP_APCU_VERSION.tgz https://pecl.php.net/get/apcu-$PHP_APCU_VERSION.tgz \
    && curl -L -o /tmp/xdebug-$PHP_XDEBUG_VERSION.tgz http://xdebug.org/files/xdebug-$PHP_XDEBUG_VERSION.tgz \
    && tar xfz /tmp/apcu-$PHP_APCU_VERSION.tgz \
    && tar xfz /tmp/xdebug-$PHP_XDEBUG_VERSION.tgz \
    && rm -r \
        /tmp/apcu-$PHP_APCU_VERSION.tgz \
        /tmp/xdebug-$PHP_XDEBUG_VERSION.tgz \
    && mv apcu-$PHP_APCU_VERSION /usr/src/php/ext/apcu \
    && mv xdebug-$PHP_XDEBUG_VERSION /usr/src/php/ext/xdebug \
    && docker-php-ext-install \
        apcu \
        intl \
        mbstring \
        mysqli \
        pdo \
        pdo_mysql \
        xdebug \
        zip \
    && pecl install apcu_bc-1.0.3 \
    && docker-php-source delete \
    && php -r "readfile('https://getcomposer.org/installer');" | php -- --install-dir=/usr/local/bin --filename=composer \
    && chmod +x /usr/local/bin/composer

A noter également que j’ai fixer les versions de xdebux et apcu mais vous pouvez bien sur choisir des versions plus hautes à l’heure ou vous lisez cet article.

Ensuite comme dans le container front on monte un volume dans le container engine pour faire pointer un fichier php.ini 

date.timezone = Europe/Paris
xdebug.max_nesting_level=500
short_open_tag = off
extension=apcu.so
extension=apc.so
default_charset = "utf-8"
mbstring.internal_encoding=utf-8
mbstring.http_output=UTF-8
mbstring.encoding_translation=On
mbstring.func_overload=6

Et pour finir le container db qui contient le configuration à la base donnée ici mysql 8.0.0.

Rien d’exotique on fait une redirection de ports 3306 > 3307 car déjà utilisé sur ma machine,  et on set bien l’environnement avec les valeurs désirées pour la configuration MySQL que l’on répercute dans notre fichier parameters.yml :

parameters:
    database_host: db
    database_port: 3306
    database_name: mydatabasename
    database_user: root
    database_password: mypwd

Tout comme le lien de l’article la haut je vais mettre à disposition l’ensemble des fichiers dans un .tar.gz pour que vous puissiez récupérer toute la configuration directement :

Symfony3-DockerCompose-Stack.tar

Je finirai par quelques commandes utiles pour gérer vos containers :

Pour démarrer vos 3 containers via docker-compose :

docker-compose up

Afficher la liste des containers et leur statuts :

docker ps

Rentrer dans un container 

docker exec -it nomdemoncontainer bash

N’hésitez pas à me remonter vos remarques ou vos erreurs dans les commentaires.

 

3 réactions au sujet de « Configurer un environnement pour Symfony 3 avec PHP 7.1.0fpm , Mysql 8, Nginx 1.11 sous Docker »

  1. Bonjour,

    C’est exactement ce que je cherchais, super stack. Je l’ai donc montée mais à l’instar d’autres stacks docker testé avant, jai cette erreur :
    – sur le navigateur :
    « File not found. »

    – dans les logs de nginx :
    « FastCGI sent in stderr: « Primary script unknown » while reading response header from upstream, client: 172.18.0.1, server: dso.test, request: « GET / HTTP/1.1 », upstream: « fastcgi://172.18.0.3:9000 », host: « dso.test:81″ »

    Je n’arrive pas à comprendre d’ou vient le probleme. Une idée ?
    Merci d’avance 🙂

Répondre à Stéphane Méaudre Annuler la réponse.

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *