Objectif

  • Docker-compose permet de diffuser rapidement et simplement une infrastructure de développement.
  • Dans notre exemple, le projet doit comporter :
    • Une base de données
    • Un logiciel capable d'administrer cette base de données
    • Un serveur web apache2, avec PHP version 7.4 et Composer
    • Un serveur de courrier
  • Le dossier contenant le projet doit contenir l'ensemble du code que vous développez, ainsi que l'ensemble des fichiers utilisés pour créer l'architecture de travail. Je vous propose d'utiliser l'arborescence de fichiers suivante :
    • Un dossier _BUILD qui contient les définitions des containers qu'il faut personnaliser.
    • Un dossier _VOLUMES qui contient les configurations des différents serveurs, ainsi que votre code de développement
    • A la racine du dossier , on trouve vos scripts de gestion de l'infrastructure ainsi que le fichier "docker-compose.yml"
  • Le dossier contenant le projet peut être facilement sauvegardé (avec GIT ou TAR)

Téléchargement et utilisation du projet "php74_vierge_dev"

  • Installez docker sur votre machine : apt install docker docker.io docker-compose
  • Le projet est disponible ici : Php74_vierge_dev.tgz
  • Placez vous dans le dossier du projet.
  • Je conseille de lancer une première fois le projet en mode "frontal" pour vérifier que tout fonctionne correctement : docker-compose up
  • CTRL+C pour quitter le mode "frontal".

Les images du docker hub

  • Les conteneurs mariadb:10.7 , adminer:4.6 , maildev/maildev:1.1.1 sont utilisés sans aucune modification.
  • Le conteneur php:7.4-apache ne contient pas "composer" et nécessite l'ajout de composants PHP, il faut donc construire une image personnalisée.
  • ATTENTION : Utilisez les versions précise que je propose, car il existe de nombres incompatibilités.

Le fichier Dockerfile

  • Ce fichier permet de construire votre image personnalisée (apache+php+composer)
FROM php:7.4-apache

RUN echo "ServerName localhost" >> /etc/apache2/apache2.conf
RUN apt-get update
RUN apt-get install -y --no-install-recommends locales apt-utils git libicu-dev g++ libpng-dev libxml2-dev libzip-dev libonig-dev libxslt-dev
RUN echo "en_US.UTF-8 UTF-8" > /etc/locale.gen
RUN echo "fr_FR.UTF-8 UTF-8" >> /etc/locale.gen
RUN locale-gen
RUN curl -sSk https://getcomposer.org/installer | php -- --disable-tls
RUN mv composer.phar /usr/local/bin/composer
RUN docker-php-ext-configure intl
RUN docker-php-ext-install pdo pdo_mysql gd opcache intl zip calendar dom mbstring xsl

WORKDIR /var/www/
  • FROM : indique l'image source qu'il faut utiliser sur le docker-hub
  • RUN : commandes qui seront lancées une seule fois lors de la création de votre image personnalisée.
    • "locale-gen" est nécessaire pour que la compilation des modules "docker-php-ext-install" se termine sans problèmes.
  • WORKDIR : indique le dossier par défaut

Le fichier docker-compose.yml

version: '3'

services:
  mariadb:
    image: mariadb:10.7
    container_name: mariadb
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=btsinfo
    volumes:
      - ./_VOLUMES/mariadb/db:/var/lib/mysql
    ports:
      - "3306"
    networks:
      - dev

  apache2:
    build: ./_BUILD/apache2_php74_composer_img
    container_name: apache2
    restart: always
    depends_on:
      - mariadb
    ports:
      - "80:80"
    volumes:
      - ./_VOLUMES/apache2/log:/var/log/apache2
      - ./_VOLUMES/apache2/www:/var/www/html
      - ./_VOLUMES/apache2/etc:/etc/apache2/sites-enabled
    networks:
      - dev

  adminer:
    image: adminer:4.6
    container_name: adminer
    restart: always
    depends_on:
      - mariadb
    ports:
      - 8080:8080
    networks:
      - dev

  maildev:
    image: maildev/maildev:1.1.1
    container_name: maildev
    command: bin/maildev --hide-extensions STARTTLS
    ports:
      - "1080:1080"
      - "1025:1025"
    restart: always
    networks:
      - dev

networks:
  dev:

Mariadb

  • Dans "environment", on indique le mot de passe pour root
  • Dans "volumes", on donne l'emplacement des fichiers de la base de données. Cela permet la persistance.
  • Dans "ports", on donne uniquement le port d'écoute local (machine mariadb elle même). Il ne doit pas y avoir d'accès direct via la machine hôte.
    ATTENTION : Docker attribue tout de même un port aléatoire coté hôte, ceci est acceptable au niveau sécurité pour une machine de développement.

Apache2

  • Dans "volumes", on partage 3 dossiers :
    • /var/www/html qui va contenir votre développement.
    • /var/log/apache2 pour la persistance des logs.
    • /etc/apache2/sites-enabled qui contient le fichier de configuration du serveur apache.

Adminer

  • J'utilise adminer à la place de phpmyadmin, suite à des problèmes de droits.
  • Le conteneur adminer permet de configurer mariadb.
  • Dans "ports", on réalise le mappage du port local 8080, vers le port 8080 de la machine hôte.
  • Accès à mariadb :
    • Système : Mysql
    • Serveur : mariadb
    • Utilisateur : root
    • Mot de passe : btsinfo
    • Base de données :

Maildev

  • Ce conteneur permet d'avoir un serveur de courrier local :
    • port 1025 pour le SMTP
    • port 1080 pour un Webmail

Networks

  • On déclare ici le pont "dev:". Ce pont sera automatique créé, avec un DHCP associé et un résolution de nom fonctionnelle au niveau des conteneurs.
  • Les règles de NAT et de firewall (iptables) sont également activées sur la machine hôte.

Les scripts de gestion de l'infrastructure

  • lgmUp : lance tous les conteneurs en mode "service". Il y a également une modification des droits au niveau des volumes.
  • lgmDown : arrête tous les conteneurs du projet. Il n'y a pas de perte au niveau des volumes qui sont en persistance.
  • lgmClean : arrête tous les conteneurs sur la machine hôte, ceux du projets ainsi que d'autres si besoin. Un nettoyage "prune" est également réalisé afin de supprimer tout ce qui est inutilisé.