Part 1 introduit les principes de Docker, part 2 est un tutoriel pour illustrer un cas concret d’utilisation de Docker.
Contexte:
Il est courant d’avoir un PC/Mac dédié par développeur, ce développeur intervenant sur de nombreux projets, permettant d’avoir un environnement de travail productif et personnalisé. Cependant chaque projet a ses exigences techniques et nécessites des outils différents. Comment éviter les interactions entre les outils de différents projets et s’assurer qu’il n’y ait pas d’effet de bord ?
Prenons un exemple: 2 projets Java pour 2 clients différent utilisant Maven. Par défaut le repository local est dans ~/.m2. Par conséquent 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 nécessitent des instances Tomcat dédiées (version et configuration différentes). La version paquet (Windows : installer via .exe, Linux rpm | deb) n’est pas adaptée, il faut utiliser la version zippée. 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 nécessaire de faire de nombreuses actions afin de préserver ses outils suffisamment hermétiques. De plus il est nécessaire d’avoir une très bonne maîtrise de l’administration de ses outils pour identifier l’ensemble des configurations nécessaires.
Heureusement, il existe des moyens d’éviter cela :
- créer un profile utilisateur dédié : cela permet d’avoir un path utilisateur dédié. De plus, les outils peuvent fonctionner en mode “utilisateur”. Cependant, cette option comporte de nombreux défauts : - contre-productif : difficile de travailler sur 2 projets en parallèle
- ne résout pas tout les problèmes : les ports peuvent être en conflit
- tous les outils ne fonctionnent pas en mode par utilisateur
- environnement difficilement partageable
- créer une VM par projet : cette solution permet de gérer cette problématique mais apporte de nouveaux problèmes : - performance : une VM est moins performante qu’un système natif et nécessite plus de RAM
- volumétrie : une VM représente souvent plusieurs Go de données
- productivité : le temps de démarrage d’une VM peut être long
- si l’on passe par un serveur dédié de VM : le coût est très important pour le serveur & les performances ne sont pas toujours au rendez-vous.
- ou bien utiliser Docker avec sa gestion de container léger.
Installation
L’objectif est d’installer plusieurs environnements Liferay.
Pré-requis:
- Linux relativement récent (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 nécessaire d’installer :
- une JVM
- un serveur de servlet ou serveur d’application JEE
- une base de données
- un IDE : l’objectif étant de mettre au point un poste de développement.
Docker propose de nombreux containers. Il est préférable de partir d’image existante si l’on est pas soumis à de fortes contraintes de version.
Pour rappel, Docker propose d’instancier des containers à partir d’image (un container figé) et de pouvoir créer une image à partir d’un container.
Une recherche sur https://index.docker.io/ :
ou bien en ligne de commande :
Il existe 2 images dont une validée par la communauté mais n’ayant aucun note d’appréciation.
En regardant en détail l’image kameshsampath/liferay
, son créateur fournit le fichier Dockerfile qui a permis de la construire : https://index.docker.io/u/kameshsampath/liferay/
Pour réaliser ce container, l’auteur s’est basé sur une autre image (kameshsampath/openjdk-jre-6
) qui elle-même est basée sur une image de base Ubuntu.
La suite du fichier permet de connaître 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.
Récupération en local de cette image :
docker pull kameshsampath/liferay
Attention cette étape peut être assez longue lors de la toute première exécution car Docker récupère l’ensemble des images (snapshot) nécessaires à 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 créer cette superposition d’images.
source : Docker.io
Personnalisation de l’image
L’image téléchargée, constitue une bonne base mais il manque un serveur de base de données MySQL (Liferay propose par défaut d’utiliser en mode dev Hsqldb qui est une base de données embarqué légère mais n’offrant pas la richesse de MySQL) et Eclipse afin de pouvoir développer des modules Liferay.
Pour profiter pleinement du déploiement rapide des porlets, l’IDE Eclipse a besoin d’accéder au fichier de l’instance cible Liferay. Par conséquent, Eclipse est installé au sein du container. Bien que cela ne soit pas bonne pratique, dans le cas présent, cela simplifie l’intégration avec Liferay.
D’autre part, il est tout à fait envisageable de mettre un serveur de base de données dans un container autonome, ce qui peut être avantageux si l’on souhaite la mutualiser avec d’autres outils. Dans le cas présent, l’objectif est d’avoir un container all-in-one. C’est pourquoi MySQL est également dans le container.
Création d’images personnalisées
Pour personnaliser cette image, un fichier DockerFile doit être créé :