Les pages Docker Hub pour MySQL et PHP contiennent quelques exemples, mais je vais élaborer un peu pour vous donner une piste pour démarrer.
#MySQL
L’image MySQL est en soi très bien et vous ne devriez pas avoir besoin d’y installer de logiciel supplémentaire. Cela veut dire que vous pouvez juste lancer le container avec les bons arguments et votre MySQL sera prêt :
docker run \
--name mon-mysql \
-v /votre/PC:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=my-secret-pw \
-d \
mysql:5.7
Explications :
-
--name mon-mysql
= nomme le container. Visible lorsque qu’on fait docker ps
-
-v /votre/PC:/var/lib/mysql
= Docker gardera le répertoire /votre/PC sur votre poste en synchro avec le répertoire /var/lib/mysql du container. Cela veut dire que les données vont survivre à la destruction / recréation du container. C’est parfait pour la persistance.
-
-e MYSQL_ROOT_PASSWORD=my-secret-pw
= est utilisé par l’image MySQL pour changer le mot de pass du user root de MySQL
-
-d
= démarre le container en deamon
-
mysql:5.7
= utilise l’image mysql, version 5.7
- De plus, l’image mysql expose déjà le port 3306, aucune action supplémentaire requise.
Une fois cette commande docker run lancée, le code PHP devrait pouvoir s’y connecter avec quelque chose comme ceci :
new mysqli(192.168.99.100:3306, "root", "my-secret-pw");
À noter que cette ligne suppose que le code PHP est à l’extérieur du host Docker. Par exemple, si vous êtes sur Windows, votre machine Docker est à l’intérieur de VirtualBox, accessible au 192.168.99.100 (par défaut) alors que votre code est pour l’instant dans votre IDE.
#Apache et PHP
Reste à créer le serveur Apache+PHP. Ici vous avez deux choix :
- Créer une nouvelle image à partir de php:5.6-apache et y copier votre code.
- Prendre l’image php:5.6-apache et utiliser les volumes.
Nouvelle image
Dans le cas #1, voici à quoi ça ressemble :
mon-php/Dockerfile:
FROM php:5.6-apache
COPY dist/ /var/www/html/php/
COPY mon-php.ini /usr/local/etc/php/php.ini
Explications :
-
dist/
est un répertoire quelconque qui contient le code PHP. L’image php:5.6-apache va charger tout ce qui est dans /var/www/html/php/, donc c’est là qu’on copie notre code
-
COPY config/php.ini /usr/local/etc/php/
= est un exemple d’utilisation d’un fichier php.ini personnalisé.
Par contre, avant de créer l’image PHP, il faut ajuster la ligne de connection que j’ai donné ci-dessus. À partir de votre poste, l’IP 192.168.99.100 était fonctionnelle, mais une fois à l’intérieur du container ça ne fonctionnera plus. À la place, on va donner le nom du container MySQL (les containers peuvent communiquer les uns aux autres par leur noms) :
new mysqli(mon-mysql:3306, "root", "my-secret-pw");
Suite à cela, vous pouvez faire le build et run docker :
docker build -t mon-image-php .
docker run --name mon-php -d mon-image-php
Rendu ici, vous devriez avoir un container Apache et PHP qui écoute sur le port 80 et qui communique avec le container MySQL.
Par contre, le désavantage de cette technique est qu’il faut rebâtir et redémarrer l’instance à chaque changement de code. C’est OK lorsqu’on distribue l’image vers un environnement distant (il faut bien que l’image contienne le code), par contre c’est un peu chiant quand on est activement en train de développer le code. Pour cela, il y a une autre façon de faire :
Image de base et volumes
docker run \
--name mon-php-lcx \
-v dist:/var/www/html/php/
-v mon-php.ini:/usr/local/etc/php/php.ini
-d \
php:5.6-apache
De cette façon, les changements de code que vous apporterez sur votre poste (dans le répertoire dist) seront visibles par le container qui aura une version à jour du code. Plus besoin de rebâtir et redémarrer le container.
Cette façon de faire requière, elle aussi, que la connection vers MySQL soit ajustée :
new mysqli(mon-mysql:3306, "root", "my-secret-pw");
Voilà!
Alexandre