• 10 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 15/10/2024

Découvrez la conteneurisation

Votre CEO Liam vous a interpellé ce matin :

J’ai entendu parler d’une nouvelle technologie: Docker. Il semblerait que c’est ce qui va remplacer les machines virtuelles dans les années à venir !

Et chanceux que vous êtes, il vient de vous charger de réfléchir au futur déploiement du nouveau projet de SaaS (nom de code: Libra, un système de partage sécurisé de documents à destination des avocats) de l’entreprise. C’est votre grand jour !

Distinguez la conteneurisation de la virtualisation

Avant de vous plonger dans le monde de la conteneurisation et de Docker, il est essentiel que vous compreniez en quoi cette technologie se distingue de la virtualisation, une méthode bien établie pour isoler des applications et des systèmes d'exploitation.

Les deux techniques visent à maximiser l'utilisation des ressources matérielles mais elles diffèrent fondamentalement dans leur approche et leurs avantages.

La virtualisation

La virtualisation est une technologie qui permet de créer plusieurs machines virtuelles (VM) sur un seul serveur physique. Chaque machine virtuelle fonctionne comme une machine indépendante avec son propre système d’exploitation, ses applications et ses ressources dédiées.

Chaque App ou machine fonctionne individuellement avec ses propres ressources.
La virtualisation
Fonctionnement

La clé de la virtualisation est l’hyperviseur, un logiciel qui permet de créer et de gérer des machines virtuelles. Il existe deux types d’hyperviseurs :

  • Hyperviseur de type 1 (“Bare metal”) : Ce type d’hyperviseur fonctionne directement sur le matériel. Exemples: VMware ESXi, Microsoft Hyper-V, Xen.

  • Hyperviseur de type 2 (“Hosted”) : Ce type d’hyperviseur fonctionne sur un système d’exploitation hôte. Exemples: VMWare Workstation, Oracle VM Virtualbox.

D’un point de vue isolation, chaque machine virtuelle est complètement distincte des autres. Elle dispose de son propre système d’exploitation et de son système de stockage dédié.

Enfin, les ressources (CPU, RAM, etc.) sont allouées à chaque machine virtuelle, de manière fixe.

La conteneurisation

La conteneurisation est une technique permettant de créer des “conteneurs”, groupes d’un ou plusieurs processus, qui partagent le même noyau du système d’exploitation mais s’exécutent de manière isolée les uns des autres.

Chaque conteneur partage le même système d'exploitation mais s'exécutent de manière isolée les uns des autres
La conteneurisation
Fonctionnement

Les conteneurs sont gérés par des moteurs de conteneurisation comme Docker. Ces moteurs utilisent des fonctionnalités du noyau Linux telles que les cgroups et les namespaces pour isoler et contrôler les ressources.

Et Microsoft Windows alors ?

Bien que la conteneurisation soit une technologie originellement issue du monde Unix, le noyau de Microsoft Windows propose également aujourd’hui des fonctionnalités d’isolation des processus, permettant ainsi d’exécuter des conteneurs Windows sur ce système d’exploitation. De plus, un hôte Windows est également aujourd’hui en capacité à exécuter des conteneurs GNU/Linux grâce à WSL2.

Concernant l’isolation, et contrairement aux machines virtuelles, les conteneurs partagent le même noyau système mais sont isolés en termes de processus, de réseau et de système  de fichier.

Ainsi, deux machines virtuelles s’exécutant sur le même système hôte exécuteront chacune leur propre noyau système et accéderont aux ressources matérielles via des couches d’abstractions, entraînant de fait une utilisation de base de ressources supérieures à celle qui pourraient être utilisées par des conteneurs dans une topologie de déploiement identique.

De plus, et une fois encore contrairement aux machines virtuelles, les conteneurs partagent les ressources du système hôte, permettant généralement une gestion plus dynamique et efficace de celles-ci.

Avantages et inconvénients

Réalisons ensemble un petit comparatif des fonctionnalités offertes par ces deux technologies :

Aspect

Virtualisation

Conteneurisation

Isolation

Complète (chaque machine virtuelle a son propre système d’exploitation)

Partielle (partage du noyau)

Ressources

Plus gourmandes (chaque machine virtuelle a des ressources dédiées)

Moins gourmandes (partage des ressources)

Performances

Démarrage lent (chaque machine virtuelle doit effectuer le processus de démarrage de son système d’exploitation)

Démarrage rapide (le ou les processus de chaque conteneur s’exécute directement au lancement)

Flexibilité système hôte

Grande (chaque machine virtuelle peut avoir un système d’exploitation différent)

Limitée (les conteneurs partagent le même noyau)

Et j’en déduis quoi de tout ça du coup ?

Très bonne question ! La virtualisation sera à privilégier dans les scénarios nécessitant une isolation complète et une grande flexibilité dans les systèmes d’exploitation, par exemple si vous implémentez une solution cloud de “bureaux à distance”.

Au contraire, la conteneurisation prendra tout son intérêt dans les scénarios nécessitant un grand dynamisme de déploiement, par exemple pour une application sujette à des pics de charge élevés pendant des temps plus ou moins longs.. Une des caractéristiques clés des applications web.

Libra, le nouveau projet de l’entreprise, entre parfaitement dans cette catégorie ! Il est temps de découvrir un peu plus en détail le fonctionnement de ces fameux conteneurs.

Comprenez le fonctionnement des conteneurs

Pour comprendre pleinement le fonctionnement des conteneurs, il est crucial de se familiariser avec deux concepts clés : les cgroups (control groups) et les namespaces. Ces fonctionnalités du noyau Linux permettent de gérer les ressources et d'assurer l'isolation des conteneurs. 

Les cgroups (control groups)

Les cgroups, ou groupes de contrôle, sont une fonctionnalité du noyau Linux qui permet de limiter, prioriser et isoler l’utilisation des ressources (telles que le CPU, la mémoire, le disque et le réseau) par des groupes de processus.

Cette fonctionnalité est essentielle pour garantir que chaque conteneur dispose des ressources nécessaires sans interférer avec les autres.

Fonctionnement
  • Allocation : Les cgroups permettent d’allouer des quotas spécifiques de CPU, de mémoire et d’autres ressources à chaque conteneur. Par exemple, un cgroup peut être configuré pour limiter un conteneur à utiliser 2 Go de RAM et un cœur de CPU.

  • Priorisation : Les cgroups peuvent également prioriser l’accès aux ressources. Cela signifie que certains conteneurs peuvent avoir un accès préférentiel aux ressources par rapport à d’autres.

  • Supervision : Les cgroups offrent des capacités de surveillance, permettant aux administrateurs de suivre l’utilisation des ressources par  chaque conteneur et de prendre des mesures correctives si nécessaire.

Supposons que l’environnement applicatif Libra soit constitué de 3 services, exécutés sous forme de conteneurs distincts:

  • Un serveur HTTP utilisé comme “reverse proxy” ;

  • L’application Libra elle-même ;

  • Un serveur de stockage de fichiers.

Si vous disposiez d’un serveur de 12G de RAM et de 8 CPUs, grâce aux cgroups vous pourriez:

  • Limiter le premier conteneur à 4Go de RAM et 3 CPUs

  • Limiter le second conteneur à 2G de RAM et 2 CPUs

  • Limiter le dernier conteneur à 4G de RAM et 2 CPUs

En répartissant les ressources disponibles vous assurerez ainsi à vos conteneurs de s’exécuter dans un environnement stable mais contraint, limitant de fait les risques d’emballement de vos processus.

Mais ça ne fait pas 12Go de RAM et 8 CPUs !?

Bien vu ! Effectivement, il est préférable de toujours réserver une partie des ressources pour le système hôte, sous peine que celui-ci ne puisse plus assurer ses propres fonctions. Gardez donc toujours à l’esprit de lui réserver un peu de ressources !

Les namespaces

Les namespaces, ou espaces de noms, sont une autre fonctionnalité du noyau Linux qui permet d’isoler des groupes de processus vis-à-vis des ressources systèmes. Chaque namespace est une vue isolée de certaines ressources système telles que les processus, le réseau, les points de montage et plus encore.

Fonctionnement
  • Isolation des processus : Chaque conteneur fonctionne dans son propre espace de noms de processus, ce qui signifie qu’il ne peut voir que ses propres processus et non ceux de l’hôte ou des autres conteneurs.

  • Isolation du système de fichiers : Chaque conteneur peut avoir son propre système de fichiers, isolé du système de fichiers de l’hôte et des autres conteneurs.

  • Isolation réseau : Les namespaces réseau permettent à chaque conteneur d’avoir ses propres interfaces réseau, isolées du reste du système. Cette fonctionnalité permet notamment de créer des réseaux privés entre conteneurs.

  • Isolation des points de montage : Chaque conteneur peut avoir ses propres points de montage (disques physiques, virtuels ou réseau), indépendants de ceux de l’hôte.

Reprenons notre environnement applicatif Libra décrit un peu plus tôt. Nous pourrions par exemple

  • Nous pourrions utiliser un même namespace de réseau pour le conteneur exécutant l’application Libra et le conteneur exécutant le serveur HTTP. Nous nous assurerions ainsi que l’application Libra n’est accessible que par l’intermédiaire de son “reverse proxy” et non pas via une communication directe...

  • Nous pourrions utiliser un namespace de montage pour accéder à un système de fichiers spécifique contenant des données sensibles dans le conteneur exécutant le service de stockage des fichiers, limitant ainsi les risques d’accès non autorisés en cas de faille de sécurité sur l’application Libra.

Les cgroups et les namespaces sont les fondements de la conteneurisation. D’un côté les cgroups assurent une gestion fine des quotas d’accès aux ressources tandis que les namespaces offrent une isolation robuste des processus, du système de fichiers et des réseaux.

Ensemble, ces technologies forment le pilier central ainsi la première ligne de défense de votre infrastructure conteneurisée. 

Vous connaissez désormais les deux piliers technologiques qui soutiennent la création des conteneurs. Découvrons maintenant ensemble un moteur de conteneurisation, Docker.

Découvrez Docker

Docker a révolutionné le monde de la conteneurisation en simplifiant la création, le déploiement et la gestion des applications conteneurisées. Depuis son lancement, Docker a non seulement popularisé l’usage des conteneurs mais a également contribué à la formation d’un écosystème riche et dynamique.

Docker a été lancé en 2013 par Solomon Hykes sous la société dotCloud (plus tard renommée Docker Inc.). Avant Docker, la conteneurisation existait déjà sous diverses formes mais elle était complexe à utiliser et principalement réservée aux grandes entreprises et aux environnements spécialisés.

Des conteneurs avant Docker ?

Bien que Docker ait largement contribué à la popularisation des conteneurs, cette technologie prend racine bien plus tôt dans l’histoire de l’informatique.

La véritable révolution apportée par Docker n’a pas été sur l’aspect technologique mais sur l’expérience utilisateur de ces technologies.

Composants principaux

Docker est composé de plusieurs briques techniques qui travaillent ensemble pour fournir une solution complète de conteneurisation. Identifier ces composants est essentiel pour comprendre comment Docker fonctionne et comment il peut être utilisé pour développer, déployer et gérer des applications conteneurisées.

Composant

Description

Docker Engine

Docker Engine est le cœur de la plateforme Docker. Il est responsable de la création, de l’exécution et de la gestion des conteneurs. Il est lui-même découpé en plusieurs éléments :

  • Docker Daemon (dockerd) : Processus principal (serveur) qui gère les conteneurs Docker sur l’hôte. Il expose une API REST.

  • Docker Client (docker) : Interface en ligne de commande permettant aux utilisateurs d’interagir avec le daemon Docker pour exécuter des commandes de gestion des conteneurs.

Docker Images

Les images Docker sont des archives immuables contenant tout ce dont une application a besoin pour fonctionner, y compris le code, les bibliothèques et les dépendances.

Docker Hub

Docker Hub est une plateforme pour stocker, partager et découvrir des images Docker.

Registre par défaut utilisé par le Docker Engine, il facilite le partage et la collaboration des utilisateurs de solutions de conteneurisation.

Docker Swarm

Docker Swarm est un outil d’orchestration pour gérer des clusters de machines Docker.

Il permet de regrouper plusieurs machines hôte en un cluster unique, facilitant ainsi la gestion de l’orchestration des conteneurs à grande échelle.

En alliant simplicité et un écosystème riche, Docker a été l’initiateur de la grande vague de migration vers les technologies de conteneurisation dans l’industrie informatique.

Cette vague d’adoption s’est rapidement transformée en une démarche de normalisation incarnée aujourd’hui par l’Open Container Initiative, que nous allons découvrir ensemble maintenant.

Explorez la démarche de normalisation des conteneurs

La popularité croissante de la conteneurisation a mis en évidence la nécessité de normes ouvertes pour garantir l’interopérabilité et la portabilité des conteneurs à travers différentes plateformes et outils.

Une démarche de normalisation des conteneurs a été portée par des acteurs majeurs de l’industrie technologique (Google, Microsoft, Red Hat, etc.) ainsi que par des communautés open source, aboutissant à des initiatives telles que l’Open Container Initiative (OCI)

Dans le contexte des conteneurs, les normes ouvertes visent à définir des formats de conteneur et des environnements d’exécution standardisés, assurant ainsi que les conteneurs créés avec un outil peuvent être exécutés et gérés avec un autre outil compatible.

Et les autres dans tout ça ?

Un grand nombre d’outils existent aujourd’hui pour exécuter des conteneurs. Si vous êtes intéressés par le sujet, jetez un œil à Podman ou à runc. Si vous êtes observateur, vous verrez que ces deux projets ont une différence fondamentale avec Docker… Vous donnez votre langue au chat ? Entre autres différences, ces deux outils n'utilisent pas une architecture client/serveur comme Docker, ce qui offre des potentielles garanties supplémentaires concernant leur modèle de sécurité.

Via la publication de ces spécifications, l’Open Container Initiative vise à :

  • Assurer l’interopérabilité : les spécifications permettent aux différents outils de fonctionner de manière cohérente même lorsque ceux-ci sont développés par des structures indépendantes (et même parfois concurrentes).

  • Promouvoir la portabilité : les images répondent à la spécification OCI pouvant être exécutées sur n’importe quelle plateforme conforme, indépendamment de l’implémentation.

  • Faciliter l’adoption : en établissant des standards, l’OCI aide à réduire la complexité pour les développeurs et les opérateurs de conteneurs, encourageant une adoption plus large de cette technologie.

Docker est totalement intégré à cette dynamique internationale, et l’ensemble des outils constituant son écosystème logiciel sont compatibles avec les spécifications éditées par l'Open Container Initiative (OCI).

En choisissant d'adopter Docker, les entreprises et les développeurs ne prennent aucun risque d'enfermement technologique. Au contraire, cette adoption garantit une plus grande facilité de migration d'un fournisseur à l'autre grâce à la standardisation et à l'interopérabilité assurées par les spécifications de l'OCI.

À vous de jouer

Contexte

Liam vous a demandé d’étudier les différences entre la conteneurisation et la virtualisation dans l’optique d’identifier la technologie la plus adaptée au futur déploiement de l’application Libra, nouveau projet étendard de l’entreprise.

Voici la description de l’application qui vous a été fournie:

Libra est une application web de type SaaS (Software as a Service) spécialement conçue pour répondre aux besoins de sécurité et de facilité d'utilisation des avocats et autres professionnels de la justice. Son objectif principal est de faciliter le transfert de documents chiffrés entre les parties concernées, garantissant ainsi la confidentialité et l'intégrité des informations sensibles échangées.

Fonctionnalités principales :

  • Interface intuitive et conviviale

  • Partage de documents en quelques clics

  • Système de vie et stockage éphémère

  • Application démarrée et détruite à la demande

  • Suppression automatique des documents après consultation

  • Intégration de technologies de chiffrement de pointe

Consignes

  • Réalisez un tableau comparatif des avantages et inconvénients des technologies de virtualisation et de conteneurisation dans le contexte du déploiement de l’application Libra.

Vérifiez votre travail à l’aide de cet exemple de corrigé

Technologies

Avantages

Inconvénients

Virtualisation

  • (++) Sécurité améliorée : les machines virtuelles étant véritablement isolées, la sécurité des documents est renforcée

  • (--) Temps de démarrage : L’objectif de Libra étant de démarrer des instances éphémères et “à la demande” de l’application, les temps de démarrage risquent de poser problème.

Conteneurisation

  • (++) Démarrage quasi instantané : Les conteneurs démarrant quasiment instantanément, le mécanisme d’instance éphémère sera très facilement implémentable

  • (+) Meilleure optimisation de l’usage des ressources: les cgroups permettront de restreindre l’usage des ressources tout en évitant de réserver celle-ci de manière stricte pour chaque instance.

  • (+) Facilité de déploiement : la démocratisation de la conteneurisation fait qu’un grand nombre de plateformes offrent des services d’hébergement “clés en main”

  • (-) Sécurité moins élevée: le niveau de sécurité de la conteneurisation est légèrement moins élevé que celui offert par la virtualisation

La conteneurisation gagne (4 points) par rapport à la virtualisation (0 points).

En résumé

  • La conteneurisation utilise des conteneurs légers partageant le noyau de l'OS hôte, tandis que la virtualisation crée des machines virtuelles avec leur propre OS complet.

  • Les cgroups gèrent les ressources allouées aux conteneurs et les namespaces assurent leur isolation au niveau des processus et des ressources système.      

  • Docker simplifie la conteneurisation avec des composants comme Docker Engine, Docker Images, Docker Containers, Docker Compose, et Docker Swarm pour une gestion et une orchestration efficaces.

  • L'Open Container Initiative (OCI) établit des standards ouverts pour l'interopérabilité des conteneurs, avec Docker adoptant ces standards pour éviter l'enfermement technologique. 

Connaissant désormais les éléments théoriques de la conteneurisation et de Docker, attaquons-nous à la partie pratique !

Exemple de certificat de réussite
Exemple de certificat de réussite