Docker
De la virtualisation à la conteneurisation
L’isolation de manière optimale une application sur un système au vue de la rendre opérationnelle dans plusieurs environnements passe par deux mécanismes : la virtualisation et/ou la conteneurisation.
Ces deux mécanismes sont des technologies de virtualisation qui permettent d’émuler ou de simuler un système. Toutefois, ils utilisent différentes technologies.
Avant l’arrivée des conteneurs, la virtualisation permettait déjà d’exécuter par émulation plusieurs systèmes d’exploitation sur une seule machine en créant des machines virtuelles. Cette émulation consiste en un partage des ressources physiques (CPU, RAM, disque dur, carte réseau) grâce à un logiciel, l’hyperviseur.
Malgré ses nombreux avantages, la gestion de machines virtuelles induit :
- Le manque de performance sur des machines à faible ressources (environnement local) et du fait de la surcouche d’abstraction (hyperviseur)
- Le manque de portabilité notamment pour une migration d’un environnement on-premise vers un environnement cloud
- La mise en place de tout un système pour l’exécution d’un seul processus précis
La conteneurisation a fait son arrivée bien des années après. Elle empaquette l’essentiel requis à l’exécution d’une application comme son code source et ses packages. Le tout dans des conteneurs qui peuvent s’exécuter indépendamment de la machine hôte.
Loin des machines virtuelles les conteneurs sont des petites bulles légères encapsulant et permettant d’exécuter votre code. L’émergence du moteur open-source Docker, sujet de cet article, a propulsé les conteneurs.
Qu’est-ce que Docker ?
Docker est une plateforme open source qui permet aux développeurs de construire, déployer, exécuter, mettre à jour et gérer des conteneurs standardisés. Docker intègre des logiciels dans ces unités normalisées que sont les conteneurs. Ils contiennent tous les éléments nécessaires au fonctionnement des applications notamment les bibliothèques, les outils système, le code et l’environnement d’exécution.
Docker offre par sa technologie une virtualisation très légères et modulaires avec une flexibilité pour créer, déployer, copier des conteneurs et les déplacer d’un environnement à un autre sans autre configuration. Le tout en conservant l’intégralité des fonctions de l’environnement d’exécution.
Architectures de docker
Docker engine
Comme tout système docker requiert un cœur ou un moteur. Docker engine est le moteur de fonctionnement de docker. Il est composé
- Un docker daemon : dockerd est un processus en tâche de fond qui gèrent les objets docker. Il écoute en permanence les requêtes de l’API Docker et les traite.
- Un Docker Engine API : utilisé par les applications pour interagir avec le Docker daemon
- Une interface de ligne de commande Docker CLI : permet d’interagir avec le daemon par des appels de command de commande docker en ligne de commande
Docker engine fonctionne comme une application client-server instruisant les informations par les commandes docker qui sont traduites par le serveur (Docker Daemon) par l’intermédiaire d’une API REST.
Docker engine permet donc de créer, de gérer et d’exécuter des conteneurs.
Docker image
Une image docker est un template en lecture seule avec des instructions définissant les ressources et le mode d’exécution requis pour une application. Les conteneurs Docker sont des instances d’image.
Chaque image est formée d’une série de couches définis par chaque instructions de son fichier de création. Ainsi une image peut être construite sur la base d’une autre image en important les couches de celle-ci.
Une image peut être construite à partir d’un fichier Dockerfile ou récupérer directement depuis un registre.
Ce sont ces images qui sont partagées entre les développeurs et assure la portabilité des configurations d’une application.
Dockerfile
A la base de la création de conteneur d’application se trouve le Dockerfile. Un Dockerfile est un fichier texte sans extension qui contient toutes les instructions requises pour créer une image.
Chacune de ses instructions est exécutée dans l’ordre de définition afin de former une image avec les dépendances et la configuration souhaitées. Chaque changement d’une instruction de ce fichier entraîne une modification de l’image construite, de ce fait de ses couches.
Un Dockerfile se base sur une image de base appelée image parente. Voici un exemple de Dockerfile affichant un message dans le terminal.
FROM alpine RUN echo “Toute l’équipe Iorga vous salue”
L’instruction FROM par exemple est la plus importante. Elle définit l’image de base à partir de laquelle toutes les instructions suivantes seront exécutées.
Docker container
Un conteneur Docker est une instance exécutable d’une image. Il est totalement isolé dans les limites de la configuration de l’image. Les conteneurs peuvent être créés avec un nom spécifique, démarrés, arrêtés, déplacés ou supprimés.
Selon la configuration de l’image à partir de laquelle le conteneur est créé nous pouvons définir son isolation réseau, de stockage et des configurations systèmes des autres conteneurs et du système hôte.
C’est au sein des conteneurs que s’exécutent les applications encapsulées dans une image. Aussi vous pouvez créer une image à partir d’un conteneur capturant ainsi son état. Cette image peut donc être partagée. Avec les bonnes configurations sur l’hôte une application identique peut être créer sur cette base.
Docker registry
Docker registry est une solution open-source de stockage d’image Docker. Les images ainsi créées peuvent être stockées, et versionner dans les dépôts d’un registre de conteneur tel que Docker registry en utilisant les tags comme identifiant. Le registre de conteneur joue le rôle de système de contrôle de version.
De nombreuses solutions de registre de conteneur existent telles que Amazon Elastic Container Registry, Azure Container Registry. Docker met à disposition son propre registre d’image de conteneurs, Docker Hub. Très utilisé par la communauté, plus de 100.000 images y sont disponibles.
Toutes ses solutions ont la flexibilité de fonctionner avec l’interface de ligne de commande Docker (Docker CLI). Avec celles-ci les images créées sont envoyées ou récupérées au registre en tapant :
docker push nom_image
docker pull nom_image
Pourquoi utiliser Docker ?
Les conteneurs existaient bien avant Docker, avec LinuXContainers (LXC) implémentés dans le noyau Linux en 2008, qui permettait la virtualisation d’une instance unique de Linux. Malgré cet état de chose, Docker est devenu la référence en termes de conteneur.
Docker présente des avantages notables qui justifient sa popularité et la croissance de sa communauté d’environ 4 millions de développeurs. Docker procure :
- Efficacité des ressources : le déploiement de conteneur assure une isolation comme les machines virtuelles avec moins d’utilisation des ressources du système hôte
- Portabilité : toutes les ressources nécessaires au fonctionnement d’une application sont empaquetées dans un conteneur. Il peut donc être utilisé dans tous les environnements indépendamment du système d’exploitation.
- Intégration continu et Déploiement continu : l’utilisation d’images Docker permet l’utilisation d’outils devops et des cycles CI/CD grâce à la légèreté des images docker
- Standardisation : l’utilisation des images pour la création des applications conteneurisées permet la standardisation et l’universalité des environnements de développement, de test et de production
- Variétés d’outils : les images et conteneurs docker peuvent être intégrés, déployés et clusterisés avec des plugins Docker comme docker-compose, Kubernetes, docker-swarm, etc…
- Simplicité : l’architecture de docker la rend accessible par la simplicité de ses commandes. En quelques commandes vous pouvez démarrer une application prête à l’emploi.
- Réutilisabilité : les images Docker peuvent être utilisées comme base dans la création d’autres images ou servir comme telle.
- Communauté : toutes les technologies Gitlab, Nginx et bien d’autres sont toutes disponibles sous forme d’image docker.
- Maintenabilité : les Dockerfile et les images permettent le suivi des versions d’une image et un rollback aisé. Ils permettent aussi de gérer les versions déployées entre dans chaque environnement (recette, production)
Docker présente donc pour peu sus-cités des avantages considérables. Combinés avec ses plugins comme docker-compose vos configurations d’environnements ne tiendront plus que dans un fichier de configuration pour tous vos services.
Utilisation de Docker par les équipes IORGA Group
Au vu de ses avantages, les équipes IORGA Group n’ont pas hésité à mettre Docker au cœur de leurs réalisations. Pour chaque contexte projets notre Direction Technique conçoit des images Docker sur mesure. Celles-ci sont optimisées grâce à la connaissance des bonnes pratiques et permettent au développeur de tester leur développement sur une même base. Adaptée pour s’exécuter dans les machines virtuelles EC2 du fournisseur cloud AWS, de nombreux conteneurs s’exécutent actuellement pour nos nombreux clients qui nous réitèrent leur confiance.
Source:
Docker Architecture
Docker Engine
Docker
Docker Statistics and User Count (2023)
Docker Index Shows Momentum in Developer Community Activity