Principe de base de docker
Dans cet article , bien que mainte fois traité sur le net, j’aimerais que l’on revoit les principes de base de Docker. Les grands concepts fondamentaux permettant ainsi de comprendre dans les futurs articles l’intérêt mais aussi les inconvénients de cette technologie
Pourquoi on a créé Docker ?
Pour bien comprendre d’où vient Docker, on doit commencer par comprendre le besoin qui l’a fait naître. Pendant des décennies, les développeurs sont tombés sur un os plus que problématique. L’application fonctionne parfaitement en Dev mais dès qu’on la déploie en production on est confrontés à des bugs.
Je ne parle pas là de bugs dus à une mise en prod qui ne respecte pas la chaine de tests en passant par une recette et pré Prod, mais de bugs dus à des différences subtiles dans la configuration système, les versions de bibliothèques ou bien de dépendance. Un langage a essayé de régler ce problème, le Java. Malheureusement il est on va dire un peu gourmand pour rester poli.
Avant Docker,dès les années 2000, la solution technique a été de mettre en place des machines virtuelles, permettant ainsi d’isoler complétement les environnements mais en gaspillant beaucoup de ressources. En effet on devait installer un système d’exploitation complet et aussi le maintenir le plus isopérimètre possible entre chaque environnement ce qui est loin d’être évident.
Il existait pourtant au sein de Linux depuis 2008 les LXC, mais c’est vraiment en 2013 avec le travail de Solomon Hykes que la notion de conteneur explose grâce à Docker. La force de Docker, rendre accessible les LXC tout simplement.
La notion de conteneur
Un conteneur est totalement différent d’une machine virtuelle. Plutôt que de virtualiser l’ ‘ensemble d’une machine et son système d’exploitation comme le fait une VM, un conteneur va partager le noyau de l’OS hôte tout en isolant les processus de l’application. Ceci est le point fondamental pour comprendre Docker.
Avec cette approche, les effets sont immédiats :
- un conteneur se lance en quelques secondes
- consomme peu de mémoire
- lancement possible de plusieurs dizaines de conteneurs en parallèle sur une même machine
Docker : images et conteneurs
Docker répond au problème évoqué au début, comment faire tourner une application dans un environnement ISO de la DEV à la PROD. Pour cela on s’appuie sur des images Docker. Une image est un modèle immuable, une sorte de photo à l instant T contenant l’ensemble des pré-requis d une application. Le conteneur lui est une instance vivante , exécutable, créer a partir d’une image.
Un autre point important sur les images est qu elles sont comme un millefeuille en multi-couches. c’est une notion importante, car plusieurs images peuvent partager une même image initiale comme par exemple une image de noyau Linux. On a donc un gain de place évident.
Isolation des conteneurs
L’isolation se base sur deux technos rendues accessibles par Docker des LXC : les namespaces et les cgroups.
Un namespace crée une vue isolée des ressources système. Un conteneur possède donc son propre namespace, ce qui signifie qu il ne voit uniquement ses propres processus et leur attribue des identifiants commençant par 1 comme s il était seul sur la machine. il existe aussi des namespaces pour le réseau, user, système de fichier et autres ressources systèmes. Un conteneur vit donc dans sa propre bulle ignorant l’existence des autres.
Les cgroups (control groups) régulent quant à eux l’utilisation des ressources matérielles. Ils permettent de limiter et de mesurer la quantité de CPU, de mémoire, de bande passante réseau ou d’opérations disque qu’un conteneur peut consommer. Sans cgroups, un conteneur mal configuré ou malveillant pourrait monopoliser toutes les ressources de la machine hôte, affectant les autres conteneurs.
Le réseau Docker
Docker par défaut va créer un réseau virtuel privé sur la machine hôte. Chaque conteneur reçoit sa propre adresse IP dans ce réseau privé et peut communiquer avec les autres conteneurs.
On a plusieurs modes de réseaux disponibles, le mode bridge, crée un réseau isolé ou les conteneurs peuvent communiquer entre eux mais pas avec l extérieur sauf si on décide de les exposer. Le mode host supprime l isolation réseau et branche directement le conteneur sur la pile réseau de l’hôte On gagne en performance mais on perd grandement en isolation et sécurité. Le mode overlay permet a des conteneurs sur différentes machines de pouvoir communiquer entres-elles comme sur un même réseau local. Ce mode est très important lorsque que l on veut faire des architectures Docker scalables.
Accès aux Ressources Matérielles : CPU, Mémoire et GPU
L’accès au matériel dans Docker nécessite une explication. Sans limites précises définit Docker peut utiliser toutes les ressources CPU et RAM de l hôte. Il est donc vivement conseillé de mettre des limites telles qu’un conteneur ne puisse pas dépasser deux gigaoctets de mémoire ou qu’il ne peut utiliser l’équivalent de deux cœurs CPU.
Pour l’intelligence artificielle, la question du GPU est centrale. Problème, Docker ne donne pas accès aux GPU par défaut. Il faut une communication directe avec le matériel, ce qui brise l’abstraction des conteneurs.
Afin de pouvoir utiliser les GPU NVIDIA avec Docker, il existe maintenant le NVIDIA Container Toolkit. Le principe est simple, plutôt que d’installer les pilotes NVIDIA dans chaque conteneur, on les partage depuis l’hôte, permettant aux conteneurs d’accéder aux GPU nativement.
La Persistance des Données : Volumes et Montages
Un conteneur est par définition éphémère, vu qu’il est l enfant d une image, lorsque qu il s éteint il disparait afin que lorsque l’on rallume un conteneur on reparte de l image. Cela garantit la reproductibilité
Docker résout cette question avec les volumes et les montages. Un volume est un espace de stockage géré par Docker, vivant en dehors du cycle de vie des conteneurs. Lorsqu’un conteneur écrit dans un volume, ces données persistent même après la destruction du conteneur. Un nouveau conteneur peut se connecter au même volume et retrouver les données intactes.
L’Orchestration
Initialement Docker a été conçu en standalone, pour faire tourner ses conteneurs sur une machine. Mais très rapidement il a évolué pour faire tourner plusieurs conteneurs sur plusieurs machines.
Sur une machine on peut utiliser docker-compose qui vous permettra de gérer le lancement de plusieurs conteneurs avec leurs paramètres. c’est un fichier texte au format YAML très simple d’utilisation et facilement lisible. Pour des déploiements plus complexes sur plusieurs serveurs, des outils comme Kubernetes ou Swarm ont émergé, gérant des milliers de conteneurs à travers des clusters de machines.
La Portabilité : L’Atout Majeur de Docker
Le fondement de Docker est la portabilité absolue. Une image Docker fonctionnant sur votre ordinateur portable fonctionnera à l’identique sur les serveurs de production, dans le cloud, sur une machine de collègue.
Cette portabilité est précieuse dans différents domaines informatiques et permet un déploiement plus efficients des applications. Il permet aussi de faire en sorte que l’ensemble des développeurs travaillent sur un système iso.
Les Registres : Partager et Distribuer les Images
Docker Hub et les registres d’images constituent l’écosystème de partage de Docker. Docker Hub est le registre public officiel, contenant des millions d’images prêtes à l’emploi. Mais on peut très bien aussi créer son propre registre privé qui vous servira de bibliothèque d’image..
Grâce à Docker Hub, il est maintenant très simple de déployer une application. En effet beaucoup de projets et d’éditeurs proposent d’eux même une image utilisable. Vous n’avez donc pas à vous soucier dans un premier temps du déploiement. Cela a grandement démocratisé l’usage d’applications complexes. Attention néanmoins pour une utilisation en production il est vivement conseillé de mettre le nez sous le capot afin de faire du hardening et de l optimisation.
Sécurité et Bonnes Pratiques
L’isolation fournie par Docker améliore la sécurité en compartimentant les applications, mais elle n’est pas absolue.En effet les conteneurs utilisent le noyaux de l hôte, si une faille majeur atteint ce noyau rien n empêche l attaque de remonter sur le conteneur. Il est à noter que Docker vient de mettre a disposition ses images dites Docker Hardened Images (DHI). ceux sont des images maintenant gratuites et durcies.
Pour résumer , utiliser Docker ne vous absout pas des bonnes pratiques de sécurité. Pensez a vos mises a jour et aussi a mettre a jour vos images !!!
Conclusion
Au travers de ce petit article, j espère vous avoir apporté les fondamentaux pour une bonne compréhension de docker. Vous le verrez nous en aurons besoin lors des articles futurs. Docker est un outil puissant si bien utilisé et encadré.
Laisser un commentaire