Dockerisation d’un serveur LAMP

Afin de rendre pérenne un vieux site en PHP qui ne supportait plus de mise à jour, j’ai du dockerisé ce dernier dans un serveur LAMP afin de pouvoir continuer à mettre à jour ma debian sans me soucier des EOL et ainsi de profiter des dernières mises à jour de sécurité et fonctionnalité au niveau de l’OS hôte.

Prérequis

Pour utiliser Docker, un Kernel Linux > 3.10 est nécessaire. Je suis parti d’une Debian Jessie 8.0 pour réaliser le container.

Installation de Docker

L’installation se fait assez simplement. On installe d’abord des paquets nécessaire à Docker, la clef GPG de Docker, les repo Debian, Docker et des outils tierces comme Docker-compose

Puis, on vérifie la bonne installation de Docker. Ce dernier va télécharger le container de test et l’executer.

La commande docker version retourne la version

Modification du driver de stockage

Par défaut, le driver de stockage utilisé par Docker est le “devicemapper (loop)”

Ce driver n’est pas recommandé par Docker pour un environnement de “production”

Docker hosts running the devicemapper storage driver default to a configuration mode known as loop-lvm. This mode uses sparse files to build the thin pool used by image and container snapshots. The mode is designed to work out-of-the-box with no additional configuration. However, production deployments should not run under loop-lvm mode.

J’ai préféré utiliser le driver “overlay”, disponible sur les kernels Linux >= 3.18 car ma VM est assez légère côté ressource.

Pour cela, c’est assez simple. On vérifie que le module est bien chargé au niveau du noyau, sinon, il faut l’installer. Par chance, ce module est déjà présent sur ma distrib.

Ensuite, il suffit de configurer le fichier /etc/docker/daemon.json (ou le créer si besoin) avec les lignes suivantes :

Puis, on redémarre le service

Fin de la partie configuration pour Docker !

Vue d’ensemble et structure

Pour des raisons bien précises, le serveur de la base de données est séparé du serveur Web. Il y a donc à minima 2 containers, l’idée étant de pouvoir rajouter des images du container Web pour faire du failover ou d’autres containers Web avec des versions plus récentes d’Apache et/ou PHP.

Le serveur Web

Pour la création du container, je suis parti d’une image officielle de Debian/wheezy. A partir de ce container, il faut rajouter les paquets souhaités, faire un downgrade de PHP et rajouter un peu de configuration pour obtenir un serveur Web Apache 2.2-PHP5.3

Le contenu du fichier WebDockerfile est le suivant :

Les fichiers apache2.conf, envvars, default.conf et ports.conf sont les fichiers de configuration utilisés par Apache. Ils sont intégrés dans le container Web et proviennent de la configuration déjà réalisée.

Le fichier preferences indique la version à installer pour PHP

Fichier de test n°1

Au niveau du fichier Dockerfile, le fichier www/info.php pour tester le bon fonctionnement de notre serveur Web. Le fichier n’est pas intégré au container mais disponible sur un répertoire partagé entre l’instance de notre container et la Debian.

Le fichier docker-compose.yml

Ce fichier est le fichier décrivant comment les différents containers sont lancés et communiquent entre eux. 

On crée le container décrit dans le fichier Dockerfile puis on lance son exécution en mappant le port 80 de l’instance sur le port 80 de la Debian et le répertoire /var/www de l’instance sur le répertoire /var/www de la Debian.

Puis, on se connecte en local sur le port 80 (http://localhost/info.php) pour vérifier que tout fonctionne correctement et afficher le PHP info.

Le serveur de base de données

Un des gros avantages de docker est la mise à disposition de nombreuses images prêtes à l’emploi. Il suffit donc de récupérer la version MySQL souhaité directement et de la lancer avec les bons paramètres. Il suffit donc de mettre le fichier docker-compose.yml à jour pour rajouter ce serveur de base de données et le faire communiquer avec le serveur Web.

Fichier de test n°2

Toujours au niveau du fichier Dockerfile, le fichier www/mysql.php pour vérifier la connexion entre le serveur Web et le serveur de base de données.

Il suffit ensuite de lancer de nouveau la commande suivante et de se connecter sur http://localhost/mysql.php pour vérifier la connexion MySQL:

PhpMyAdmin

Histoire de pouvoir administrer les bases de données et créer des utilisateurs, PhpMyAdmin est installé via un autre container, prêt à l’emploi. Une nouvelle section est rajouté au fichier docker-compose.yml. Le mot de passe MYSQL_ROOT_PASSWORD doit être identique dans les 2 sections. 

De nouveau, on exécute la commande ci-dessous et on se connecte sur http://localhost:81