Table des matières
Ouvrir table des matières
Docker : Pourquoi les développeurs doivent l’utiliser ?
Docker 🔗, voilà un mot qui revient souvent sur le web quand on est développeur et que l’on fait de la veille technologique. Il y a déjà pas mal d’articles qui expliquent ce que c’est mais rapidement pour les gens vivant dans une grotte, Docker est un système de virtualisation par conteneur visant juste à faire tourner une application ou un service.
Les conteneurs
Si la notion de conteneurs se démocratisa avec l’arrivée de Docker, il faut savoir que ce concept en réalité n’a pas été créé par Docker. Linux a en fait déjà un système de conteneurs qui s’appelle LXC (Linux Containers) sur lequel Docker s’est d’ailleurs initialement basé. Un conteneur est une boîte qui va être intégralement isolée du système d’exploitation dans laquelle on installera une application ainsi que toutes les librairies nécessaires au bon fonctionnement de celle-ci. Il sera alors facile de distribuer son application qui ne sera pas dépendante de votre système d’exploitation.
Les avantages de ce concept
Nos applications se complexifient avec le temps et nous sommes contraints d’installer de nombreuses librairies pour faire fonctionner correctement nos applications. Pour prendre un exemple simple, mon futur site Internet aura plusieurs besoins pour fonctionner : mettre un Apache en serveur Web, un redis en serveur de cache, un MySQL pour avoir une base de données, un PHP 7 avec différentes librairies en interpréteur de code.
Sans conteneur, ceci va avoir des conséquences pour les administrateurs système qui vont devoir refaire la configuration des machines (éventuellement via un infogéreur externe) et tous les développeurs vont devoir installer l’environnement (ce qui se complexifie quand les développeurs ne travaillent pas sur le même système d’exploitation).
Quel intérêt pour le développeur ?
Comme beaucoup de monde, vous avez certainement utilisé un programme tout en un du style WampServer. Là vous avez vu les limites de ce genre de solution et vous vous êtes mis à la virtualisation pour déployer votre configuration (et au passage vous approchez d’une solution similaire à un environnement de production). Vous déployez une nouvelle VM, vous installez votre OS, vous faites les mises à jour, vous installez votre serveur web, vous installez php, et vous configurez le tout pour que tout fonctionne correctement.
Résultat : c’est long, ça prend de la place et c’est chiant à faire. En plus si vous devez faire cohabiter 2 environnements (par exemple 2 versions de PHP), ça commence à être galère car soit vous allez utiliser la même machine soit en déployer une nouvelle pour ne pas exploser votre environnement
Docker résout ses problématiques et permet de remédier à ça. Comment me direz-vous ? Grâce à pas mal de petites choses qui au final vont faire beaucoup.
- La simplicité de la mise en place de votre environnement de travail. Si vous souhaitez un environnement classique du style PHP/MySQL, il vous suffit pour cela d’avoir 3 conteneurs (où des images toutes prêtes sont disponibles sur le hub de docker (https://hub.docker.com/ 🔗) pour gérer Apache, PHP et MySQL et ceux avec quelques lignes de commande tout simplement
- Le temps d’implémentation est ultra-rapide que ce soit pour la conception d’une nouvelle image que pour l’utilisation d’une existante, une fois que l’on connaît les bases de docker bien entendu.
- Le stockage est également de la partie puisque les conteneurs ne disposent pas chacune d’une copie de l’OS mais elles se basent toute sur la même. Si vous avez par exemple 3 conteneurs qui sont construits autour d’une image ubuntu 16.04 par exemple, vous n’aurez qu’une seule image d’ubuntu 16.04 physiquement et chaque conteneur reprendra l’ensemble des outils que vous aurez demandé dans votre image. D’ailleurs que ce soit une image ou un container, Docker est une sorte de « git like » dans le sens où si vous apportez une modification sur votre conteneur ou une image, seuls les changements sont sauvegardés en s’incrémentant. En clair, si vous avez une configuration saine et que vous tentez une modification mais que cela ne vous va pas, rien ne vous empêche de revenir en arrière. ça c’est la magie de Docker.
- L’expérimentation d’une nouvelle technologie. Imaginons que vous souhaitez tester la solution Ionic Framework pour faire du développement mobile. Vous souhaitez réaliser une petite application simple pour votre test et vous voulez la tester virtuellement (en l’émulant) et vous souhaitez la compiler pour la tester sur votre smartphone Android. Si vous connaissez Ionic Framework, vous savez que l’installation de Ionic nécessite d’avoir au préalable NodeJS pour commencer à développer l’application et tout le SDK Android pour l’emulation et la compilation. Seulement installer et configurer tout cela peut être fastidieux et va surtout prendre un certain temps. Avec Docker, il vous suffit par exemple de lancer ce conteneur (https://hub.docker.com/r/agileek/ionic-framework/ 🔗) et d’expérimenter Ionic Framework.
- Votre machine sera toujours propre, ça c’est un point important pour un développeur. Qui ne sait jamais retrouver avec une machine où il y a tout un tas de programme que avez utilisé à un moment et que vous n’utilisez plus mais que vous souhaitez garder au cas où ? Vous vous retrouvez avec votre espace de travail pollué . Avec Docker vos dépendances et votre espace de travail sont présents dans vos conteneurs et si demain vous ne les utilisez plus, il vous suffit de supprimer les conteneurs voulus. L’avantage avec Docker, c’est qu’il sera très facile et très aisé de les recréer par la suite.
Orchestration des conteneurs
Idéalement, on génère un container pour résoudre un service. Donc si vous souhaitez un environnement Apache, PHP et MySQL il vous faudra alors 3 conteneurs. L’avantage de séparer chaque service dans un conteneur c’est de pouvoir mieux maîtriser son environnement. En effet, si vous souhaitez changer de version de PHP vous changerez qu’un seul conteneur sans altérer le reste de votre environnement.
Chaque conteneur est logiquement indépendant, un conteneur ne voit pas les autres conteneurs mais il est possible de les faire communiquer ensemble. En fait, on peut faire communiquer que certains conteneurs entre eux si on le souhaite. Imaginons que vous avez 4 conteneurs de lancés : A, B, C et D. Un lien est créé entre A et B et un autre entre C et D. Les conteneurs A et B pourront communiquer et se voir, idem pour C et D. Mais ces 2 pairs ne pourront jamais se voir ni même communiquer ensemble, ce qui est fort intéressant lorsque que l’on veut faire de l’environnement expérimental.
Cependant lancer des conteneurs en les paramétrant et en les liant entre eux, tout cela en ligne de commande n’est pas chose aisée mais surtout répétitive. Heureusement, les gestionnaires de Docker ont pensé à ça en créant le Dockerfile basé sur le YAML 🔗. Ce fichier de Docker permet de faire tout ce qui est possible en ligne de commande. De la création de l’image à la réalisation de chaque conteneur de votre stack. Vous pouvez ainsi orchestrer votre stack depuis ce fichier : paramétrage d’un conteneur, Nommage de chaque conteneur, définition des liens entre eux.
Un exemple de stack web Apache, PHP, MySQL
Vous pouvez retrouver un exemple de stack web contenant un serveur de base de données, un apache, un php 7.0 ainsi qu’un serveur MailDev 🔗 sur mon GitHub 🔗 pour vous donner une idée du potentiel de Docker.
Je vous conseille également d’étudier ce sujet en consultant les nombreux articles sur le web si vous vous décidez de passer le cap.