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
- sous un serveur apache
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…