Contexte

Il est courant d'avoir un PC/Mac ddi par dveloppeur, ce dveloppeur intervenant sur de nombreux projets, permettant d'avoir un environnement de travail productif et personnalis. Cependant chaque projet a ses exigences techniques et ncessite des outils diffrents. Comment viter les interactions entre les outils de diffrents projets et s'assurer qu'il n'y ait pas d'effet de bord ?

Prenons un exemple: 2 projets Java pour 2 clients diffrents utilisant Maven. Par dfaut le repository local est dans ~/.m2. Par consquent des librairies seront communes et utilisables. Heureusement Maven propose de personnaliser le path de son repository local. Continuons un peu cet exemple : ces 2 projets Java ncessitent des instances Tomcat ddies (version et configuration diffrentes). La version paquet (Windows : installer via .exe, Linux rpm | deb) n'est pas adapte, il faut utiliser la version zippe. Il faut configurer les paths (catalina_home, jvm..), configurer les ports pour ne pas tre en conflit…

On constate bien via cet exemple qu'il est ncessaire de faire de nombreuses actions afin de prserver ses outils suffisamment hermtiques. De plus il est ncessaire d'avoir une trs bonne matrise de l'administration de ses outils pour identifier l'ensemble des configurations ncessaires.

Heureusement, il existe des moyens d'viter cela :

  • crer un profil utilisateur ddi : cela permet d'avoir un path utilisateur ddi. De plus, les outils peuvent fonctionner en mode “utilisateur”. Cependant, cette option comporte de nombreux dfauts :
    • contre-productif : difficile de travailler sur 2 projets en parallle,
    • ne rsout pas tous les problmes : les ports peuvent tre en conflit,
    • tous les outils ne fonctionnent pas en mode par utilisateur,
    • environnement difficilement partageable;
  • crer une VM par projet : cette solution permet de grer cette problmatique mais apporte de nouveaux problmes :
    • performance : une VM est moins performante qu'un systme natif et ncessite plus de RAM,
    • volumtrie : une VM reprsente souvent plusieurs Go de donnes,
    • productivit : le temps de dmarrage d'une VM peut tre long,
    • si l'on passe par un serveur ddi de VM : le cot est trs important pour le serveur et les performances ne sont pas toujours au rendez-vous;
  • ou bien utiliser Docker avec sa gestion de container lger.

Installation

L'objectif est d'installer plusieurs environnements Liferay.

Pr-requis:

  • Linux relativement rcent (Fedora >= 19, Ubuntu >= 12.04);
  • avoir les droits d'administration sur le Linux (root ou bien sudo);
  • installer Docker : Cf. https://www.docker.io/gettingstarted/.

Pour Liferay, il est ncessaire d'installer :

  • une JVM;
  • un serveur de servlet ou serveur d'application JEE;
  • une base de donnes;
  • un IDE : l'objectif tant de mettre au point un poste de dveloppement.

Docker propose de nombreux containers. Il est prfrable de partir d'images existantes si l'on est pas soumis de fortes contraintes de version.

Pour rappel, Docker propose d'instancier des containers partir d'images (un container fig) et de pouvoir crer une image partir d'un container.

Une recherche sur https://index.docker.io/ :

Image non disponible

ou bien en ligne de commande :

Image non disponible

Il existe 2 images dont une valide par la communaut mais n'ayant aucune note d'apprciation.

En regardant en dtails l'image kameshsampath/liferay, son crateur fournit le fichier Dockerfile qui a permis de la construire : https://index.docker.io/u/kameshsampath/liferay/

Image non disponible

Pour raliser ce container, l'auteur s'est bas sur une autre image (kameshsampath/openjdk-jre-6) qui elle-mme est base sur une image de base Ubuntu.

La suite du fichier permet de connatre la version du JDK install ainsi que la version de Liferay.

  • OpenJDK 6.
  • Liferay 6.2.0 Community Edition.

Cette image constitue une bonne base de travail, vitant ainsi d'installer le JDK et Liferay.

Rcupration en local de cette image :

 
Sélectionnez
docker pull kameshsampath/liferay

Cette tape peut tre assez longue lors de la toute premire excution, car Docker rcupre l'ensemble des images (snapshot) ncessaires la constitution de l'image.

Pour rappel, une image n'est pas une archive contenant tout, mais un ensemble d'images qui, par superposition, constitue la cible. Le filesystem Aufs est utilis pour crer cette superposition d'images.

Image non disponible

Source : Docker.io

Personnalisation de l'image

L'image tlcharge constitue une bonne base, mais il manque un serveur de base de donnes MySQL (Liferay propose par dfaut d'utiliser en mode dev Hsqldb qui est une base de donnes embarque lgre mais n'offrant pas la richesse de MySQL) et Eclipse afin de pouvoir dvelopper des modules Liferay.

Pour profiter pleinement du dploiement rapide des porlets, l'IDE Eclipse a besoin d'accder au fichier de l'instance cible Liferay. Par consquent, Eclipse est install au sein du container. Bien que cela ne soit pas une bonne pratique, dans le cas prsent, cela simplifie l'intgration avec Liferay.

D'autre part, il est tout fait envisageable de mettre un serveur de base de donnes dans un container autonome, ce qui peut tre avantageux si l'on souhaite la mutualiser avec d'autres outils. Dans le cas prsent, l'objectif est d'avoir un container all-in-one. C'est pourquoi MySQL est galement dans le container.

Cration d'images personnalises

Pour personnaliser cette image, un fichier DockerFile doit tre cr :

 
Sélectionnez
FROM kameshsampath/liferay:6.2.0-ce-ga1

MAINTAINER Michael Pags, mpages@ippon.fr

# mise  jour de la distribution (pour la secu & fixes)
RUN apt-get update
RUN apt-get upgrade -y

# installation de mysql 
RUN apt-get -y install mysql-server

# Ajout du service mysql au dmarrage du container
RUN echo "[program:mysqld]"  >> /etc/supervisor/conf.d/supervisor.conf
RUN echo "command=/usr/sbin/mysqld" >> /etc/supervisor/conf.d/supervisor.conf
RUN echo "stdout_logfile=/var/log/supervisor/%(program_name)s_out.log" >> /etc/supervisor/conf.d/supervisor.conf
RUN echo "stderr_logfile=/var/log/supervisor/%(program_name)s_err.log" >> /etc/supervisor/conf.d/supervisor.conf
RUN echo "autorestart=true" >> /etc/supervisor/conf.d/supervisor.conf

RUN cd /opt; wget http://freefr.dl.sourceforge.net/project/lportal/Liferay%20IDE/2.0.1%20GA2/liferay-ide-eclipse-linux-x64-2.0.1-ga2-201401270944.tar.gz -O liferayIde.tar.gz 
RUN cd /opt; tar -zxvf liferayIde.tar.gz 

# Expose the ports: 22 pour ssh & 8080 liferay
EXPOSE 22 8080

# Start the supervisord - demon par defaut pour l'image liferay
CMD ["/usr/bin/supervisord"]

Cration de l'image

Les noms doivent tre en minuscules pour pouvoir tre commits sur le registry !

 
Sélectionnez
docker build -t ippon/demoLF .
Image non disponible

Comme illustr, la cration de cette image se base sur des caches, car une image similaire a dj t effectue avant.

Docker profite de nombreux mcanismes de capture diffrentielle pour optimiser les performances et limiter la quantit de donnes stocker et par consquent transfrer.

Une commande permet de visualiser les dpendances inter-images et les diffrentes tapes :

 
Sélectionnez
docker images --viz  | dot -Tpng -o docker.png
Image non disponible

Dans cette reprsentation, on constate 3 images constitues partir de l'image Liferay initiale.

Test et validation images demoLF

Lancement du container :

 
Sélectionnez
docker run -P --name demoLF -i -t ippon/demoLF
  • -P : pour mapper sur un port alatoire les ports exposs (voir DockerFile clause Expose 22, 8080) du container;
  • -i : pour diriger la sortie standard vers la console et visualiser en direct les traces;
  • -t : cible l'image utiliser;
  • -name : pour nommer le container.

De nombreuses autres options de lancement son disponible. Cf. : http://docs.docker.io/en/latest/reference/run/

La commande docker ps permet de lister les containers actifs et les ports d'coute associs.

Image non disponible

Lancement d'Eclipse:

 
Sélectionnez
ssh root@localhost -p 49155 -XY  /opt/eclipse/eclipse

Liferay est accessible l'URL suivante : http://localhost:49156.

L'image tant oprationnelle et valide, suppression de ce container temporaire:

 
Sélectionnez
docker rm demoLF

Excution container par projet

Cration d'un container pour chaque projet :

 
Sélectionnez
docker run -d -p 10022:22 -p 18080:8080 --name projet1 -i -t ippon/demoLF
docker run -d -p 10122:22 -p 19080:8080 --name projet2 -i -t ippon/demoLF

Index, Registry & Partage

L'index est l'outil propritaire de Docker permettant de rechercher, naviguer, administrer le registry accessible l'URL https://index.docker.io/.

Le registry quant lui est ouvert et accessible, permettant de stocker et partager les images : https://github.com/dotcloud/docker-registry.

Docker propose d'hberger des images publiques via leur registry, il est galement possible de crer son registry priv.

Dans notre cas, il est prfrable de mettre en place un registry d'entreprise et d'y stocker les images projet.

Pour installer un registry, rien de plus simple grce Docker:

Installation du registry et lancement du registry

 
Sélectionnez
docker pull registry; docker run -d -i --name registyDocker -p 5000:5000 -m 512m registry
  • -d : pour le lancer en mode dmon;
  • -i : redirection de la sortie standard. Bien que docker soit lanc en mode dmon, les traces sont consultables directement via la commande : docker logs registyDocker;
  • -name : pour nommer le container;
  • -p : pour mapper le port 5000 sur le port 5000;
  • -m : pour limiter la RAM alloue ce container 512 Mo.

Transfert de l'image dans le registy

Docker dtermine la destination de l'image (registry public ou priv) en fonction de la 1re partie de son nom.

XXX/image

Si XXX est une simple chane de caractres, c'est donc le registry public qui sera utilis.

Si XXX ressemble un hostname[:port] alors ce sera l'URL du registry cible.

Avant de commiter, il faut renommer notre image (les noms doivent tre en minuscules pour tre commits !):

Image non disponible
 
Sélectionnez
docker tag ba6e34242e1d localhost:5000/demolf

La commande tag permet de renommer l'image ou bien de changer le tag ( “latest” dans le cas prsent). Dans un contexte projet, il sera intressant de changer le tag pour reflter la version de l'environnement lors des diffrentes phases de release. Grce cela, un environnement de test peut tre aisment stabilis et remis 0.

Image non disponible

Naturellement, Docker n'a pas supprim le tag ippon/demoLF ce qui permet d'avoir une mme image rfrence via diffrents noms.

L'image ippon/demoLF peut tre supprime via la commande docker rmi ippon/demoLF. Cependant, cela n'effacera pas l'image relle dont l'ID est ba6e34242e1d. L'image relle ne sera supprime que si la commande est faite via son ID ou bien si toutes les images rfrenant son ID sont supprimes.

 
Sélectionnez
docker commit localhost:5000/demolf
Image non disponible
Image non disponible

L'image est accessible tous sur le registry.

Attention, le registry n'est pas index et n'a aucun lien avec le serveur public. Il est donc impossible d'excuter des commandes de recherche.

Rcupration de l'image depuis le registry :

 
Sélectionnez
docker pull localhost:5000/demolf

Fonctions avances

Docker ne se limite pas au contenu de la prsentation. De nombreuses autres fonctions existent, telles que :

  • Gestion de volume partag inter-containers :

Cration d'un container de partage :

 
Sélectionnez
docker run -v /var/volume1 -v /var/volume2 -name DATA busybox true
  • Utilisation du volume dans un autre container :
 
Sélectionnez
docker run -t -i -rm -volumes-from DATA -name client1 ubuntu bash

Plus d'informations : http://docs.docker.io/en/latest/use/working_with_volumes/.

  • Gestion des connexions rseau point--point inter-containers via les commandes link et utilisation d'ambassadeur centralisation des accs inter-containers.

Par dfaut, les containers en cours d'excution se relancent automatiquement lors du redmarrage de la machine host. Si un container est arrt (manuellement ou bien bug), il est possible de le retrouver grce la commande:

 
Sélectionnez
docker ps -a

Celle-ci liste l'ensemble des containers tous tats confondus (sauf ceux supprims).

De plus, de nombreux outils annexes existent pour faciliter son utilisation, par exemple :

Bien d'autres outils rfrencs sur :

Conclusion

Ce tutoriel a permis de crer une image ddie, la sauvegarder sur un rfrentiel, la partager et l'instancier autant de fois que ncessaire pour diffrents clients et environnements.

Docker, grce sa gestion de container simple et lgre, est un outil adapt au poste de dveloppement pour faire des sandbox permettant de tester des outils, tout comme pour la cration d'images servant des environnements de production en mode cluster.

Naturellement, Docker tant un outil bas-niveau et n'offrant pas de service clef en main avec IHM, outil de supervision, certains prfreront directement se tourner vers des services de cloud priv ou public ddi leurs usages.

Pour les plus vaillants d'entre vous qui souhaitent s'aventurer l'utiliser, Docker est un produit stable (bien que jeune). Sa lgret et sa simplicit font de lui un trs bon outil adapt pour le dev, pour la gestion de promotion d'environnement, pour le cloud…

Les cas d'utilisation ne manquent pas. Les grands noms du web eBay, Google ont d'ailleurs mis sur cet outil : http://www.docker.com/about_docker/usecases/.

Remerciements

Nous tenons remercier Francis Walter pour la mise au gabarit puis Mickael Baron pour la relecture.