Introduction▲
L'installation et la configuration de packages/logiciels sont une problématique omniprésente dans la gestion du SI. Ces processus, bien qu'existant depuis la création de l'informatique, restent une activité complexe :
- gestion des dépendances : l'installation de Tomcat nécessite une JVM ;
- gestion de versions : Tomcat 7 nécessite une JVM 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/prod…
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.
En bref, Docker n'est pas :
- une alternative à Chef, Puppet, 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é ;
- l'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…).
Différence VM / Container▲
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 d'exploitation) 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.io
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 container sous Windows). Un container est un ensemble applicatif s'exécutant au sein de l'OS maître 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 ne peut être considéré comme très sécurisé puisque partageant la stack d'exécution avec l'OS maître. 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.
Sous le capot de Docker▲
Docker est un gestionnaire/administrateur de container basé sur un principe 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 services pour facilement créer, éditer, publier, exécuter des containers.
Source : Docker.io
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…
Les Basiques:▲
a) La récupération :▲
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
b) L'exécution▲
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é:
c) La personnalisation▲
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 d'un fichier DockerFile contenant l'ensemble des actions à faire pour constituer le container. L'utilisation de Chef & Puppet peut grandement aider, car le DockerFile est assez limité en syntaxe pour gérer des configurations complexes ;
# Nginx
# VERSION 0.0.1 FROM ubuntu MAINTAINER Guillaume J. Charmes <guillaume@dotcloud.com>
# make sure the package repository is up to date
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y inotify-tools nginx apache2 openssh-server
- en se connectant via SSH ou Bash dans le container pour installer et é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.
Références▲
- http://linuxfr.org/news/gerer-les-containers-avec-docker
- http://stackoverflow.com/questions/16647069/should-i-use-vagrant-or-docker-io-for-creating-an-isolated-envinronment
Remerciements▲
Cet tutoriel a été publié avec l'aimable autorisation d'ippon.fr que nous remercions.
Nous tenons également à remercier Francis Walter pour la mise au gabarit, Mickael Baron, Zoom61 pour la relecture technique et ced pour la relecture orthographique.