Je suis nouveau sur Docker et j'essaie de comprendre exactement ce qu'est une image Docker . Chaque définition unique d'une image Docker utilise le terme «couche», mais ne semble pas définir ce que l'on entend par couche .
À partir de la documentation officielle de Docker :
Nous avons déjà vu que les images Docker sont des modèles en lecture seule à partir desquels les conteneurs Docker sont lancés. Chaque image se compose d'une série de couches. Docker utilise les systèmes de fichiers union pour combiner ces couches en une seule image. Les systèmes de fichiers Union permettent aux fichiers et répertoires de systèmes de fichiers séparés, appelés branches, d'être superposés de manière transparente, formant un seul système de fichiers cohérent.
Alors je demande, qu'est-ce qu'une couche (exactement); quelqu'un peut-il en donner quelques exemples concrets? Et comment ces couches «s'emboîtent-elles» pour former une image?
https://labs.ctl.io/caching-docker-images/
) est rompu. Quelqu'un a-t-il des suggestions pour un remplacement?Une image de conteneur Docker est créée à l'aide d'un dockerfile . Chaque ligne d'un fichier docker crée un calque. Prenons l'exemple factice suivant:
Cela créera une image finale où le nombre total de couches sera X + 3
la source
Ils ont le plus de sens pour moi avec un exemple ...
Examen des couches de votre propre construction avec Docker Diff
Prenons un exemple artificiel de Dockerfile:
Chacune de ces
dd
commandes génère un fichier de 1 Mo sur le disque. Permet de construire l'image avec un indicateur supplémentaire pour enregistrer les conteneurs temporaires:Dans la sortie, vous verrez chacune des commandes en cours d'exécution se produire dans un conteneur temporaire que nous conservons maintenant au lieu de supprimer automatiquement:
Si vous exécutez un
docker diff
sur chacun de ces ID de conteneur, vous verrez quels fichiers ont été créés dans ces conteneurs:Chaque ligne précédée d'un signe
A
ajoute le fichier,C
indique une modification apportée à un fichier existant etD
indique une suppression.Voici la partie TL; DR
Chacun de ces systèmes de fichiers de conteneur diffs ci-dessus va dans une "couche" qui est assemblée lorsque vous exécutez l'image en tant que conteneur. Le fichier entier se trouve dans chaque couche lorsqu'il y a un ajout ou une modification, de sorte que chacune de ces
chmod
commandes, malgré le simple changement d'un bit d'autorisation, entraîne la copie du fichier entier dans la couche suivante. Le fichier supprimé / data / one est toujours dans les couches précédentes, 3 fois en fait, et sera copié sur le réseau et stocké sur le disque lorsque vous tirez l'image.Examen des images existantes
Vous pouvez voir les commandes qui entrent dans la création des couches d'une image existante avec la
docker history
commande. Vous pouvez également exécuter undocker image inspect
sur une image et voir la liste des couches sous la section RootFS.Voici l'historique de l'image ci-dessus:
Les couches les plus récentes sont répertoriées en haut. À noter, il y a deux couches en bas qui sont assez anciennes. Ils proviennent de l'image busybox elle-même. Lorsque vous créez une image, vous héritez de tous les calques de l'image que vous spécifiez dans la
FROM
ligne. Des couches sont également ajoutées pour modifier les métadonnées de l'image, comme laCMD
ligne. Ils prennent à peine de la place et servent davantage à enregistrer les paramètres qui s'appliquent à l'image que vous exécutez.Pourquoi des couches?
Les couches ont quelques avantages. Premièrement, ils sont immuables. Une fois créé, ce calque identifié par un hachage sha256 ne changera jamais. Cette immuabilité permet aux images de se construire en toute sécurité et de se séparer les unes des autres. Si deux fichiers docker ont le même ensemble initial de lignes et sont construits sur le même serveur, ils partageront le même ensemble de couches initiales, économisant de l'espace disque. Cela signifie également que si vous reconstruisez une image, avec seulement les dernières lignes du Dockerfile subissant des modifications, seules ces couches doivent être reconstruites et le reste peut être réutilisé à partir du cache de couches. Cela peut accélérer la reconstruction des images du docker.
À l'intérieur d'un conteneur, vous voyez le système de fichiers image, mais ce système de fichiers n'est pas copié. En plus de ces couches d'image, le conteneur monte sa propre couche de système de fichiers en lecture-écriture. Chaque lecture d'un fichier passe par les couches jusqu'à ce qu'elle atteigne une couche qui a marqué le fichier pour suppression, a une copie du fichier dans cette couche, ou la lecture manque de couches à rechercher. Chaque écriture apporte une modification dans la couche lecture-écriture spécifique au conteneur.
Réduire le gonflement de la couche
L'un des inconvénients des couches est la création d'images qui dupliquent des fichiers ou expédient des fichiers supprimés dans une couche ultérieure. La solution consiste souvent à fusionner plusieurs commandes en une seule
RUN
commande. En particulier, lorsque vous modifiez des fichiers existants ou supprimez des fichiers, vous souhaitez que ces étapes s'exécutent dans la même commande où elles ont été créées pour la première fois. Une réécriture du Dockerfile ci-dessus ressemblerait à ceci:Et si vous comparez les images résultantes:
Simplement en fusionnant quelques lignes dans l'exemple artificiel, nous avons obtenu le même contenu résultant dans notre image et avons réduit notre image de 5 Mo au fichier de 1 Mo que vous voyez dans l'image finale.
la source
Depuis Docker v1.10, avec l'introduction du stockage adressable de contenu, la notion de «couche» est devenue assez différente. Les calques n'ont aucune notion d'image ou d'appartenance à une image, ils deviennent simplement des collections de fichiers et de répertoires qui peuvent être partagés entre les images. Les couches et les images se sont séparées.
Par exemple, sur une image construite localement à partir d'une image de base, disons
ubuntu:14.04
, ladocker history
commande donne la chaîne d'images, mais certains des ID d'image seront affichés comme `` manquants '' car l'historique de construction n'est plus chargé. Et les couches qui composent ces images peuvent être trouvées viaLe contenu de la couche est stocké dans
/var/lib/docker/aufs/diff
si la sélection du pilote de stockage estaufs
. Mais les couches sont nommées avec un ID de cache généré aléatoirement, il semble que le lien entre une couche et son ID de cache n'est connu que de Docker Engine pour des raisons de sécurité. Je cherche toujours un moyen de le savoirCe blog a fourni beaucoup d'informations.
la source
Selon les spécifications d'image de Docker via le projet Moby :
Donc, essentiellement, une couche n'est qu'un ensemble de modifications apportées au système de fichiers.
la source
"Each [Docker] layer is a set of filesystem changes."
(En supposant que cela soit vrai.) Pour une raison quelconque, je n'ai pas compris ce point fondamental lors de la lecture de nombreux autres documents / blogs / Q + A's / etc, et je suppose que la limitation était la leur et non la mienne. Quoi qu'il en soit, bravo Aditya pour être entré dans le vif du sujet.Je pense que le document officiel donne une explication assez détaillée: https://docs.docker.com/engine/userguide/storagedriver/imagesandcontainers/ .
(source: docker.com )
Une image se compose de nombreuses couches qui sont généralement générées à partir de Dockerfile, chaque ligne de Dockerfile créera une nouvelle couche et le résultat est une image, qui est indiquée par le formulaire
repo:tag
, commeubuntu:15.04
.Pour plus d'informations, veuillez lire la documentation officielle ci-dessus.
la source
Merci @David Castillo pour les informations utiles . Je pense que le calque est un changement binaire ou une instruction d'une image qui peut être fait ou défait facilement. Ils sont effectués étape par étape, ce qui équivaut à un calque sur un calque, nous appelons donc «calque».
Pour plus d'informations, vous pouvez voir "l'historique du docker" comme ceci:
la source
Ma compréhension personnelle est que nous pouvons comparer la couche docker à github commit. Pour votre image de base (votre nouveau référentiel maître), vous effectuez plusieurs commits, chaque commit change votre statut de maître, c'est la même chose dans le menu fixe, chaque couche effectue une opération basée sur la couche intermédiaire précédente. Et puis, cette couche devient une nouvelle couche intermédiaire à la couche suivante.
la source
J'avais l'habitude de penser qu'ils sont comme des différences sur les couches précédentes. Après avoir lu certaines des réponses ici, je n'étais pas si sûr; ils sont décrits comme des ensembles de modifications du système de fichiers . J'ai écrit des fichiers Docker pour montrer qu'ils ressemblent plus à des diffs, c'est-à-dire qu'ils dépendent vraiment des couches précédentes.
Compte tenu de ces deux fichiers Docker
et
on s'attendrait au même ensemble de couches s'il s'agissait simplement de modifications du système de fichiers, mais ce n'est pas le cas:
et
Vous pouvez voir comment, même si les modifications apportées au système de fichiers sont les mêmes dans les deux cas, l'ordre est important.
la source