Qu’est-ce qu’une image de conteneur ?

Les conteneurs sont une partie essentielle des opérations informatiques d’aujourd’hui. UNE image du conteneur contient une application packagée, ainsi que ses dépendances, et des informations sur les processus qu’elle exécute lorsqu’elle est lancée.
Vous créez des images de conteneur en fournissant un ensemble d’instructions spécialement formatées, soit sous forme de validations dans un registre, soit sous forme de fichier Docker. Par exemple, ce Dockerfile crée un conteneur pour une application Web PHP :
FROM registry.access.redhat.com/ubi8/ubi:8.1RUN yum --disableplugin=subscription-manager -y module enable php:7.3
&& yum --disableplugin=subscription-manager -y install httpd php
&& yum --disableplugin=subscription-manager clean allADD index.php /var/www/html
RUN sed -i 's/Listen 80/Listen 8080/' /etc/httpd/conf/httpd.conf
&& sed -i 's/listen.acl_users = apache,nginx/listen.acl_users =/' /etc/php-fpm.d/www.conf
&& mkdir /run/php-fpm
&& chgrp -R 0 /var/log/httpd /var/run/httpd /run/php-fpm
&& chmod -R g=u /var/log/httpd /var/run/httpd /run/php-fpmEXPOSE 8080
USER 1001
CMD php-fpm & httpd -D FOREGROUND
Chaque instruction de ce fichier ajoute un couche à l’image du conteneur. Chaque couche ajoute uniquement la différence par rapport à la couche située en dessous, puis toutes ces couches sont empilées pour former une image de conteneur en lecture seule.
Contents
Comment ça marche?
Vous devez savoir certaines choses sur les images de conteneur, et il est important de comprendre les concepts dans cet ordre :
- Systèmes de fichiers de l’Union
- Copie sur écriture
- Systèmes de fichiers superposés
- Instantanés
Systèmes de fichiers de l’Union (Aufs)
Le système de fichiers Union (UnionFS) est intégré au noyau Linux et permet de fusionner le contenu d’un système de fichiers avec le contenu d’un autre, tout en gardant le contenu « physique » séparé. Le résultat est un système de fichiers unifié, même si les données sont en fait structurées en branches.
L’idée ici est que si vous avez plusieurs images avec des données identiques, au lieu de les copier à nouveau, elles sont partagées en utilisant quelque chose appelé un couche.
Chaque couche est un système de fichiers qui peut être partagé entre plusieurs conteneurs, par exemple, la couche de base httpd est l’image officielle d’Apache et peut être utilisée dans n’importe quel nombre de conteneurs. Imaginez l’espace disque que nous venons d’économiser puisque nous utilisons la même couche de base pour tous nos conteneurs.
Ces couches d’images sont toujours en lecture seule, mais lorsque nous créons un nouveau conteneur à partir de cette image, nous ajoutons une fine couche inscriptible par-dessus. Cette couche accessible en écriture est l’endroit où vous créez/modifiez/supprimez ou effectuez d’autres modifications requises pour chaque conteneur.
Copie sur écriture
Lorsque vous démarrez un conteneur, il semble que le conteneur possède son propre système de fichiers. Cela signifie que chaque conteneur que vous exécutez dans le système a besoin de sa propre copie du système de fichiers. Cela ne prendrait-il pas beaucoup d’espace disque et prendrait-il également beaucoup de temps pour que les conteneurs démarrent ? Non, car chaque conteneur n’a pas besoin de sa propre copie du système de fichiers !
Les conteneurs et les images utilisent un mécanisme de copie sur écriture pour y parvenir. Au lieu de copier des fichiers, la stratégie de copie sur écriture partage la même instance de données avec plusieurs processus et copie uniquement lorsqu’un processus doit modifier ou écrire des données. Tous les autres processus continueraient à utiliser les données d’origine. Avant toute opération d’écriture dans un conteneur en cours d’exécution, une copie du fichier à modifier est placée sur la couche inscriptible du conteneur. C’est là que le écrivez se déroule. Maintenant tu sais pourquoi ça s’appelle copie sur écriture.
Cette stratégie optimise à la fois l’utilisation de l’espace disque de l’image et les performances des heures de démarrage des conteneurs et fonctionne conjointement avec UnionFS.
Système de fichiers de superposition
Une superposition se trouve au-dessus d’un système de fichiers existant, combine une arborescence de répertoires supérieur et inférieur et les présente comme un seul répertoire. Ces répertoires sont appelés couches. La couche inférieure reste inchangée. Chaque couche n’ajoute que la différence (le différence, dans la terminologie informatique) de la couche en dessous, et ce processus d’unification est appelé un monture syndicale.
Le répertoire le plus bas ou un calque d’image est appelé répertoire inférieur, et le répertoire supérieur est appelé répertoire supérieur. La dernière couche superposée ou unifiée est appelée fusionné.
La terminologie courante se compose de ces définitions de couche :
- La couche de base est l’endroit où se trouvent les fichiers de votre système de fichiers. En termes d’images de conteneur, cette couche serait votre image de base.
- La couche de superposition est souvent appelée la couche conteneur, car toutes les modifications apportées à un conteneur en cours d’exécution, comme l’ajout, la suppression ou la modification de fichiers, sont écrites dans cette couche accessible en écriture. Toutes les modifications apportées à cette couche sont stockées dans la couche suivante et constituent un syndicat vue des couches Base et Diff.
- Le calque Diff contient toutes les modifications apportées au calque Overlay. Si vous écrivez quelque chose qui se trouve déjà dans la couche de base, le système de fichiers de superposition copie le fichier dans la couche Diff et apporte les modifications que vous aviez l’intention d’écrire. C’est ce qu’on appelle un copie sur écriture.
Les conteneurs peuvent créer, gérer et distribuer des modifications dans le cadre de leur système de fichiers de conteneur à l’aide de couches et de pilotes graphiques. Mais travailler avec des pilotes graphiques est vraiment compliqué et sujet aux erreurs. Les SnapShotters sont différents des pilotes graphiques, car ils n’ont aucune connaissance des images ou des conteneurs.
Les snapshots fonctionnent de manière très similaire à Git, comme le concept d’arborescence et le suivi des modifications apportées aux arborescences pour chaque commit. UNE instantané représente un état du système de fichiers. Les instantanés ont des relations parent-enfant à l’aide d’un ensemble de répertoires. UNE diff peut être prises entre un parent et son instantané pour créer une couche.
Le Snapshotter fournit une API pour l’allocation, la création d’instantanés et le montage de systèmes de fichiers abstraits en couches.
Conclure
Vous avez maintenant une bonne idée de ce que sont les images de conteneur et de la façon dont leur approche en couches rend les conteneurs portables. Ensuite, je couvrirai les environnements d’exécution et les composants internes des conteneurs.
Cet article est basé sur un techniquement article et a été adapté avec permission.