L’espace de développement doit me permettre de faire :

  • de travailler à partir d’un environnement Linux avec lequel on disposera :
    • sous un serveur apache
      • avec du PHP (en plusieurs version)
    • du mysql
    • d’un serveur de mail pour le développement

I Mysql

I.1 Introduction

L’idée initiale est de pouvoir disposer d’un container contenant mysql (quelque soit la version) est de pouvoir bénéficier d’une base de données comportant des données importées.

I.2 Dockerfile

Après avoir tourner en rond (sans regarder la doc officielle 🙂 ) il se trouve qu’il n’est pas possible à partir de l’image Mysql officielle de créer des bases de données et d’importer une base de données en le spécificiant dans un fichier Dockerfile propre à soi. En revanche, il est possible :

  • de créer une base de données via les variables d’environnement dans le fichier docker-compose.yml
  • d’intégrer une ou plusieurs bases de données en plaçant les fichiers sql dans le répertoire « /docker-entrypoint-initdb.d » de l’image. A l’initialisation du container, les fichiers seront lus par ordre alphabétique.

Donc pour l’exemple il a été décidé :

  • de créer la base de données via docker-compose,
  • d’intégrer les données sql dans le répertoire spécifique.

Exemple du fichier docker file :

##################################
#  MYSQL (dernière version)
#    
#  notes :
#   si on utilise l'image fournit par Mysql : 
#    - pas de possibilité de créer une base de données et/ou d'importer des données dans une base de données
#        --> il faut passer par les variables d'environements du docker-compose
#        --> placer les fichiers sql dans /docker-entrypoint-initdb.d
#             --> à l'initialisation tous fichiers sera pris et executé dans l'ordre alphabétique

# A partir de quelle source
FROM mysql

# qui maintien ?
MAINTAINER union31xh union31xh@gmail.com

# copie export données de la base de données (le fichier sql ne crée par la database)
ADD ./export.sql /tmp

# création fichier .my.cnf pour éviter de saisir le mot de passe en interactif 
ADD .my.cnf /root
RUN chmod 0600 /root/.my.cnf

# place les fichiers sql à intégrer lors de la première initialisation de l'image
ADD ./export.sql /docker-entrypoint-initdb.d

EXPOSE 3306 33060

CMD ["mysqld"]

I.2 docker-compose

C’est donc dans cette partie que la base de données sera créée en spécifiant le nom de la base de données dans une variable d’environnement dédiée.

Pour l’image, il est fait référence au docker-file personnalisé. Pour le port d’accéder à MySQL, il est déclaré mais ce n’est pas la peine en soit … (A enlever à terme).

Pour le reste rien de particulier :

version: '3.7'
services:


        #######################################################
        # mysql

        mysql :
                build :
                        context : ./dockerfiles/mysql
                        dockerfile : Dockerfile
                container_name : mysql
                networks :
                        - reseau1
                environment:
                        - MYSQL_ROOT_PASSWORD=example
                        - MYSQL_DATABASE=open_food
                ports:
                        - "3307:3306"


networks:
        reseau1 :
                external : true


II Php-Apache

II.1 Introduction

Après avoir lu la doc d’Apache sur le site dockerhub il a été décidé dans un premier temps de partir d’une image contenant Apache et PHP.

Le process apache sera lancé et l’image contiendra la version de php 8.

II.2 Dockerfile

Un dockerfile a été fait pour :

  • mettre une clef privée et un certificat auto-signé ;
  • placer 2 fichiers conf d’Apache (port 80 et 443) ;
  • l’activation du module ssl dans Apache;
  • l’installation du module msqli.
##################################
#  Image dev pour php 8.0.3

# A partir de quelle source
FROM php:8.0.3-apache


# qui maintien ?
MAINTAINER union31xh union31xh@gmail.com

# copie la clef privee et le certificat
COPY ./server.crt /etc/ssl/certs/
COPY ./server.key /etc/ssl/private/

# copie le 000-default.conf : attention redirige le port 80 vers le port 4443 (A mapper avec le docker-compose.yml) 
COPY ./000-default.conf /etc/apache2/sites-available/000-default.conf
# copie default-ssl.conf 
COPY ./default-ssl.conf /etc/apache2/sites-available/default-ssl.conf

# active la conf ssl
RUN ln -s /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-enabled/default-ssl.conf

# active le module SSL dans Apache
RUN a2enmod ssl

# install divers outils pour travailler dans le container si besoin 
RUN apt update
RUN apt install -y vim
RUN apt install -y tree

# ajoute extension mysqli qui n'est pas présente par defaut
RUN docker-php-ext-install mysqli

# lance apache
CMD ["apache2-foreground"]

# Expose les ports du serveur Apache
EXPOSE 80
EXPOSE 443

III.3 docker-compose.yml

Mappage du répertoire www sur le disque dur local qui contient les sites php

Sinon rien de particulier :

        #####################################################
        #  apache/php 8 pour debug avant migration site prod
        apache_php8:
                #                image : union31xh/php_8_0_3_apache
                build :
                        context : ./dockerfiles/php.8.0.3.apache/
                        dockerfile : Dockerfile
                container_name : apache_php_8.0.3
                ports :
                        - "8080:80"
                        - "4443:443"
                volumes:
                        - /media/donnees/Dev/apache/www:/var/www/html
                environment:
                        - APP_ENV=development
                        - APP_DEBUG=true
                networks :
                        - reseau1

III.4 Pour aller plus loin

Il faut séparer la liaison apache et php via 2 containers distincts. Ainsi, pour une même version d’apache il sera possible d’avoir plusieurs version de PHP et ce sera plus rapide pour swicther avec les containers …

A étudier également l’idée, suivant le port d’attaque, d’avoir une exécution avec une version de PHP bien précise. Ce qui pour les tests seraient vraiment pas mal pour les changements de portage…

Docker : Mon espace de dev

Laisser un commentaire

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