LES DOCKERS
Je vous propose aujourd'hui de vous pencher sur une technologie qui gagne beaucoup en ce moment : Docker.
Docker est une application qui va vous
permettre d'empaqueter des applications et ses dépendances dans un conteneur,
que l'on pourra ensuite lancer sur n'importe quel serveur Linux.
Conteneurs
Pour comprendre l'engouement autour de docker il faut
comprendre la base de cette technologie : les conteneurs.
Le problème à l'heure actuelle c'est que nos
applications ont besoin de plus en plus de dépendances et en plus de ça elles
ont besoin de fonctionner sur un large éventail de machines. La solution
actuelle pour nous simplifier la tâche est alors d'utiliser des machines
virtuelles.
Chaque machine virtuelle va inclure notre application,
les librairies nécessaires et un système d'exploitation entier. Le problème de
cette architecture c'est que les VM pèsent rapidement des dizaines de Go, mais
en plus de ça elles utilisent beaucoup de ressources inutilement pour faire fonctionner
le système d'exploitation virtuel (il est important de noter que docker ne
fonctionne actuellement que sur Linux, et qu'il faut un Kernel 3.10 minimum).
Docker
Qu'est-ce que docker dans tout ça ? Docker permet de
profiter de la technologie des conteneurs en profitant d'une API simple. Les
commandes sont très simples à retenir et permettent de mettre en place un
système de conteneur en place rapidement grâce à un hub collaboratif qui permet
à tout le monde de partager des images qui pourront ensuite être utilisées
comme base pour construire ces conteneurs.
Comme précisé précédemment Docker ne fonctionne pas
sans le Kernel Linux donc si vous êtes sur Windows ou sur Mac vous pourrez
quand même vous essayer à Docker grâce à Boot2Dockerqui
fournit une petite machine virtuelle prête à l'emploi directement équipée de
Docker.
Fonctionnement
Pour commencer à créer notre premier conteneur, on
doit commencer par trouver une image qui va nous servir de base pour construire
notre conteneur. Pour cela il faut se rendre sur le Hub Docker. Pour se faire la main et découvrir docker
on va commencer par lancer un conteneur basé sur l'image Debian.
Attention,
même si cette image utilise Debian, le conteneur ne contient que les fichiers
de Debian (comprendre par là que vous n'aurez pas un système Debian qui va
tourner dans le conteneur, mais seulement accès aux librairies et aux binaires
de Debian).
Pour lancer un conteneur, il suffit de taper
docker run <IMAGE>
Si vous ne possédez pas l'image sur votre machine,
elle sera automatiquement téléchargée depuis le hub. Pour l'image Debian cette
commande va avoir pour effet de lancer bash et d'automatiquement stopper le
conteneur après coup (les conteneurs se stoppent dès qu'ils ont exécuté leur
commande). Si vous voulez voir tous les conteneurs, il faudra faire un
docker ps -a #montre tous les
conteneurs
docker ps # montre tous les
conteneurs en cours d'exécution
Si vous souhaitez interagir avec le résultat de la
commande, il faudra rajouter les drapeaux -ti
docker run -ti <IMAGE>
Dans le cas de Debian vous vous retrouverez alors
sur bash lancé depuis le conteneur. À chaque fois que
vous faites un docker run un nouveau conteneur est lancé à partir de
l'image que vous avez demandé. Donc aucune des modifications que vous avez
faites à votre conteneur ne sera persistée. Si vous souhaitez créer une
nouvelle image basée sur les modifications que vous avez faites il vous faudra
alors faire un commit pour créer l'image.
docker ps -a # on récupère l'id du
conteneur que l'on a modifié
docker diff <ID> # Permet d'obtenir une
liste des différentes modifications effectuées
docker commit <ID> <NOM DE L'IMAGE>
Vous pourrez ensuite utiliser cette image pour
construire de nouveau conteneur, la sauvegarder pour l'envoyer ailleurs avec la
commande save ou encore la publier sur le hub en utilisant la
commande push.
Un
cas concret
Alors lancer un conteneur Debian c'est bien sympa,
mais à part l'utiliser pour construire nos images cela ne représente pas un
grand intérêt. Imaginons que nous voulons installer et utiliser un conteneur
pour faire fonctionner Ghost (une plateforme de blogging open source basée sur
nodejs).
Je commence par chercher sur le hub pour voir si
quelqu'un a déjà cherché à construire une image pour cette technologie.
Un dépôt officiel semble
correspondre :
docker run --rm -p 8080:2368 --name grafikart-blog-ghost ghost
- Le drapeau --rm permet de supprimer le conteneur dès qu'il est fermé.
- Le
drapeau --name permet de donner un nom à notre conteneur pour le retrouver plus
facilement par la suite
- Le
drapeau -p permet de mapper un port local sur un port du conteneur
Si je regarde maintenant l'IP de ma machine sur le
port 80 je vois bel et bien mon installation de ghost qui fonctionne
correctement. En revanche dès que je ferme mon conteneur mes données vont
disparaître, car un nouveau run va avoir pour effet de repartir de l'image sans
conserver mes éventuelles modifications. Pour remédier à ce problème il est
possible de relier un dossier de la machine hôte à un dossier à l'intérieur du
conteneur à l'aide du drapeau -v
docker run --rm -p 8080:2368 -v /path/to/ghost/blog:/var/lib/ghost --name
grafikart-blog-ghost ghost
De cette manière les données seront stockées sur la
machine qui fait fonctionner docker et elles seront ainsi persistées à chaque
fois que l'on exécutera un nouveau run de notre image.
Conclusion
Voilà pour un rapide tour du propriétaire. Évidemment,
il est possible de pousser le système encore plus loin pour construire une
architecture encore plus poussée, mais je voulais garder cette introduction la
plus courte possible . Globalement Docker
est une technologie intéressante sur plusieurs aspects.
- Docker
propose une manière simple de travailler avec les conteneurs avec une API
qui emprunte beaucoup aux principes instaurés par git
- Les
conteneurs vont devenir une nouvelle unité qui deviendra peut-être un
nouveau standard (facilitant ainsi le déploiement d'application)
- Les images
sous forme d'oignons permettent un transfert et un déploiement rapide. On
n'est pas obligé de tout télécharger en cas d'update de l'image
sources: http://www.grafikart.fr/tutoriels/docker/docker-intro-634