Les Dockers
Présentation de Docker Partie 1 : Découvrir les concepts et explication du fonctionnement http://ippon. developpez. com/tutorielsmrtualisation/docker -presentation-part-l/ publié le 27 juin 2014 Docker est un outil open source récent, fournissant du PaaS né du mouvement DevOps (http://fr. wikipedia. org/wiki/Devops). Il répond à plusieurs problèmes du cloud computing dont le packaging et le déploiement d’applications. L’installation et la configuration de packages/logiciels sont une problématique omniprésente dans la gestion du SI.
Ces processus, bien qu’e restent une activité c gestlon des dépenda JVM gestion de versions • p or 13 Snipe to de l’informatique, mcat nécessite une _IVM 7, la machine host peut avoir trois JVM install es en v6, v7 et v8. Comment s’assurer d’utiliser la bonne ? gestion de la configuration : un Tomcat nécessite l’ouverture de ports, une configuration de sécurité.. gestion des mises à jour ; gestion des actions et commandes : lancement du service, installation de modules applicatifs…
Ces problématiques sont d’autant plus importantes qu’il est nécessaire de les dérouler de nombreuses fois en fonction de différentes cibles : multi-instance, environnements dev/recette/ rod- Docker fait partie de ces outils visant à aider à gérer ce processus. Il propose une manière pour construire un container autosuffisant et léger, qui peut être installé sur différentes cibles de manière identique. Ainsible. En revanche Docker s’intègre avec ces outils ; équivalent à une VM. Cf: différence VM / Container ; actuellement incompatible avec Windows. Cf : différence VM / Container.
En bref, Docker est habituellement utilisé pour : automatiser le packaging et le déploiement d’applications ; la création de PaaS environnement léger et / ou privé ; ‘intégration continue, déploiement continu, test automatisé : Devops , la gestion de déploiement d’applications « scalable ». Avant d’aborder le cœur de Docker, voici une petite explication sur ce qu’est un container et la différence avec les machines virtuelles (VMware, KVM… ). Une VM a pour but de proposer une couche d’abstraction au- dessus d’un système physique, telle que peuvent le proposer Virtualbox, Qemu, VMware…
Ces machines virtuelles permettent de simuler une machine physique et donc de faire tourner une application de très bas niveau, à savoir un OS (système ‘exploration) de son choix. Grâce à cela, une machine physique sous un OS peut faire tourner plusieurs VM avec chacune son propre OS et son ensemble applicatif. Cette solution est relativement performante si elle repose sur des fonctions matérielles (architecture physique compatible et si possible avec instruction AMD-V, VT-d, VT-x… , car sinon il faut opérer par émulation (perte de près de 50% des performances CPU lors de l’émulation de x86 sur PowerPC). Les VM sont souvent considérées comme sécurisées, car il n’y a pas de communication directe entre la VM et la machine hôte. Source : Docker. o Le container virtualise l’environnement d’exécution de l’OS de la machine hôte (Linux ou BSD, il n’existe pas à ce jour de contai 13 l’environnement d’exécution de IOS de la machine hôte (Linux ou BSD, il n’existe pas à ce jour de container sous Windows).
Un container est un ensemble applicatif s’exécutant au sein de l’OS maitre de manière virtuellement isolée et contrainte (jails, chroot **). Le container est très performant et léger, car il partage de nombreuses ressources avec l’OS hôte (kernel, devices. ,. ). En revanche, bien que s’exécutant de manière isolée, le container e peut être considéré comme très sécurisé puisque partageant la stack d’exécution avec l’OS maitre. Le container peut au choix démarrer un OS complet ou bien simplement des applications.
Docker a pour objectif de ne pas reproduire tout un OS dans un container mais simplement les applications/services souhaités. D’autres outils utilisant des containers tel qu’OpenStack ou Proxmox gèrent des containers pour virtualiser tout l’OS. jails, chroot : le système de jails/prisons, chroot (change root) sont des commandes système permettant de changer le contexte d’exécution pour avoir un accès limité. Ce système est couramment utilisé dans les accès SSH pour n’avoir accès qu’? un nombre limité de commandes et n’avoir accès qu’à certains répertoires.
Docker est un gestionnaire/administrateur de container basé sur un prlncipe de template de container. La gestion de template de container est un atout majeur de Docker qui propose une riche variété de containers préexistants mais également grâce à la personnalisation de containers. Docker utilise LXC qui est l’implémentation de référence de containers dans Linux : cgroup ; apparmor / selinux ; chroots ; kernel namespaces. Docker propose des servic Docker propose des services pour facilement créer, éditer, publier, exécuter des containers.
D’autres fonctions avancées pour la gestion des containers et intercontainers sont également proposées pour limiter les ressources (RAM, CPU, disques), définir des supports partagés, des interfaces partagées… Docker propose également d’héberger et partager des containers, ce qui permet de facilement les rechercher et les utiliser. Recherche en ligne de commande: ou en ligne sur https://index. docker. io/ Récupération pour utilisation : Vérification que l’image est bien disponible docker run -p :8080 bbytes/tomcat7 -rm
Les options -p pour demander de mapper et exposer le port 8080 vers un port choisi par Docker (ici 49154) ; -rm pour que le container soit supprimé après l’exécution. On vérifie sur son navigateur préféré: La création se base principalement sur d’autres containers que l’on enrichit ou modifie à sa guise. pour cela, il existe deux méthodes : édition clun fichier DockerFile contenant l’ensemble des actions à faire pour constituer le c -lisation de Chef & Puppet 3 install -y inotify tools nginx apache2 openssh-server en se connectant via SSH ou Bash dans le container pour installer t éditer les configurations.
Ce mode, bien que plus facile, ne permet pas de capitaliser sur la « recette » et ne permet donc pas facilement une édition incrémentale. Dans le prochain article, un cas d’utilisation Docker sera expliqué • comment utiliser Docker pour avoir des environnements de dev locaux par projet/client isolés et partageables. Il sera aussi évoqué des fonctions plus avancées telles que la mise en place d’un repository d’images privées et la publication d’images. http://linuxfr. org/news/gerer-les-containers-avec-docker http://stackoverflow. om/questions/1 6647069/sh ould-i-use vagrant-or-docker-io-for-creating-an-isolated-envinronment Partie 2 : Isolation d’application par Projet -presentation-part-2/ publié le 4 juillet 2014 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écessite 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 : deux projets Java pour deux clients ifférents utilisant Maven. Par défaut le repository local est dans -/. m2. Par conséquent des librairies seront communes et utillsables. Heureusement Maven propose de personnaliser le path de son repository local. Continuons un peu cet exemple : ces deux projets Java nécessitent PAGF s 3 path de son repository local. Continuons un peu cet exemple : ces deux projets Java nécessitent des instances Tomcat dédiées (version et configuration différentes). La version paquet (Windows . installer via *exe, Linux rpm I 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 tres bonne maitrise de l’administration de ses outils pour identifier l’ensemble des configurations nécessaires. Heureusement, il existe des moyens d’eviter cela : créer un profil 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 éfauts contre-productif : difficile de travailler sur deux projets en parallèle, ne résout pas tous 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 et les performances ne sont pas toujours au rendez-vous ; 6 3 très important pour le serveur et les performances ne sont pas ou bien utiliser Docker avec sa gestion de container léger. 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 ; n 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’images existantes si l’on n’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 créer une image ? partir d’un container. Une recherche sur https://index. docker. io/ . u bien en ligne de commande : Il existe deux images dont une validée par la communauté mais n’ayant aucune note d’appréciation. En regardant en détails l’image kameshsampath/liferay, son créateur fournit le fichier Dockerflle 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 Lifer openJDK 6. 3 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 : ocker pull kameshsampath/liferay 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 Personnalisation de l’image A 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 donnees mbarquée 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 une 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. Pour personnaliser cette image, un fichier DockerFile doit être cree • FROM kameshsampath/lifera PAGF 13 DockerFile doit être créé FROM kameshsampath/liferay:6. . O-ce-ga1 MAINTAINER Michael Pagès, mpages@ippon. fr # mise à jour de la distribution (pour la secu & fixes) RIJN apt-get update RIJN apt-get upgrade -y # installation de mysql RIJN apt-get -y install mysql-server # Ajout du service mysql au démarrage du container RIJN echo « [program:mysqldl » >> /etc/supervisor/conf. / supervisor. conf RIJN echo « command=/usr/sbin/mysqld » >> /etc/supervisor/ conf. d/supervisor. conf RIJN echo (program_name)s_out. log » /etc/supervisor/conf. d/ (program_name)s_err. log » /etc/supervisor/conf. / RIJN echo « autorestart=true » /etc/supewisor/conf. d/ RIJN cd /opt; wget http://freefr. dl. sourceforge. net/project/lportal /LiferaY%201DE/2. o. 1 %20GA2/liferay-ide-eclipse-Iinux-x64-2. o. 1 -ga2-201401270944. tar. gz -O liferaylde. tar. gz RIJN cd /opt; tar -zxvf liferaylde. tar. gz # Expose the ports: 22 pour ssh & 8080 liferay EXPOSE 22 8080 # Start the supervisord – d aut pour l’image liferay t par conséquent à transférer. Une commande permet de visualiser les dépendances interimages et les différentes étapes . ocker images —viz I dot -Tpng -o docker. png Dans cette représentation, on constate trois images constituées ? partir de l’image Liferay initiale. Lancement du container . docker run -P —name demoLF -i -t ippon/demoLF -P : pour mapper sur un port aléatoire les ports exposés (voir DockerFile clause Expose 22, 8080) du container ; 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 sont disponibles. Cf. http://dacs. docker. io/en/latest/reference/run/ La commande docker ps permet de lister les containers actifs et les ports d’écoute associés. Lancement d’Eclipse: ssh root@localhost -p 491 55 -XY /opt/eclipse/eclipse Liferay est accessible à l’URL suivante : http://localhost:$1 56. L’image étant opérationnelle et validée, suppression de ce container temporaire : docker rm demoLF Création d’un container pour chaque projet : docker run -d -p 10022:22 -p 18080:8080 ippon/demoLF docker run -d -p 10122:22- 19080:8080 —name projetl —name projet2