Docker

Suite à une présentation de David Gageot lors du Google Launchpad Bordeaux au Node, j’ai voulu essayé Docker. Je vais essayer de vous expliquer son fonctionnement et comment l’utiliser.

docker

Présentation et Concept

Docker est un logiciel open source tournant sous Linux, qui permet de créer rapidement des containers (dockers) embarquant des applications. On peut rapidement faire le rapprochement avec une machine virtuelle, mais c’est très différent. Là où une machine virtuelle héberge un système en entier, Docker utilise les fonctions du noyau pour lancer les processus nécessaires. Les containers restent cependant isolés.

docker_vm

Docker était basé sur des technologies LXC (LinuX Container) mais les développeurs ont décidé d’écrire leur propre librairie libcontainer qui permet de faire tourner Docker sur des noyaux plus anciens.

Les points forts de Docker sont :

  • la légèreté : contrairement aux VMs, un container docker est très léger (quelques méga-octets), ce qui le rend copiable et transportable facilement. Cela se traduit par un lancement beaucoup plus rapide (de l’ordre de quelques secondes).

  • les performances : il est possible de lancer des centaines de dockers sur une même machine, c’est l’application à l’intérieur qui consommera des données. En fait, les différentes instances dockers (containers) sont orchestrées par le Docker Engine qui est unique. Là où un OS entier est nécessaire pour chaque instance avec des VMs, Docker se concentre sur l’application.

  • la portabilité : il est facile de créer un container sur votre machine, puis de l’installer sur un serveur en Production, même si les systèmes sont complètements différents.

  • la communauté : si vous cherchez une image pour une application existante, il y a de grandes chances que quelqu’un ait eu le même besoin et ait fait le travail avant vous. Il vous suffit de vous rendre sur le Hub et de chercher l’image. Docker est un projet open-source, ce qui signifie que vous pouvez corriger des bugs ou proposer des évolutions.

Quelques termes à connaître ;  un Dockerfile est un fichier de configuration décrivant une image. Une image est comme un disque d’installation, permettant de démarrer un container avec la même configuration à chaque fois. Un container est une instance d’une image en cours d’exécution. Vous pouvez stopper et redémarrer votre container sans perdre de données. Par contre, si vous voulez modifier la configuration initiale, il faudra repartir d’une nouvelle image et donc créer un nouveau container.

Avec quelques commandes, vous pouvez créer un blog wordpress sur votre machine :

docker run --name database -e MYSQL_ROOT_PASSWORD=root -d mysql
docker run --name superblog --link database:mysql -e WORDPRESS_DB_NAME=superblog -t -d wordpress

La première ligne va créer un container Mysql, la seconde un container contenant un wordpress/apache lié au premier container. Et voilà, vous avez un super blog.

superblog_docker

Points importants

Il est important de comprendre certaines notions avant de se lancer.

  • Il n’est pas conseillé de modifier des fichiers dans un container une fois lancé. Si vous lancez un container basé sur la même image, il n’aura pas le même comportement puisque vous avez modifié des fichiers dans le premier. Trois solutions : monter un volume (pour la configuration, certains fichiers web), inclure ces fichiers dans la création de l’image ou créer un container de fichiers lié à d’autres containers qui en ont besoin. Pensez à toujours externaliser les données (dans un autre container ou sur votre machine hôte).
  • Un container conserve son état lorsqu’il est éteint puis rallumé. Par contre, si on le supprime, toute information non sauvegardée sera perdue.
  • Il est possible de limiter la consommation en mémoire et en CPU de chaque container via les commandes -m et -c.
  • Docker, bien qu’étant une technologie créée il y a deux ans, est encore jeune et ne devrait pas être utilisé en Production (même si certains grands noms le font).
  • Docker est aujourd’hui compatible uniquement avec Linux. Il est possible de l’essayer sous Mac ou Windows avec Boot2Docker (une VM contenant Docker…).

Commandes

Voici les commandes à connaître :

docker search

permet de rechercher une image sur le Hub de Docker.

docker pull

permet si besoin de télécharger une image avant de lancer un container. Ceci n’est pas nécessaire car Docker va télécharger l’image lors du lancement.

docker run image

permet de lancer un container avec plusieurs options. Les principales à connaître sont :
–name <nom> : pour donner un nom au container
-t : pour créer un terminal accessible dans le container
–link <container>:<alias> : pour lier plusieurs containers
-e : pour passer des paramètres d’environnement
-d : pour lancer le container en fond

docker ps

permet de liste tous les containers avec des informations comme les ports, les volumes ou images utilisés.

docker start/stop

permet de démarrer ou d’arrêter un container préalablement créé.

docker rm

permet de supprimer un container.

docker stats

(depuis la version 1.5) permet de visualiser les statistiques d’un container.

Création d’image

Imaginons que je veux créer un docker contenant la dernière version de Piwik exposé par Apache. Il existe sûrement des personnes qui ont déjà eu ce besoin, allons faire un tour sur le Hub. Jetons un coup d’oeil aux 4 premières images :

docker_piwik_hub

La première image semble la plus téléchargée. Mais le créateur a décidé de fixer la version de piwik par une variable. Cela se comprend mais nous voulons toujours la dernière version. La deuxième et 4ème image tournent sous nginx. La 3ème image n’est pas assez documentée. Et pourquoi pas créer notre propre image ?

Le fichier principal décrivant notre image s’appelle le Dockerfile. Voici le résultat de mon travail que je vais détailler :

FROM tutum/apache-php

RUN apt-get update
RUN apt-get install -yq unzip php5-curl php5-gd php5-cli php5-geoip
RUN rm -rf /app/*
RUN curl -L -O http://builds.piwik.org/piwik.zip && \
unzip piwik.zip && \
mv piwik/* . && \
rm -rf piwik && \
rm piwik.zip && \
mkdir tmp
RUN chmod a+w /app/tmp/ && \
chmod a+w /app/config

EXPOSE 80
VOLUME /app/config
CMD ["/run.sh"]

La première ligne avec la commande FROM permet d’indiquer de quelle image nous allons partir. Inutile de créer une Ubuntu, puis d’y installer Apache. L’image apache-php de tutum est faite pour ça.

S’en suivent des commandes à exécuter dans le docker grâce à la commande RUN. Ici, nous installons des packages, téléchargeons la dernière version de Piwik puis l’installons (avec un peu de nettoyage et une gestion des droits).

La commande EXPOSE permet d’indiquer le port par défaut ouvert sur notre docker.

Si nous voulons partager la configuration de Piwik avec la machine hôte, la commande VOLUME le permet. Il ne faudra pas oublier d’utiliser

-v  :/app/config

lors du lancement du docker. Cela permet de modifier les fichiers de configuration de Piwik sans avoir à créer un nouveau container.

Enfin, nous lançons le script run.sh prévu par l’image apache-php pour démarrer Apache.

Une fois ce script de configuration écrit, que faire ? Il faut maintenant construire notre image :

docker build -t cicoub13/piwik .

Docker va télécharger l’image tutum/apache-php puis exécuter les commandes listées dans le fichier Dockerfile. Si vous listez les images disponibles (comme vu précédemment avec docker images), vous avez maintenant une image cicoub13/piwik.

Attention. Une fois l’image créée, la version de Piwik est figée. Si vous télécharger l’image que j’ai créée, Piwik est déjà à l’intérieur. Par contre, si vous télécharger mon Dockerfile et que vous construisez l’image, vous allez à nouveau télécharger la dernière version de Piwik.

Il vous reste à lancer un nouveau container avec cette image (en liant à la base MySQL créée plutôt):

docker run -t --link database:mysql -d -p 80:80 cicoub13/piwik

Et si je décidais de partager cette image avec tout le monde. Rien de plus simple. Je me connecte et je pousse mon image sur le Hub de Docker (https://registry.hub.docker.com/u/cicoub13/piwik/).

docker login
docker push cicoub13/piwik

Fig

Maintenant que vous avez compris le fonctionnement de Docker, vous allez vous lancer et créer votre serveur web basé sur cette technologie. Chaque fonctionnalité devrait être séparée dans un container différent, mais nous allons vite nous retrouver avec une dizaine d’images différentes (base de données, site 1, site 2, logs, monitoring, …). Mais comment gérer tout ce petit monde ?

C’est exactement le rôle de Fig, orchestrer un ensemble de containers avec un seul fichier de configuration. Je vais expliquer tout ça grâce à un exemple. Une fois Fig et Docker installés (http://www.fig.sh/install.html), créez un fichier fig.yml contenant ce code :

web:
  build: .
  command: php -S 0.0.0.0:8000 -t /code
  ports:
    - "80:8000"
  links:
    - database
  volumes:
    - .:/code
database:
  image: mysql
  environment:
    MYSQL_ROOT_PASSWORD: root

Ce fichier décrit deux containers. Le premier « web » est construit à partir d’un fichier Dockerfile présent dans le dossier courant. Nous pouvons décrire le processus à lancer, les liens, volumes et ports. Le second « database » est lancé à partir d’une image existante à laquelle on passe une variable d’environnement au lancement.

Une fois ce fichier écrit, la commande fig up dans le même dossier permettra de lancer tous les containers (dans l’ordre logique) ou fig up -d pour les lancer en fond. Je vous laisse découvrir la documentation sur le site de Fig.

Conclusion

C’en est terminé pour cet article. Suivant mes retours d’éxpérience, je complèterai sûrement ces informations. N’hésitez pas à tester Docker, pour voir ce qu’il peut vous apporter, que ce soit dans votre environnement de développement, ou dans l’automatisation de votre process de livraison.

Pourquoi pas découvrir Docker durant une présentation. Le 19 Mars, un Docker Meetup aura lieu au Node à Bordeaux (http://bxno.de/2015/19-mars-meetup-docker/).

Vous aimerez aussi...

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *