Docker entre en jeu pour tenter de résoudre un problème qui existe dès lors que l'on développe une application, un site web ou tout autre programme informatique à savoir : "mon programme fonctionne en local mais il ne fonctionne pas sur le serveur."

En clair, le serveur qui héberge mon site n'a pas forcément la même configuration, les mêmes versions d'apache, de nginx, mysql, .... que mon ordinateur local.

Pour pallier ce problème, les développeurs utilisent souvent les machines virtuelles qui permettent de lancer en parallèle des OS entiers sur notre machine. Ainsi en local, on peut recréer entièrement l'OS qui se trouve sur notre serveur. Faire tourner une machine virtuelle basée sur Linux, sur son mac n'est plus un problème.

Les inconvénients des machines virtuelles (VM Virtual Machine en english) sont la taille qu'ils prennent sur notre ordinateur (plusieurs Go de données) et le temps qu'ils mettent à démarrer (provisionner en langage technique).

Docker permet de s'affranchir de ces limitations. L'idée de Docker est de créer des containers, sorte de mini machines virtuelles, qui ne contiendront que des processus isolés les uns des autres. On fait donc tourner un processus de nginx (serveur web) dans un container, un processus de mysql dans un autre container et on les lie les uns aux autres. En plus d'être rapide à démarrer, plusieurs containers peuvent être démarrés en même temps et on s'imagine tous les avantages que cela va pouvoir avoir pour les différents tests que l'on va faire subir à notre code.

Envie d'installer et d'utiliser Docker ? Suivez le guide !

Docker Toolbox

Docker fonctionne directement en natif sur linux, mais pas sur un MAC (le programme est encore en beta donc ne devrait pas tarder...). Téléchargez Docker Toolbox qui va s'occuper de toute l'installation de tous les logiciels dont vous aurez besoin pour faire fonctionner Docker.

Installer Docker sur un MAC

Suivez les instructions de la page.

Lancer Docker

Lancez LaunchPad et choisissez Docker Terminal. Vous avez aussi la possibilité de lancer Kitematic qui est une version graphique de Docker mais je trouve qu'on comprend mieux le fonctionnement et qu'on a accès à toutes les fonctionnalités de docker grâce au terminal.

Une histoire de containers

Avec Docker, on va pouvoir isoler des processus dans des containers et les lier les uns aux autres. Cette technique permet d'isoler les processus et ainsi de pouvoir en lancer plusieurs en parallèle. Par exemple lancer en parallèle plusieurs containers contenant chacun un serveur apache ne sera plus un soucis. Le lancement d'un container est tellement rapide, que l'on pourra les lancer ou les stopper très rapidement (quelques secondes).

Docker-compose, l'outil ultime pour lancer et lier ses containers

Il vous faudra installer docker-compose qui est un petit outil pour gérer ses containers: docker-compose. A priori, il est déjà installé si vous avez installé Docker avec la docker-toolbox.

Concrètement, dans chaque projet web on aura un fichier docker-composer.yml qui contiendra l'ensemble des containers à lancer et leurs configurations.

Fini les requirements pour installer tel ou tel programme ! Avoir docker et docker-compose sur son ordinateur permettra d'installer et de lancer les containers qui contiendront les processus nécessaires ! Youpi ! Fini les installations chaotiques de librairies php comme mcrypt (en passant mcrypt est deprecié donc à ne plus jamais installer et utiliser!).

On aura donc uniquement une commande à lancer et les containers nécessaires à l'application, définis dans le docker-composer.yml, seront lancés:

docker-compose up

Et comme par magie, tous les containers contenant des processus comme Apache, MySql, Jenkins, etc... seront lancés. Ils seront chacun isolés dans des containers ce qui permettra de relancer ceux que l'on souhaite si besoin. Il faudra bien sur penser à définir un chemin du dossier du projet (appelé volume dans Docker) qui sera accessible pour les containers souhaités.

On se rend donc compte que la difficulté va être de bien définir des fichiers Dockerfile pour chaque processus souhaité.

Créer son Dockerfile

Les applications classiques ont déjà toutes créé des Dockerfile à partir desquels on peut se baser pour créer nos propres Dockerfile.

Ces Dockerfiles sont mis à diposition sur le Dockerhub, il vaut mieux utiliser les Dockerfiles officiels dans un premier temps et ensuite vous pourrez créer les votres à partir des officiels.

Un exemple concret avec une application CakePHP

Je vais créer une application CakePHP qui nécessitera plusieurs containers. Tout d'abord le premier container sera celui de php 7 (tant qu'à faire, utilisons la dernière version) que j'appelerai, ô grande surprise php. Les extensions intl, mbstring etc... nécessaires à CakePHP sont installées dans ce container. Vous pouvez regarder le Dockerfile pour vous donner une idée.

Ensuite notre application utilisera une base de données mariadb donc un container db séparé avec mariadb installé. Mariadb est une version libre de mysql ayant exactement les mêmes fonctionnalités que mysql. Je souhaite développer et donc tester mon code avec phpunit, je vais donc créer un autre container dbtest avec mariadb pour séparer la base de données de l'application et la base de données de test. Pour ces deux containers, pas besoin de créer un Dockerfile, j'utilise le Dockerfile officiel de mariadb présent sur Dockerhub.

Et enfin un serveur nginx et donc un container appelé nginx.

Les dockerfiles que j'utilise se trouvent sur Dockerhub et sont hebergés sur github, vous pouvez vous en inspirer pour créer les votres ou les utiliser si vous avez confiance (en contradiction avec le dernier paragraphe sur l'utilisation des Dockerfiles officiels ...).

Le dépôt cakephpfr/3.x contient les Dockerfiles pour les containers nginx et php.

Un Docker-compose.yml aux petits oignons

Maintenant pour orchestrer tous ces containers, je vais utiliser Docker-compose et un fichier docker-compose.yml que je vais mettre à la racine de mon projet CakePHP 3. Une version avec le fichier docker-compose.yml se trouve sur github

Suivez les instructions du README et normalement avec la commande docker-compose up -d vous devriez avoir lancé tous les containers configurés. Ne reste plus qu'à se rendre sur localhost (si docker installé en natif) ou sur http://MACHINE_IP:NGINX_PORT (ie. http://192.168.99.100:32779). Encore une fois, tout est détaillé dans le README.

Et voilà !