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 à Boot2Docker qui 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.
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> bash
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 2368 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 ( nous verrons dans un prochain tutoriel comment mettre en place une stack LAMP ou LEMP en utilisant des conteneurs). 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