- Comprendre la technologie des conteneurs
- Technologie des conteneurs Docker
- Processus à l'intérieur du conteneur
- Le mécanisme Namespace
- La technologie Namespace de Linux
- Plusieurs Namespaces en action
- Mount Namespace
- Network Namespace
- Autres Namespaces
- Le principe d'implémentation des conteneurs Docker
- Comparaison des conteneurs avec les machines virtuelles
- La virtualisation légère de Docker
- Conclusion
Comprendre la technologie des conteneurs
Les conteneurs sont un type de technologie de bac à sable (sandbox). Comme leur nom l’indique, un bac à sable est une technologie capable d’« empaqueter » des applications comme un conteneur, garantissant que les applications n’interfèrent pas entre elles grâce à des limites établies. De plus, les applications contenues dans ces « conteneurs » peuvent être migrées et exécutées dans différents environnements systèmes. Avant de plonger dans les principes derrière la technologie des conteneurs, il est essentiel de comprendre le concept de processus. La représentation statique d’un processus est un programme, généralement stocké silencieusement sur un disque. Une fois en cours d’exécution, il se transforme en la somme des données et des états à l’intérieur de l’ordinateur — sa représentation dynamique. La fonctionnalité principale de la technologie des conteneurs consiste à créer une « frontière » pour les processus en contraignant et en modifiant leurs comportements dynamiques.
Technologie des conteneurs Docker
Pour la plupart des conteneurs Linux, y compris Docker, la technologie Cgroups est principalement utilisée pour imposer des contraintes, tandis que la technologie Namespace constitue la méthode principale pour modifier la vue des processus. Imaginez que vous ayez un projet Docker en cours d’exécution sur un système d’exploitation Linux, par exemple Ubuntu 22.04. Créons un conteneur pour expérimenter :
$ docker run -it busybox /bin/sh
Cette commande Docker lance un conteneur basé sur l’image busybox et exécute une session shell interactive à l’intérieur.
docker run: Crée et démarre une nouvelle instance de conteneur.-i: Maintient STDIN ouvert même sans terminal attaché, permettant l’interaction avec le conteneur.-t: Assigne un pseudo-terminal ou un terminal, créant un environnement shell interactif./bin/sh: Spécifie la commande à exécuter au démarrage du conteneur, qui dans ce cas lance une session shell dans le conteneur.
Processus à l’intérieur du conteneur
Ainsi, la machine Ubuntu devient un hôte, et un conteneur exécutant /bin/sh y opère. Cet exemple et son principe sous-jacent devraient être familiers aux utilisateurs expérimentés de Docker. Si vous exécutez la commande ps à l’intérieur du conteneur, vous remarquerez quelque chose d’intrigant :
/ # ps
PID USER TIME COMMAND
1 root 0:00 /bin/sh
10 root 0:00 ps
Ici, le /bin/sh initial exécuté dans Docker est le processus numéro 1 (PID=1) à l’intérieur du conteneur, avec seulement deux processus en cours d’exécution. Cela implique que le /bin/sh et la commande ps que nous venons d’exécuter ont été isolés dans un environnement distinct de l’hôte.
Le mécanisme Namespace
Comment cela est-il réalisé ? Généralement, lorsqu’un programme /bin/sh s’exécute sur l’hôte, le système d’exploitation lui attribue un ID de processus, par exemple PID=100, qui l’identifie de manière unique. Lors de l’exécution de ce programme dans un conteneur Docker, Docker applique une « illusion » afin que le processus, qui est en réalité PID=100, croie qu’il est le premier processus (PID=1). Ce mécanisme manipule l’espace des processus des applications isolées, leur permettant de voir des ID de processus recalculés.
La technologie Namespace de Linux
L’utilisation des Namespaces est assez intéressante : ce n’est qu’un paramètre optionnel pour la création de nouveaux processus sous Linux. L’appel système pour créer des processus sous Linux est clone(), comme suit :
int pid = clone(main_function, stack_size, SIGCHLD, NULL);
Cet appel crée un nouveau processus et retourne son ID de processus, pid. Lors de l’utilisation de l’appel système clone() pour créer un nouveau processus, on peut spécifier l’argument CLONE_NEWPID :
int pid = clone(main_function, stack_size, CLONE_NEWPID | SIGCHLD, NULL);
Le nouveau processus créé « verra » alors un espace de processus frais dans lequel son PID est 1. Cette « illusion » ne change pas le PID réel dans l’espace de processus de l’hôte, qui reste la valeur réelle, par exemple 100.
Plusieurs Namespaces en action
L’exécution répétée de l’appel clone() ci-dessus créerait plusieurs PID Namespaces. Les processus d’application de chaque Namespace croient être le premier processus dans leur conteneur respectif, ignorant l’espace de processus réel de l’hôte ou les détails des autres PID Namespaces. Outre le PID Namespace, Linux propose les Namespaces Mount, UTS, IPC, Network et User pour « obscurcir » divers contextes de processus.
Mount Namespace
- Mount Namespace : Il permet aux processus isolés de voir uniquement les points de montage pertinents pour le Namespace actuel, ce qui signifie que les processus à l’intérieur du conteneur ignorent les autres points de montage sur l’hôte.
Network Namespace
- Network Namespace : Il fournit aux processus isolés une vue des périphériques réseau et des configurations spécifiques au Namespace actuel. Chaque Network Namespace possède ses propres périphériques réseau, adresses IP, tables de routage et numéros de port, séparés de l’hôte et des autres Namespaces.
Autres Namespaces
- UTS Namespace : Il isole le nom du nœud (hostname) et les informations de nom d’hôte réseau.
- IPC Namespace : Il segrège les ressources pour la communication inter-processus, telles que les files de messages et les sémaphores.
- User Namespace : Il isole les identifiants d’utilisateur et de groupe, permettant de mapper les ID d’utilisateurs conteneurisés à des ID différents sur l’hôte pour une sécurité renforcée.
Le principe d’implémentation des conteneurs Docker
C’est le principe fondamental d’implémentation des conteneurs Linux. Ainsi, le concept apparemment complexe des conteneurs Docker consiste essentiellement à spécifier un ensemble de paramètres Namespace lors de la création d’un processus conteneur. Par conséquent, le conteneur ne peut « voir » que les ressources, fichiers, périphériques, états ou configurations limités par le Namespace actuel, restant complètement ignorant de l’hôte et des programmes non liés.
Comparaison des conteneurs avec les machines virtuelles
Les conteneurs sont donc un type spécial de processus. En considérant l’idée d’allouer un espace indépendant pour les processus, les machines virtuelles viennent à l’esprit. Elles simulent le matériel via un logiciel Hypervisor, exécutant un système d’exploitation invité complet pour réaliser l’isolation des applications. En revanche, les conteneurs Docker réalisent l’isolation via les technologies Namespace et Cgroups tout en partageant le noyau du système d’exploitation hôte.
La virtualisation légère de Docker
Docker est souvent qualifié de technologie de virtualisation « légère » car il utilise directement les ressources de l’hôte sans avoir besoin de simuler du matériel ou d’exécuter un système d’exploitation supplémentaire. Cela entraîne des avantages significatifs par rapport aux machines virtuelles traditionnelles en termes de vitesse de démarrage, d’utilisation des ressources et de performances.
Conclusion
La technologie des conteneurs Docker fournit un environnement isolé mais léger pour les processus d’application grâce aux technologies Namespace et Cgroups. Cette technologie permet aux conteneurs de démarrer rapidement, de fonctionner efficacement et de maintenir l’isolation par rapport à l’hôte et aux autres conteneurs, ce qui en fait une technologie indispensable dans l’informatique moderne en nuage et les architectures de microservices.
Novita AI, la plateforme tout-en-un pour une créativité sans limites qui vous donne accès à plus de 100 API. De la génération d’images au traitement du langage, en passant par l’amélioration audio et la manipulation vidéo, avec un paiement à l’utilisation avantageux, elle vous libère des soucis de maintenance GPU tout en construisant vos propres produits. Essayez-la gratuitement.
