Article
· Jan 30 5m de lecture

Container - Qu'est-ce qu'une image Docker?

Qu'est-ce qu'une image Docker?

Dans ce deuxième article sur les principes fondamentaux des conteneurs, nous examinons ce que sont les images de conteneurs.

Une image Docker est simplement une représentation binaire d'un conteneur.

Un conteneur en cours d'exécution ou simplement un conteneur est l'état d'exécution de l'image du conteneur associée.

Pour plus d'information, n'hésitez pas à lire l'article qui explique ce qu'est un conteneur.

Les images de conteneurs se composent d'un substrat de base du système d'exploitation et de tous les logiciels dont nous avons besoin pour exécuter notre service. J'utilise le terme service pour une « solution de conteneur » donnée comme description générique d'une solution logicielle enveloppée dans un conteneur. Je fais cela car je pourrais faire référence à un autre type de "solutions d'application" ou de composants comme un simple serveur Web, un point de terminaison REST un peu plus compliqué ou une solution monolithique entièrement développée en passe de moderniser le cycle de vie du développement logiel (SDLC) d'une intégration continue (CI). Pipeline de provisionnement /CD. Dans une architecture cloud native et composable, qui peut intégrer des microservices ; « service » semble alors être un terme plus proche.

On peut considérer une image de conteneur comme celle d'un package VMDK, OVA, OVF, QEMU, AWS AMI, etc., cependant, les images de conteneur sont différentes avec des caractéristiques intéressantes.

Avec les images conteneurs, nous avons la notion d’image parent-enfant ou dérivée. Techniquement, la notion est similaire à celle des instantanés (snapshots) : des blocs de fichiers sont ajoutés à une image existante. On se retrouve avec une hiérarchie d’images très utile. Les conteneurs utilisent des types de systèmes de fichiers Union-FS qui nous aident dans la hiérarchie et le dépôt de couches supplémentaires.

Il y a des avantages évidents à organiser les images en arborescence (voir le schéma ci-dessous), on peut tous cueillir les fruits qu'on aime :) et bien sûr l'un des effets est qu'on peut les partager à chaque niveau.

Une autre façon de considérer les images conteneurs et le processus de création d’images est que cela ressemble beaucoup à l’utilisation d’un langage orienté objet. C'est l'environnement OO des administrateurs système, ou des ingénieurs DevOps devrais-je dire, car nous héritons d'une image avec toutes ses propriétés et nous la spécifions davantage. Nous avons également la possibilité de remplacer les composants hérités (pensez à un ancien fichier de bibliothèque avec une vulnérabilité qui doit être corrigée). Si nous imaginons cette arborescence d'images héritées ou dérivées, nous saurions (et les outils de conteneurs peuvent nous le dire) dans quelle image il y a un problème ou une vulnérabilité. Le problème peut être rapidement résolu au niveau de cette image particulière, et toutes les images dépendantes peuvent alors hériter des avantages de cette image fixe en amont. Sur le plan opérationnel, l'héritage automatisé est réalisé simplement par un processus de reconstruction. L'analogie orientée objet ne s'arrête pas ici aux images mais s'étend au conteneur en cours d'exécution. Une image est comme une définition de classe, tandis qu'un conteneur (cf l'article précédent) est l’instanciation – l’objet – d’une image.

De ce qui précède, nous déduisons qu'un autre avantage de la structure arborescente est que nous pouvons nous concentrer sur chaque niveau ou image pour le personnaliser.

Couches

Une autre caractéristique d’une image conteneur est qu’elle est généralement composée de plusieurs couches.

Que sont les couches ? 

Les couches sont essentiellement des fichiers générés en exécutant certaines commandes.
Vous pouvez afficher toutes les couches du répertoire dans lequel Docker contient ses artefacts, qui se trouve sous le répertoire racine de Docker, par défaut /var/lib/docker/.

Le concept de couches est intelligent car elles peuvent être réutilisées par plusieurs images, ce qui permet d'économiser sur les besoins de stockage et permet de créer de nouvelles images et de les extraire beaucoup plus rapidement car elles sont réutilisées plutôt que reconstruites ou extraites à nouveau. Cela améliore également l'intégrité de toutes vos images.

Les couches sont également appelées images intermédiaires. Lorsque toutes les images intermédiaires créées par le processus de création sont référencées ensemble via le nom principal et la nomenclature de balise utilisée, nous avons alors ou sommes en train de traiter l'image du conteneur.

Chaque conteneur que nous exécutons possède une couche supérieure en lecture-écriture (voir l'image ci-dessous) avec une série de couches en lecture seule en dessous. Toutes ces couches en lecture seule sont le résultat de commandes exécutées lors de la construction du conteneur.

                                                                            

La raison pour laquelle les conteneurs sont appelés éphémères est que, généralement, lorsque nous arrêtons un conteneur, nous le jetons et cette couche supérieure de lecture-écriture est perdue à jamais. Cependant, avant de supprimer le conteneur, vous pouvez valider vos modifications. L'opération de validation enregistrerait cette couche supérieure en lecture-écriture dans une couche en lecture seule pour la prochaine exécution du conteneur. En fait, vous disposez maintenant d'un nouveau conteneur et vous êtes généralement invité à l'enregistrer avec un nouveau nom et une nouvelle balise.

Pour résumer, Docker, le moteur de conteneurs le plus utilisé et la société qui nous a permis à tous d'utiliser facilement les conteneurs, a ajouté une abstraction très intuitive aux API du noyau de bas niveau qui s'occupe également du packaging de la solution. Il s'agit d'un package spécial (l'image) car il est exécutable. Docker offre une interaction naturelle avec le Docker Engine (dockerd) via une simple API REST et une CLI client intuitive qui nous permet de gérer tout ce qui concerne les conteneurs.

Docker nous aide à :

  • les exécuter
    • $ docker run
  • les sauvegarder, les stocker et les récupérer
    • $ docker commit | push | pull 
  • les créer ou les construire
    • $ docker build 

et ajoutent beaucoup plus de valeur à l'ensemble de « l'expérience du conteneur ».

Dans le prochain article, je couvrirai le processus de construction.
En attendant, bonne exploration des images prédéfinies sur Docker Hub.

Discussion (0)1
Connectez-vous ou inscrivez-vous pour continuer