Docker Présentation - Part 1

L’installation et la configuration de package/logiciel sont une problématique omniprésente dans la gestion du SI. Ces processus, bien qu’existants 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 version – Tomcat 7 nécessite une JVM 7, la machine host peut avoir  3 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 port, de configuration de sécurité…
  • Gestion des mises à jour
  • Gestion des actions & 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 auto suffisant 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 déploiement d’application
  • Création de PAAS environnement léger et / ou privé
  • Intégration continue, déploiement continu, test automatisé : DevOps
  • Gestion de déploiement d’applications “scalable”

Avant d’aborder le coeur 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 peut 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’opération) de son choix. Grâce à cela, une machine physique sous un OS peut faire tourner plusieurs VM avec chacun 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 d’émulation de x86 sur PowerPC). Les VM sont souvent considérées comme sécurisées car il n’y a pas de communication direct entre VM et la machine host.

Source : Docker.io

Le container virtualise l’environnement d’exécution de l’OS de la machine host (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é et contraint (jails, chroot **). Le container est très performant et léger car il partage de nombreuses ressources avec l’OS host (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’a un nombre limité de commande 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 & inter-container 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 pouvoir 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 à 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 2 méthodes :

  • édition d’un fichier DockerFile contenant l’ensemble des actions à faire pour constituer le container. L’utilisation de Chef & Puppet peuvent 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

Exemple DockerFile

  • 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 en 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’image.

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