Le fonctionnement de Docker
Docker permet de gérer et administrer des conteneurs basé sur un principe de template de conteneur. La gestion de template de conteneur est un atout majeur de docker qui propose une riche variété de conteneurs pré-existants mais également grâce à la personnalisation, selon l'envie des utilisateurs, de ces environnements isolés.
Docker utilise les services fournis par le kernel linux et se base sur LXC (LinuX Containers) qui est l’implémentation de référence de conteneurs dans Linux. Voici quelques services que Docker utilise :
- cgroups
- apparmor / selinux
- namespaces
Je vais aussi parler des bibliothèques utilisées et mises à disposition par les développeurs de docker comme :
- libcontainer
- libswarm
- libchan
LXC - Linux Containers
LXC est un ensemble d'outils permettant de contrôler les "Linux Containers", un mécanisme léger de système virtuel. LXC implémente des systèmes virtuels complets en partant de chroot, en ajoutant des mécanismes de gestion des ressources et d'isolation à l'infrastructure de gestion de processus existante de Linux. Les Linux Containers (lxc) implémentent :
- La gestion de ressources via les "cgroups" ou "groupes de contrôle de processus" (implémentés via le système de fichiers /cgroup) ;
- L'isolation de ressources via les nouveaux drapeaux (flags) de l'appel système clone(2) (capable de créer plusieurs types de nouveaux "namespaces" ou espaces de noms pour des choses telles que les PID et le routage réseau) ;
- Plusieurs mécanismes d'isolation additionnels (tels que le drapeau -o newinstance du système de fichiers devpts).
Le paquet LXC combine ces mécanismes du noyau Linux pour fournir un conteneur en espace utilisateur, un système virtuel léger avec une isolation et un contrôle des ressources complets pour une application ou un système entier. Les Linux Containers prennent une approche complètement différente des technologies de virtualisation des hyperviseurs, qui ont débuté en bootant des systèmes virtuels séparés sur du matériel émulé et ensuite ont essayé de réduire leur surcharge (overhead) via la paravirtualisation que nous avons pu voir avec les hyperviseurs de type 1 et des mécanismes similaires. Au lieu d'améliorer l'efficacité d'une isolation complète, LXC se base sur un mécanisme efficace (la gestion de processus de Linux) et a ajouté l'isolation, résultant en un mécanisme de virtualisation évolutif et portable à la façon de chroot, capable de supporter simultanément des milliers de systèmes émulés sur un seul serveur, tout en fournissant des possibilités de virtualisation légère aux routeurs et aux smartphones.
LXC est suffisamment petit pour gérer facilement un conteneur avec de simples lignes de commandes et assez complet pour être utilisé pour d'autres besoins.
Cgroups
Les cgroups - groupes de contrôle - ont pour but de contrôler les ressources systèmes utilisées par un ou plusieurs processus. Les processus sous contrôle sont affectés dans des groupes sur lesquels agissent des contrôleurs de ressources. Chaque contrôleur gère un type de ressources :
- cpuset : allocation CPU (numéro CPU/core CPU).
- cpuacct : consommation CPU (nombre de cycles).
- memory : contrôle de la mémoire vive et de la mémoire swap.
- devices : contrôle l’accès aux périphériques.
- blkio : contrôle l’accès aux périphériques de type bloc (ex: disque dur).
- net_cls : contrôle l’accès aux périphériques réseau.
AppArmor
Security-Enhanced Linux
Namespaces
Il existe différents types d'espace de noms (ou namespaces) chaque type d'espace de noms s'applique à une ressource spécifique. Et, chaque espace de noms crée des barrières entre les processus. Ces obstacles peuvent être à différents niveaux. Voici quelques types d'espace de noms que docker utilise :
- pid : isole les processus (pid : Process ID).
- net : permet la gestion des interfaces réseaux (net : networking)
- ipc : gére les accès inter-processus (ipc : InterProcess Communication)
- mnt : gestion des points de montage (mnt : mount)
- uts : utilisé pour isoler le noyau et identificateurs de version (UTS : Unix Timesharing System)
Libcontainer
Libswarm
Libchan
Libchan est une bibliothèque réseau ultra-légère qui permet aux services réseaux de communiquer de la même manière que les goroutines communiquent en utilisant des canaux :
- Simple message passing
- Synchronisation pour la programmation parallèle
- Nesting : les canaux peuvent envoyer (vers) des canaux
- In-memory Go channel
- Unix socket
- Raw TCP
- TLS
- HTTP2/SPDY
- Websocket
0 commentaires:
Enregistrer un commentaire