Dockeriser une application Symfony sous Windows 10 Pro - Partie 3

PHP-FPM :

Pour en savoir plus sur PHP-FPM, lisez  https://www.viededev.com/article/apache-et-php-dans-un-bateau-1.

On crée un répertoire pour php 

 

FROM php:7.0.33-fpm-alpine
# See https://github.com/docker-library/php/blob/master/7.1/fpm/Dockerfile
ARG TIMEZONE

MAINTAINER Maxence POUTORD <maxence.poutord@gmail.com>

# Install Composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN composer --version

# Set timezone
RUN ln -snf /usr/share/zoneinfo/${TIMEZONE} /etc/localtime && echo ${TIMEZONE} > /etc/timezone
RUN printf '[PHP]\ndate.timezone = "%s"\n', ${TIMEZONE} > /usr/local/etc/php/conf.d/tzone.ini
RUN "date"

# Type docker-php-ext-install to see available extensions

RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin --filename=composer
RUN rm -rf /usr/local/etc/php-fpm.d/www.conf
COPY www.conf /usr/local/etc/php-fpm.d/
# install xdebug
RUN apk add --no-cache $PHPIZE_DEPS \
        openrc build-base bash \
        freetype-dev \
        libpng \
        libjpeg-turbo-dev \
        libtool \
        automake \
        git \
        autoconf \
        nasm \
        libpng libpng-dev libjpeg-turbo-dev libwebp-dev zlib-dev libxpm-dev gd \
    && pecl install xdebug-2.6.1 \
    && docker-php-ext-enable xdebug \
    && apk update && apk add nodejs \
    yarn

RUN docker-php-ext-install pdo pdo_mysql gd
RUN echo "error_reporting = E_ALL" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN echo "display_startup_errors = On" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN echo "display_errors = On" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN echo "xdebug.remote_enable=1" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
#RUN echo "xdebug.remote_connect_back=1" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN echo "xdebug.idekey=\"PHPSTORM\"" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN echo "xdebug.remote_port=9000" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN echo "xdebug.remote_autostart=1" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
# DockerNAT gateway IP
RUN echo "xdebug.remote.host=10.0.75.1" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN echo "xdebug.remote.mode=req" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
RUN echo "xdebug.remote.handler=dbgp" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini

STOPSIGNAL SIGQUIT
COPY schedule/crontab /tmp/crontab
ADD schedule/docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
RUN mkdir -p /var/log/cron && touch /var/log/cron/cron.log
EXPOSE 9000
CMD ["php-fpm"]

Attention : Prendre le soin de récupérer une image php-fpm

Le docker-compose donne ça  :

version : '3.7'


services:
  db:
    image: mysql:5.7
    volumes:
      - "./data/db:/var/lib/mysql"
   
environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    ports:
      - "3306:3306"
 
php:
    build:
      context: docker/php
      args:
        TIMEZONE: ${TIMEZONE}
    environment:
      - MYSQL_DATABASE
      - MYSQL_USER
      - MYSQL_PASSWORD
      - MYSQL_HOST
      - MYSQL_PORT
    volumes:
      - ./apps/:/var/www/html/
      - ./var/logs/php/:/var/log/php
  nginx:
    build: docker/nginx
    ports:
      - ${APP_PORT}:80
    volumes:
      - ./apps/:/var/www/html
      - ./var/logs/nginx/:/var/log/nginx
    depends_on:
      - php
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    ports:
      - "8080:80"
   
links:
      - db
    environment:
      - MYSQL_DATABASE
      - MYSQL_USER
      - MYSQL_PASSWORD
      - MYSQL_HOST
      - MYSQL_PORT

 

Dans ce docker-compose, nous avons défini 4 services qui correspondent à 4 conteneurs docker :

db : le conteneur de bdd basé sur l’image officielle de mysql 5.7 sans retouches.

On a plusieurs instructions déclarées dans ce service image, volumes, environnement et ports.

image : elle définit l’image à construire pour fabriquer ce conteneur

volumes : l’instruction permet de définir le mapping entre l’emplacement du répertoire physique du conteneur et l’emplacement du répertoire dans le système de fichiers du conteneur.

Si deux services sont mappés sur les mêmes volumes, on parle de « partage de volumes », par exemple si le service php et nginx partagent le même répertoire si on se connecte à l’un ou l’autre conteneur, on a accès aux mêmes fichiers.

Ici en exemple, le répertoire de données data/db sera mappé va correspondre /var/lib/mysql dans le conteneur linux ainsi créé.

environnement : celui-ci correspondra à la définition des variables d’environnement utiles au contexte d’exécution du conteneur et présentes dans le fichier.env. A noter qu’une fois définies pour un conteneur, on aura plus besoin de les redéfinir pour les autres conteneurs.

En exemple, MYSQL_DATABASE et MYSQL_USER

ports : ils correspondent aux ports d’exposition des conteneurs/ services déclarés.

Par exemple, pour le service db, le port 3306 sera aussi 3306 dans le conteneur.

Il est bon de préciser qu’au lancement, Docker créer un mini réseau local par défaut pour permettre la communication entre les différents conteneurs.

build et context : Celles-ci interviennent pour nous permettre de créer nos propres images à partir d’autres image et de les définir dans un dockerfile.

 

depends_on : Il crée une dépendance express entre plusieurs conteneurs (services), par exemple ici :

nginx va avoir besoin que le conteneur php soit démarré pour fonctionner.

 

 

Une fois que tout est bien défini dans le docker-compose.yml, il n’ya plus qu’à lancer à la racine du projet au même emplacement que le docker-compose.yml la commande :

 

Docker-compose up –build (mode interactif, on voit tous les logs dans la  ligne de commande en continu)

Ou bien la commande :

Docker-compose up -d –build (pas d’accès au mode daemon après le lancement des conteneurs)

Quelques commandes utiles :

Commandes

Explications

docker-compose down

Arrêter l’exécution des conteneurs

docker ps

Voir les conteneurs en cours d’exécution

docker exec -it extranet_php_1 bash

Accéder au conteneur php en ligne de commande bash , sinon sh pour juste le shell

docker system prune

Supprimer toutes les images télécharger, arrêter tous les conteneurs.

docker stop $(docker ps -a -q)

Stopper tous les conteneurs en cours

docker rmi $(docker images -aq)

Supprimer toutes les images de tous les conteneurs

docker inspect extranet_php_1

Afficher les informations du conteneur : espace utilisé, adresse ip, etc …

C'est ainsi que s'achève cet article en 3 parties sur Docker et Symfony sous windows 10 Pro,

Il sera intéressant de voir ce que ça donne en terme de performances, un prochain article viendra donc ajouter une brique dans ce sens.

 

 

Restez informés sur notre actualité

Inscrivez-vous à notre newsletter pour recevoir les dernières évolutions de notre produit