Docker n'est pas une méthodologie de virtualisation. Il s'appuie sur d'autres outils qui implémentent réellement la virtualisation basée sur conteneur ou la virtualisation au niveau du système d'exploitation. Pour cela, Docker utilisait initialement le pilote LXC, puis a été déplacé vers libcontainer qui est maintenant renommé runc. Docker se concentre principalement sur l'automatisation du déploiement d'applications à l'intérieur de conteneurs d'applications. Les conteneurs d'applications sont conçus pour regrouper et exécuter un seul service, tandis que les conteneurs système sont conçus pour exécuter plusieurs processus, comme les machines virtuelles. Docker est donc considéré comme un outil de gestion de conteneurs ou de déploiement d'applications sur des systèmes conteneurisés.
Afin de savoir en quoi il diffère des autres virtualisations, passons en revue la virtualisation et ses types. Ensuite, il serait plus facile de comprendre quelle est la différence.
Virtualisation
Dans sa forme conçue, il était considéré comme une méthode de division logique des mainframes pour permettre à plusieurs applications de s'exécuter simultanément. Cependant, le scénario a radicalement changé lorsque les entreprises et les communautés open source ont pu fournir une méthode de traitement des instructions privilégiées d'une manière ou d'une autre et permettre à plusieurs systèmes d'exploitation d'être exécutés simultanément sur un seul système x86.
Hyperviseur
L'hyperviseur gère la création de l'environnement virtuel sur lequel les machines virtuelles invitées fonctionnent. Il supervise les systèmes invités et s'assure que les ressources sont allouées aux invités selon les besoins. L'hyperviseur se situe entre la machine physique et les machines virtuelles et fournit des services de virtualisation aux machines virtuelles. Pour le réaliser, il intercepte les opérations du système d'exploitation invité sur les machines virtuelles et émule l'opération sur le système d'exploitation de la machine hôte.
Le développement rapide des technologies de virtualisation, principalement dans le cloud, a poussé davantage l'utilisation de la virtualisation en permettant la création de plusieurs serveurs virtuels sur un seul serveur physique à l'aide d'hyperviseurs, tels que Xen, VMware Player, KVM, etc., et intégration de la prise en charge matérielle dans les processeurs de base, tels que Intel VT et AMD-V.
Types de virtualisation
La méthode de virtualisation peut être classée en fonction de la façon dont elle imite le matériel à un système d'exploitation invité et émule un environnement d'exploitation invité. Il existe principalement trois types de virtualisation:
- Émulation
- Paravirtualisation
- Virtualisation basée sur des conteneurs
Émulation
L'émulation, également connue sous le nom de virtualisation complète, exécute le noyau du système d'exploitation de la machine virtuelle entièrement dans le logiciel. L'hyperviseur utilisé dans ce type est appelé hyperviseur de type 2. Il est installé sur le dessus du système d'exploitation hôte qui est responsable de la traduction du code du noyau du système d'exploitation invité en instructions logicielles. La traduction se fait entièrement en logiciel et ne nécessite aucune implication matérielle. L'émulation permet d'exécuter tout système d'exploitation non modifié prenant en charge l'environnement émulé. L'inconvénient de ce type de virtualisation est une surcharge de ressources système supplémentaire qui entraîne une baisse des performances par rapport aux autres types de virtualisations.
Les exemples de cette catégorie incluent VMware Player, VirtualBox, QEMU, Bochs, Parallels, etc.
Paravirtualisation
La paravirtualisation, également connue sous le nom d'hyperviseur de type 1, s'exécute directement sur le matériel, ou «bare-metal», et fournit des services de virtualisation directement aux machines virtuelles qui y sont exécutées. Il aide le système d'exploitation, le matériel virtualisé et le vrai matériel à collaborer pour obtenir des performances optimales. Ces hyperviseurs ont généralement une empreinte assez petite et ne nécessitent pas, eux-mêmes, de ressources importantes.
Les exemples de cette catégorie incluent Xen, KVM, etc.
Virtualisation basée sur des conteneurs
La virtualisation basée sur des conteneurs, également connue sous le nom de virtualisation au niveau du système d'exploitation, permet plusieurs exécutions isolées dans un seul noyau de système d'exploitation. Il offre les meilleures performances et densité possibles et propose une gestion dynamique des ressources. L'environnement d'exécution virtuelle isolé fourni par ce type de virtualisation est appelé conteneur et peut être considéré comme un groupe de processus tracés.
Le concept de conteneur est rendu possible par la fonctionnalité d'espaces de noms ajoutée à la version 2.6.24 du noyau Linux. Le conteneur ajoute son ID à chaque processus et ajoute de nouveaux contrôles de contrôle d'accès à chaque appel système. Il est accessible par l' appel système clone () qui permet de créer des instances distinctes des espaces de noms précédemment globaux.
Les espaces de noms peuvent être utilisés de différentes manières, mais l'approche la plus courante consiste à créer un conteneur isolé qui n'a aucune visibilité ou accès aux objets en dehors du conteneur. Les processus s'exécutant à l'intérieur du conteneur semblent s'exécuter sur un système Linux normal bien qu'ils partagent le noyau sous-jacent avec des processus situés dans d'autres espaces de noms, de même pour d'autres types d'objets. Par exemple, lors de l'utilisation d'espaces de noms, l'utilisateur root à l'intérieur du conteneur n'est pas traité comme root à l'extérieur du conteneur, ce qui ajoute une sécurité supplémentaire.
Le sous-système Linux Control Groups (cgroups), le prochain composant majeur pour activer la virtualisation basée sur des conteneurs, est utilisé pour regrouper les processus et gérer leur consommation globale de ressources. Il est couramment utilisé pour limiter la consommation de mémoire et de CPU des conteneurs. Puisqu'un système Linux conteneurisé n'a qu'un seul noyau et que le noyau a une visibilité complète sur les conteneurs, il n'y a qu'un seul niveau d'allocation et de planification des ressources.
Plusieurs outils de gestion sont disponibles pour les conteneurs Linux, notamment LXC, LXD, systemd-nspawn, lmctfy, Warden, Linux-VServer, OpenVZ, Docker, etc.
Conteneurs vs machines virtuelles
Contrairement à une machine virtuelle, un conteneur n'a pas besoin de démarrer le noyau du système d'exploitation, de sorte que les conteneurs peuvent être créés en moins d'une seconde. Cette fonctionnalité rend la virtualisation basée sur conteneur unique et souhaitable par rapport aux autres approches de virtualisation.
Étant donné que la virtualisation basée sur les conteneurs ajoute peu ou pas de surcharge à la machine hôte, la virtualisation basée sur les conteneurs a des performances quasi natives
Pour la virtualisation basée sur des conteneurs, aucun logiciel supplémentaire n'est requis, contrairement aux autres virtualisations.
Tous les conteneurs sur une machine hôte partagent le planificateur de la machine hôte, économisant ainsi des ressources supplémentaires.
Les états des conteneurs (images Docker ou LXC) sont de petite taille par rapport aux images de machines virtuelles, de sorte que les images de conteneurs sont faciles à distribuer.
La gestion des ressources dans les conteneurs est réalisée via des groupes de contrôle. Cgroups n'autorise pas les conteneurs à consommer plus de ressources que ce qui leur est alloué. Cependant, pour l'instant, toutes les ressources de la machine hôte sont visibles dans les machines virtuelles, mais ne peuvent pas être utilisées. Cela peut être réalisé en exécutant top
ou htop
sur des conteneurs et une machine hôte en même temps. La sortie dans tous les environnements sera similaire.
Mise à jour:
Comment Docker exécute-t-il les conteneurs dans les systèmes non Linux?
Si les conteneurs sont possibles en raison des fonctionnalités disponibles dans le noyau Linux, alors la question évidente est de savoir comment les systèmes non Linux exécutent les conteneurs. Docker pour Mac et Windows utilisent des machines virtuelles Linux pour exécuter les conteneurs. Docker Toolbox utilisé pour exécuter des conteneurs dans des machines virtuelles Virtual Box. Mais, le dernier Docker utilise Hyper-V sous Windows et Hypervisor.framework sous Mac.
Maintenant, permettez-moi de décrire en détail comment Docker pour Mac exécute les conteneurs.
Docker pour Mac utilise https://github.com/moby/hyperkit pour émuler les capacités de l'hyperviseur et Hyperkit utilise hypervisor.framework dans son cœur. Hypervisor.framework est la solution d'hyperviseur native de Mac. Hyperkit utilise également VPNKit et DataKit pour le réseau d'espace de noms et le système de fichiers respectivement.
La machine virtuelle Linux que Docker exécute sur Mac est en lecture seule. Cependant, vous pouvez y pénétrer en exécutant:
screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty
.
Maintenant, nous pouvons même vérifier la version du noyau de cette machine virtuelle:
# uname -a
Linux linuxkit-025000000001 4.9.93-linuxkit-aufs #1 SMP Wed Jun 6 16:86_64 Linux
.
Tous les conteneurs s'exécutent à l'intérieur de cette machine virtuelle.
Il y a quelques limitations à hypervisor.framework. À cause de cela, Docker n'expose pas l' docker0
interface réseau dans Mac. Vous ne pouvez donc pas accéder aux conteneurs depuis l'hôte. Pour l'instant, docker0
n'est disponible qu'à l'intérieur de la machine virtuelle.
Hyper-v est l'hyperviseur natif de Windows. Ils essaient également de tirer parti des capacités de Windows 10 pour exécuter les systèmes Linux en mode natif.