Débuter sur Docker

Docker permet de virtualiser des images dans lesquelles on peut créer plusieurs containers. Docker étant natif sous Linux, pour l'utiliser sous Windows ou Mac OS X il est nécessaire d'installer boot2docker qui est une VM tournant dans le logiciel de virtualisation VirtualBox. Cette VM est une interface Linux très... dépouillée. Dans cet article, on va créer un environnement de travail pour développeur Web avec un stack Nginx, MariaDB et MongoDB.

Installation de boot2docker

Avant de commencer, il faut VirtualBox d'installé impérativement sur votre machine https://www.virtualbox.org/wiki/Downloads.
Téléchargez et installez boot2docker http://boot2docker.io.
Sur votre invite de commande, tapez :
boot2docker start
Puis pour se connecter à distance via SSH :
boot2docker ssh

Commandes de base

Liste de commandes non exaustives

Boot2docker

Quelques commandes pour gérer la VM :

Docker

Volume partagé

Le volume partagé permet à boot2docker d'accéder à votre disque dur physique. Ainsi, il est possible de configurer un serveur Web dont la racine des fichiers pointe directement sur votre machine Windows.
Si vous lancez VirtualBox, il y a notre image "boot2docker-vm". Faites un clic droit dessus et cliquez sur "Configuration" puis allez dans l'onglet "Dossiers partagés". Par défaut, dans "dossier permanents", le chemin "c/Users" pointe vers "C:\Users". A gauche, se situe le chemin de la machine boot2docker et à droite le chemin de votre Windows.
On peut ainsi, dans Boot2docker, accéder au dossier "C:\Users" en tapant avec cd /c (ou ls / pour lister le contenu).

Nginx

Préparation de l'image

On va désormais rentrer dans le vif du sujet. Dans votre dossier "C:\Users\votre_session", ouvrez une console qui pointe sur ce dossier. Récupérez le repository https://github.com/fideloper/docker-nginx-php avec la commande :
git clone https://github.com/fideloper/docker-nginx-php.git.
Dans le dossier "www", créez un fichier "index.php" :

<?php phpinfo(); ?>

Créez aussi un nouveau dossier "css".
Retournez sur boot2docker.
Dans boot2docker, on se place dans le dossier qui contient le dockerfile.
cd /c/Users/votre_session/docker-nginx-php

Installation de l'image

docker build -t webapp .
On construit notre image nommée "webapp" et le point correspond au fichier "dockerfile" présent dans le dossier "docker-nginx-php".

Remarque : cette opération prend un certains temps car, Docker récupère l'image à distance puis l'installe sur la VM (voir les commandes présentes dans le Dockerfile).

Création du container

On instancie un nouveau container :
docker run -v /c/Users/votre_session/docker-nginx-php/www:/var/www:rw -p 80:80 --name nginx-dev -d webapp

Avec cette commande, on :

  1. Monte le volume via la commande -v pointant vers le dossier "www" présent dans le dossier "docker-nginx-php".
  2. Précise le port 80 (des 2 cotés) via la commande -p.
  3. Spécifie le nom de notre futur container avec --name.
  4. Lance le container en arrière plan via la commande -d (daemon).
  5. Indique que le container est créé à partir de l'image "webapp".

Remarque : si vous oubliez de mettre un nom à votre container, Docker en génère un aléatoirement.

Tapez docker ps, vous devriez voir votre container actif.

Et vous pouvez accéder à votre serveur Nginx avec l'URL par défaut (que renvoit boot2docker ip) : 192.168.59.103

Mais par défaut, Nginx renvoit une erreur 403 pour lister le contenu d'un dossier (http://192.168.59.103/css dans notre cas). Pour ce faire, il faut activer l'option "autoindex on". On va donc éditer le fichier de configuration de Nginx qui se trouve dans le répertoire "/etc/nginx/sites-enabled/default" de notre container "nginx-dev".

Edition

docker exec -i -t nginx-dev bash ou docker exec -it nginx-dev bash

Explications :

On peut désormais éditer notre fichier de configuration avec Vim (car l'éditeur a été installé lors de la création de l'image, cf. au Dockerfile) :
vim /etc/nginx/sites-enabled/default
Placez vous dans "location /" et ajoutez l'option ci-dessous :

    autoindex on;

Tapez sur votre touche Echap pour sortir du mode édition, puis sauvegardez et quittez en tapant la commande :wq.

Une fois sorti de l'éditeur, relancez le service Nginx :
service nginx reload

http://192.168.59.103/css est désormais accessible dans votre navigateur favori.

Par défaut, lorsqu'il y a une erreur PHP quelconque, Nginx renvoit directement une erreur 500. On va toucher à une option dans le fichier de config de PHP :
vim /etc/php5/fpm/php.ini
Modifiez la ligne display_errors = Off par display_errors = On

Astuce : tapez la commande de recherche Vim :/display_errors = Off pour gagner du temps...

Enregistrez puis relancez le service de PHP-FPM :
service php5-fpm reload

Installation de Xdebug

On veut afficher les erreurs PHP avec Xdebug. On commence par mettre à jour les dépendances :
apt-get update Puis on installe Xdebug pour PHP :
apt-get install php5-xdebug
On édite le fichier de configuration : vim /etc/php5/fpm/conf.d/20-xdebug.ini

zend_extension=/usr/lib/php5/20121212/xdebug.so
xdebug.profiler_output_dir=/tmp
xdebug.profiler_output_name=cachegrind.out.%p
xdebug.profiler_enable_trigger=1
xdebug.profiler_enable=0
xdebug.remote_enable=true
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9001
xdebug.remote_handler=dbgp
xdebug.remote_autostart=0

Ensuite on rédémarre le service propre à PHP FPM : service php5-fpm reload

Installation du driver MongoDB

Avant d'installer un serveur MongoDB dans un nouveau container, on installe son driver PHP.
apt-get install php5-mongo
On rédémarre pour la dernière fois PHP FPM :
service php5-fpm reload

Vous pouvez quittez votre container "nginx-dev" en tapant exit ou la combinaison CTRL D.

MariaDB

Installation de l'image

On récupère directement l'image à distance sur les serveurs de Docker avec l'option "pull" :
docker pull mariadb

Ou bien avec l'option "build" en pointant directement vers le bon Github :
docker build -t="dockerfile/mariadb" github.com/dockerfile/mariadb

Création du container

docker run -d --name maria-dev -e MYSQL_ROOT_PASSWORD=votre_mot_de_passe -p 3306:3306 mariadb

L'utilisateur par défaut est "root" et sans mot de passe :
mysql -h 192.168.59.103 -u root -p votre_mot_de_passe
show databases;

MongoDB

Installation de l'image

docker pull mongo

Création du container

docker run -d --name mongo-dev -p 27017:27017 mongo

La base est accessible sans authentification :
mongo 192.168.59.103
show dbs

Remarque : sur Boot2Docker, il n'est pas possible de monter un container avec un volume dont les données pointent directement sur le disque dur. La raison est expliquée sur la documentation officielle de MongoDB :
"MongoDB requires a filesystem that supports fsync() on directories. For example, HGFS and Virtual Box’s shared folders do not support this operation."
Cette option marchera uniquement avec un volume sur Linux...

Conclusion

On a désormais une configuration Nginx + MariaDB + MongoDB opérationnelle en ayant créé 3 containers distincts. Maintenant que les images sont installées, vous pouvez créer facilemment d'autres containers "clone" avec une configuration différente sur chaque par exemple... Docker permet de faire de la virtualisation de manière rapide en s'affranchissant de la barrière d'une interface graphique jugée encombrante par son poid.

Sources