Docker

La SymfonyLive a permis à Jérémy DERUSSE d'introduire Docker. Retour rapide sur cette solution Opensource.

 

Qu'est-ce que Docker ?

Docker est une solution Opensource sous licence Apache, proposée par la société américaine portant le même nom, lancée par le Français Solomon Hykes.

Docker permet d'embarquer une application dans un container virtuel qui peut être exécuté sur n'importe quel serveur. Il s'agit là de son premier but : migrer un container facilement dans le monde du cloud.

La version actuelle est la 1.6.

 

Quelle différence avec la virtualisation ?

La virtualisation permet de simuler une machine physique qui intègre elle-même un OS sur lequel ses applications sont exécutées.

Le container fait directement appel à l'OS de la machine hôte pour réaliser ses appels système :

 

Avantages

  • Plus léger car pas d'OS supplémentaire.
  • Migration rapide d'une machine physique à l'autre du fait de son faible poids : une VM classique peut peser plusieurs GO alors que le container représentera quelques MO.
  • Les grosses sociétés de cloud l'ont déjà intégré: Amazon, Microsoft Azure, Google, OVH, etc. Par conséquent, il est aisé de passer de l'un à l'autre.
  • Bootable en quelques secondes.
  • En éliminant la couche de virtualisation, Docker réduit la consommation de RAM jusqu'à 30 fois.
  • Docker Hub est un service permettant l'échange de container pré-paramétré.

 

Inconvénients

  • Docker est initialement limité à Linux (jusqu'à la version 1.6 qui introduit une préversion d'un client Docker Windows). La conséquence étant qu'un container créé sur Linux n'est pas portable sur Windows sans machine virtuelle.
  • Docker repose sur LXC. Il ne permet pas d'isoler les ressources utilisées par des containers sur une même machine.
  • Pour qu'un développeur soit ISO prod, il doit installer le même OS avec la même version. Dans le cas contraire, il doit passer par une VM. On perd alors la rapidité de Docker en ajoutant une couche supplémentaire, tout en gardant les  autres avantages.

 

Nous, développeurs

Docker nous permet aisément de partager un environnement de travail, de garder le système hôte propre, etc. En tant que développeur, une question se pose alors : quelle différence avec une VM Vagrant?

Plusieurs raisons pourraient nous pousser à cela : Docker nous permet très facilement de switcher entre des versions spécifiques d'un serveur, d'une SGBD ou encore d'une librairie.

Pour comprendre cela, il faut un peu plus détailler le fonctionnement de Docker:

  • Le Dockerfile correspond à notre fichier source : il décrit ce que nous voulons.
  • L'image Docker est créée à partir du Dockerfile : elle est statique.
  • Le container est l'exécution de l'image. Dans celui-ci, on peut interagir avec les applications installées.

On peut faire l'analogie avec Java en considérant le Dockerfile comme le fichier source, l'image comme le fichier compilé et le container comme une instance d'une classe.

La force de Docker se trouve dans le fait qu'un Dockerfile peut être inclus dans un autre Dockerfile.

Voici un exemple de fichier permettant d'instancier un container qui va exécuter Apache : 

FROM ubuntu:12.04

RUN apt-get update && apt-get install -y apache2 && apt-get clean && rm -rf /var/lib/apt/lists/*

ENV APACHE_RUN_USER www-data

ENV APACHE_RUN_GROUP www-data

ENV APACHE_LOG_DIR /var/log/apache2

EXPOSE 80 

CMD ["/usr/sbin/apache2", "-D", "FOREGROUND"]

commande

rôle

FROM

1ère instruction du Dockerfile. Il décrit sur quelle image parente va s'appuyer celle décrite par le Dockerfile.

RUN

Exécute les commandes décrites.

ENV

Set des variables d'environnements. Elles sont réutilisables par tous les Dockerfile héritant.

CMD

Il y'a une seule instruction autorisée. Se lance à l'instanciation du container.

 

Ainsi, le Dockerfile PHP est extrêmement simple : 

FROM omnilog/apache2

RUN apt-get update && apt-get install -y php5 libapache2-mod-php5 php5-mysql php5-cli

apt-get clean

rm -rf /var/lib/apt/lists/*

CMD ["/usr/sbin/apache2", "-D", "FOREGROUND"]

 

Qu'est-ce que cela nous apporte?

  • Chaque image est indépendante et il est facile de lancer des containers avec des versions d'Apache ou de PHP différentes. La sortie de PHP 7 le 12 novembre prochain peut donner quelques idées…
  • Il est facile de switcher entre un environnement de développement et un environnement de test.
  • Les tests fonctionnels peuvent s'exécuter plus rapidement : il est plus rapide de détruire un container et d'en relancer un nouveau que d'initialiser une BDD pour les tests et de la remettre à son état initial à la fin de l'exécution.
  • On peut paralléliser les tests en lançant plusieurs containers.
     

Conclusion

Cet article est loin d'être exhaustif sur la techno qu'est Docker. Il ne s'agit là que d'une mise en bouche pour ceux qui veulent s'y attarder.

En tant que développeurs, ce qui peut être intéressant est d'avoir une couche Vagrant ISO prod au niveau du système, puis une image Docker représentant tout l'écosystème de la production. De cette manière, nous garantissons que nos environnements locaux sont au plus proche de la prod si on occulte le matériel, tout en s'autorisant une certaine modularité.

 

Plus d'informations :

https://www.docker.com/

https://hub.docker.com

http://www.nextinpact.com/news/95520-docker-amazon-microsoft-et-dautres-sunissent-autour-dun-standard-pour-conteneurs.htm

http://www.journaldunet.com/solutions/cloud-computing/solomon-hykes-le-fondateur-de-docker.shtml

 

Ymshad A.

Commentaires

YvesM
Un autre article très intéressant "Why Docker is Not Yet Succeeding Widely in Production" http://sirupsen.com/production-docker/

Ajouter un commentaire

Tags: