Machine virtuelle vs conteneur : couche virtualisée, noyau, démarrage, isolation, usages

Les deux permettent à un seul ordinateur d’exécuter plusieurs applications isolées les unes des autres, mais ils ne virtualisent pas la même couche. Une machine virtuelle repose sur un hyperviseur qui crée du matériel virtuel (processeurs, mémoire, disques, interfaces réseau, etc.), et chaque machine virtuelle exécute par-dessus un système d’exploitation complet, noyau compris. Un conteneur partage le noyau du système d’exploitation hôte et utilise des fonctions du noyau comme les espaces de noms (namespaces) et les cgroups pour séparer ce que les processus peuvent voir et les ressources qu’ils peuvent utiliser. Les conteneurs ne démarrent pas de système d’exploitation : ils sont donc plus légers et démarrent plus vite, tandis que les machines virtuelles l’emportent par la force de l’isolation et la variété des systèmes qu’elles peuvent exécuter. Dans le cloud, on combine généralement les deux, les conteneurs s’exécutant dans des machines virtuelles.

CritèreMachine virtuelleConteneur
Couche virtualiséeLe matériel : l’hyperviseur crée des processeurs, de la mémoire, des disques et des interfaces réseau virtuels et les attribueLe système d’exploitation : sur le noyau de l’hôte, on sépare ce que les processus peuvent voir (identifiants de processus, réseau, système de fichiers, etc.) et les ressources qu’ils peuvent utiliser
NoyauChaque machine virtuelle exécute son propre système d’exploitation (OS invité), avec son propre noyauTous les conteneurs partagent le noyau de l’hôte ; les images de conteneur ne contiennent pas de noyau
Systèmes pouvant s’exécuterY compris un OS d’un autre type que l’hôte (par exemple Windows sur un hôte Linux)Seulement ce qui fonctionne sur le noyau de l’hôte ; les conteneurs Linux ont besoin d’un noyau Linux
Taille de l’imageContient un OS complet, donc généralement de l’ordre du gigaoctetSeulement l’application et les bibliothèques dont elle a besoin, donc généralement bien plus petite que celle d’une machine virtuelle
Temps de démarrageDémarre en amorçant un OS : cela prend souvent de quelques dizaines de secondes à quelques minutesLance seulement des processus : rapide, généralement opérationnel en quelques secondes
Force de l’isolationForte : séparation au niveau du matériel, si bien qu’un problème dans un noyau invité atteint rarement les autres machines virtuellesPlus faible qu’une machine virtuelle : le noyau est partagé, donc l’exploitation d’une vulnérabilité du noyau peut toucher l’hôte et les autres conteneurs
Efficacité des ressourcesChaque OS invité consomme sa propre mémoire et son propre temps processeur, donc moins d’instances tiennent sur une machinePas de systèmes d’exploitation dupliqués, donc davantage d’instances tiennent dans les mêmes ressources
Usages typiquesFaire cohabiter différents types d’OS, consolidation de serveurs, machines virtuelles IaaS, environnements exigeant une isolation forteMicroservices, tests et livraison en CI/CD, exploitation à grande échelle avec Kubernetes, environnements de développement et de production identiques

Les valeurs indiquées sont des ordres de grandeur typiques et varient selon la génération de procédé et le produit.

Quand choisir l'un ou l'autre ?

Machine virtuelle
Lorsqu’il faut exécuter un OS d’un autre type que l’hôte, choisir librement la version et les réglages du noyau, ou obtenir une isolation forte, par exemple quand on partage un serveur physique avec d’autres utilisateurs.
Conteneur
Lorsqu’on veut démarrer et arrêter rapidement de nombreuses copies d’une même application, exécuter la même image du développement à la production, ou regrouper de nombreux petits services sur une seule machine.

Questions fréquentes

Avec des conteneurs, a-t-on encore besoin de machines virtuelles ?

Cela dépend de l’usage. Pour exécuter des applications Linux, les conteneurs suffisent souvent. Pour exécuter un autre type d’OS, modifier le noyau ou obtenir une isolation forte, il faut des machines virtuelles. Dans le cloud, les conteneurs s’exécutent généralement sur des machines virtuelles fournies par le fournisseur de cloud : les deux se combinent plutôt que l’un ne remplace l’autre.

Pourquoi des conteneurs Linux fonctionnent-ils sur un PC sous Windows ou macOS ?

Les conteneurs Linux ont besoin d’un noyau Linux. Les outils qui exécutent des conteneurs Linux sous Windows ou macOS démarrent donc en arrière-plan une machine virtuelle Linux légère et y exécutent les conteneurs. Les conteneurs partagent toujours le noyau de l’hôte ; ici, l’hôte est le système Linux à l’intérieur de la machine virtuelle.

Comment renforcer l’isolation des conteneurs ?

Exécuter les processus du conteneur sous un utilisateur non root, retirer les privilèges inutiles et restreindre les appels système autorisés réduisent tous l’impact d’une attaque. Lorsqu’une isolation encore plus forte est nécessaire, certaines approches donnent à chaque conteneur sa propre machine virtuelle légère et y exécutent le conteneur.

Quelle est la différence entre les hyperviseurs de type 1 et de type 2 ?

Un hyperviseur de type 1 (bare metal) s’exécute directement sur le matériel et fait tourner les machines virtuelles par-dessus. Sans couche supplémentaire, il offre de meilleures performances et une meilleure isolation, et sert dans les serveurs et le cloud. Un hyperviseur de type 2 (hébergé) s’exécute comme une application sur un système d’exploitation ordinaire ; simple à utiliser, il est courant pour le développement et les tests sur PC.

Vérifier vos connaissances

Quelle description des types d’hyperviseurs est correcte ?

  1. AIl existe un type qui s’exécute directement sur le matériel et un type qui s’exécute comme application sur un OS ordinaire
  2. BIl s’exécute toujours comme application sur un OS ordinaire, jamais directement sur le matériel
  3. CIl n’y a pas de différence de type ; tous fonctionnent uniquement par logiciel, sans recourir au matériel
Afficher la réponse et l'explication

Réponse : A. Il existe un type qui s’exécute directement sur le matériel et un type qui s’exécute comme application sur un OS ordinaire

Les hyperviseurs se divisent en un type qui s’exécute directement sur le matériel et gère les OS (type 1, bare metal) et un type qui s’exécute comme application sur un OS ordinaire comme Windows ou Linux (type 2, hébergé). Le type 1, sans couche superflue, excelle en performances et en isolation et sert dans les serveurs et le cloud ; le type 2, facile à utiliser, est courant pour le développement et les tests sur PC. Tous deux exploitent du matériel comme les fonctions d’assistance à la virtualisation du CPU.

Quelle est la différence entre conteneurs et machines virtuelles ?

  1. AChaque conteneur possède son propre noyau d’OS, tandis que les machines virtuelles partagent le noyau
  2. BLes conteneurs s’exécutent sur un hyperviseur, tandis que les machines virtuelles fonctionnent avec les seules fonctions de l’OS
  3. CLes conteneurs partagent le noyau, tandis que les machines virtuelles exécutent leur propre OS
Afficher la réponse et l'explication

Réponse : C. Les conteneurs partagent le noyau, tandis que les machines virtuelles exécutent leur propre OS

Les conteneurs partagent le noyau d’un seul OS tout en séparant et isolant par groupe la vue des fichiers, les processus, le réseau, les ressources utilisables, etc. Sans démarrage d’un OS complet, ils sont légers et démarrent vite. Les machines virtuelles exécutent sur un hyperviseur des OS comportant chacun leur propre noyau : plus lourdes, elles offrent une isolation plus forte et peuvent faire tourner des OS d’un autre type. C’est du côté des conteneurs que le noyau est partagé ; attention aux choix qui inversent la description.

Parmi les fonctions du noyau Linux qui permettent les conteneurs, quelle association entre les espaces de noms (namespaces), les cgroups (groupes de contrôle) et leur rôle est correcte ?

  1. AEspaces de noms : séparent ce qu'un processus voit (identifiants de processus, réseau, points de montage, etc.) ; cgroups : limitent et mesurent l'utilisation de ressources comme le CPU et la mémoire
  2. BEspaces de noms : limitent et mesurent l'utilisation de ressources comme le CPU et la mémoire ; cgroups : séparent ce qu'un processus voit (identifiants de processus, réseau, points de montage, etc.)
  3. CEspaces de noms : démarrent un noyau distinct pour chaque conteneur afin de les isoler les uns des autres ; cgroups : créent un CPU virtuel pour chaque conteneur et émulent le matériel
Afficher la réponse et l'explication

Réponse : A. Espaces de noms : séparent ce qu'un processus voit (identifiants de processus, réseau, points de montage, etc.) ; cgroups : limitent et mesurent l'utilisation de ressources comme le CPU et la mémoire

Un conteneur est un processus ordinaire qui s'exécute sur le noyau de l'hôte et que deux mécanismes isolent. Les espaces de noms répartissent en groupes les identifiants de processus, le réseau, les points de montage (la vue du système de fichiers), le nom d'hôte, etc., de sorte que les processus d'un conteneur ne voient que leur propre part. Les cgroups limitent le temps CPU et la quantité de mémoire qu'un groupe de processus peut utiliser, et en mesurent l'utilisation. Ce sont deux fonctions du noyau : un conteneur ne démarre donc pas d'autre noyau et n'émule pas non plus de matériel.

  1. Sur un hôte Linux, Docker sert à démarrer un conteneur à partir d'une image fondée sur une autre distribution que celle de l'hôte, et l'on y exécute uname -r (commande qui affiche la version du noyau) et cat /etc/os-release (commande qui affiche les informations sur la distribution). Quelle description des résultats est correcte ?
  2. Quelle description de la relation entre une image de conteneur et un conteneur est correcte ?
  3. Quelle est une manière appropriée de mettre à jour le logiciel des serveurs de production conformément à l'idée d'infrastructure immuable ?

Questions d'entraînement sur Bases du cloud et des conteneurs

Termes clés expliqués

Conteneur
Unité d'exécution qui regroupe une application avec les bibliothèques et les réglages dont elle a besoin, et l'exécute isolée des autres processus tout en partageant le noyau de l'OS de l'hôte. Sous Linux, il repose sur les espaces de noms (namespaces), qui séparent la vue des identifiants de processus, du réseau, des points de montage, etc., et sur les cgroups, qui limitent l'utilisation du CPU et de la mémoire. Il est plus léger et plus rapide à démarrer qu'une machine virtuelle qui démarre un OS complet, mais, comme il partage le noyau, il ne peut pas exécuter le noyau d'un autre type d'OS que celui de l'hôte. Les conteneurs sont créés à partir d'images de conteneur, et créés et gérés avec des outils comme Docker et Kubernetes.
Image de conteneur
Modèle en lecture seule à partir duquel on crée des conteneurs. Elle empile en couches les fichiers d'une application, comme les exécutables, les bibliothèques et les réglages, et y ajoute une configuration comme la commande à lancer au démarrage ; elle ne contient pas de noyau d'OS. Les images sont construites à partir d'un Dockerfile ou d'un fichier similaire, puis stockées et distribuées par des registres. Une image se désigne par un nom de dépôt et un tag (par exemple web:1.4), ou de façon univoque par un condensé (digest) calculé à partir de son contenu (sha256:…). Les couches identiques sont partagées entre images.
Hyperviseur
Logiciel permettant d'exécuter plusieurs machines virtuelles sur un même ordinateur. Il répartit CPU, mémoire et périphériques entre les OS des machines virtuelles et les isole les uns des autres. Aussi appelé moniteur de machines virtuelles.
Docker
Ensemble logiciel très répandu qui sert à construire des images de conteneur, à échanger des images avec des registres, et à démarrer et gérer des conteneurs. Il construit les images à partir des instructions écrites dans un Dockerfile et démarre les conteneurs avec docker run. Il peut publier des ports avec -p, conserver des données dans des volumes et des montages bind, et configurer le réseau. Les formats d'image et de conteneur sont normalisés par les spécifications de l'OCI (Open Container Initiative) : les mêmes images peuvent donc être utilisées avec d'autres outils que Docker.
Kubernetes
Plateforme d'orchestration qui place des conteneurs sur un cluster de nombreuses machines (nœuds), maintient leur nombre, les met à jour et leur fournit des points d'accès. Les utilisateurs déclarent un état souhaité avec des ressources comme les Deployments et les Services, et des contrôleurs observent l'état réel et le rapprochent de la déclaration (réconciliation). La plus petite unité est le Pod ; les Pods perdus sont recréés automatiquement, et les mises à jour progressives ainsi que la mise à l'échelle automatique selon la charge sont prises en charge. On l'abrège aussi en K8s.
Infrastructure immuable (immutable infrastructure)
Approche d'exploitation dans laquelle les serveurs (machines virtuelles ou conteneurs) ne sont jamais modifiés une fois créés ; quand une mise à jour est nécessaire, on en crée de nouveaux à partir d'une image qui contient le changement, on les met à la place et l'on jette les anciens. Comme chaque serveur est créé à partir de la même image, les configurations ne divergent pas par l'accumulation de différences manuelles, et revenir à l'image précédente rétablit facilement l'ancien état. Tout ce qui doit être conservé, comme les journaux et les données, est placé dans du stockage ou des bases de données hors des serveurs.

Comparatifs associés