Maison  >  Article  >  Opération et maintenance  >  Une analyse approfondie de la superposition de fichiers Docker (exemples détaillés)

Une analyse approfondie de la superposition de fichiers Docker (exemples détaillés)

WBOY
WBOYavant
2022-01-28 17:09:333665parcourir

Cet article vous apporte des connaissances pertinentes sur la superposition de fichiers Docker. Cet article utilise un exemple de conteneur Docker pour décrire certains principes de la superposition de fichiers Docker. J'espère qu'il sera utile à tout le monde.

Une analyse approfondie de la superposition de fichiers Docker (exemples détaillés)

Préparation des connaissances

  • Docker utilise en fait certaines fonctionnalités du noyau Linux pour réaliser l'isolation des ressources. Le système de fichiers en fait partie, mais afin de rendre les ressources plus efficaces, Docker adopte une structure hiérarchique du système de fichiers. pour implémenter le système de fichiers du conteneur.
  • Personnellement, je pense que le principe ressemble un peu au concept d'univers parallèles. Certaines personnes croient qu'il existe des univers parallèles dans notre univers, c'est-à-dire que les différents choix que nous faisons répartiront différents univers et continueront à courir, c'est vous. sait nager. Se promener parmi ces univers parallèles. C'est quelque peu similaire ici. Après avoir empaqueté une image et l'avoir exécutée via Docker Run, un univers différent est en fait créé sur cette base. Au fur et à mesure que le conteneur continue de s'exécuter, le contenu du conteneur est le même que celui de l'image d'origine. Les choses connaîtront de nombreuses déviations et différences et formeront progressivement un univers qui leur est propre.

Système de fichiers Docker

Vous pouvez obtenir l'état de superposition du système de fichiers de chaque conteneur à partir de docker inspect [container-id] --format={{.GraphDriver}}

{map[LowerDir:/var/lib/docker/overlay2/52f456f455215e56b77087495a5d35323fbf1c0e0391f45349f386006c75865b-init/diff:/var/lib/docker/overlay2/e4b90240aa77212dde6499a49c421d26977ed9fe8a1f6fcbaaaf77d85c67654e/diff MergedDir:/var/lib/docker/overlay2/52f456f455215e56b77087495a5d35323fbf1c0e0391f45349f386006c75865b/merged UpperDir:/var/lib/docker/overlay2/52f456f455215e56b77087495a5d35323fbf1c0e0391f45349f386006c75865b/diff WorkDir:/var/lib/docker/overlay2/52f456f455215e56b77087495a5d35323fbf1c0e0391f45349f386006c75865b/work] overlay2}

Il existe principalement quatre types

LowerDir

Cela signifie que tous les conteneurs basés sur cette image pointeront vers le même système de fichiers, qui est la couche d'image. Tous les conteneurs utiliseront cette couche.

Alors, d'où vient cette couche ? Nous pouvons jeter un œil à l'image que nous utilisons

MergedDir

Il s'agit d'un conteneur différent qui combine la couche inférieure et la couche supérieure pour fournir le système de fichiers final dans le conteneur

UpperDir

Il s'agit d'enregistrer les opérations de différents conteneurs, puis grâce à la comparaison de la couche inférieure, une couche de fusion peut être générée

WorkDir

Pas encore compris en profondeur

Exemple

docker run -d alpine:latest

Afficher les informations du système de fichiers de la couche miroir

docker inspect alpine --format={{.GraphDriver}}
{map[MergedDir:/var/lib/docker/overlay2/e4b90240aa77212dde6499a49c421d26977ed9fe8a1f6fcbaaaf77d85c67654e/merged UpperDir:/var/lib/docker/overlay2/e4b90240aa77212dde6499a49c421d26977ed9fe8a1f6fcbaaaf77d85c67654e/diff WorkDir:/var/lib/docker/overlay2/e4b90240aa77212dde6499a49c421d26977ed9fe8a1f6fcbaaaf77d85c67654e/work] overlay2}

Notez qu'UpperDir est la couche supérieure de l'image, c'est-à-dire que nous pouvons apporter des modifications à ce niveau, ce qui affectera le conteneur créé plus tard

Affichez les informations du système de fichiers du conteneur

docker inspect 9a118484ba --format={{.GraphDriver}}
{map[LowerDir:/var/lib/docker/overlay2/3d3f32727c4f7867d43c1e61d635ac0ed22e95ff39c66240166dd6614b81fe14-init/diff:/var/lib/docker/overlay2/e4b90240aa77212dde6499a49c421d26977ed9fe8a1f6fcbaaaf77d85c67654e/diff MergedDir:/var/lib/docker/overlay2/3d3f32727c4f7867d43c1e61d635ac0ed22e95ff39c66240166dd6614b81fe14/merged UpperDir:/var/lib/docker/overlay2/3d3f32727c4f7867d43c1e61d635ac0ed22e95ff39c66240166dd6614b81fe14/diff WorkDir:/var/lib/docker/overlay2/3d3f32727c4f7867d43c1e61d635ac0ed22e95ff39c66240166dd6614b81fe14/work] overlay2}

Vous peut voir la couche inférieure du conteneur, c'est-à-dire dans la couche supérieure de l'image, les modifications que nous apportons au conteneur seront reflétées dans la couche supérieure et la couche fusionnée sera organisée et affichée dans le conteneur.

Nous pouvons utiliser la ligne de commande pour vérifier les modifications dans le système de fichiers du conteneur

docker diff 9a118484ba

Comme nous n'avons pas utilisé le conteneur, il n'y a plus de différence entre le conteneur et l'image maintenant

Nous démarrons un autre conteneur et le laissons dormir pendant 300 secondes. Allez ensuite dans le conteneur pour modifier certaines informations du fichier

# docker exec -it ca91bb /bin/sh

/ # echo "helloWorld" > /tmp/hello.txt

Vérifiez les modifications dans le système de fichiers du conteneur

docker diff ca91bbffb801

C /root
C /root/.ash_history
C /tmp
A /tmp/hello.txt

Vous pouvez voir que ces modifications que nous avons apportées au système de fichiers ont été enregistrées

Ces contenus sont en fait dans le répertoire d'UpperDir

tree -L 1 diff/

diff/
├── root
└── tmp2 directories, 0 files

Modifier le contenu du conteneur depuis l'hôte

  • D'après les expériences ci-dessus, nous pouvons savoir que la couche supérieure est le contenu ajouté, qui se reflète dans les modifications du conteneur en fusionnant avec la couche inférieure. Alors peut-on modifier directement la couche supérieure pour faire fonctionner le conteneur ?

    Nous ajoutons un répertoire demo dans le répertoire où se trouve upper et touchons un fichier dedans

    # tree -L 2 ./
    
    ./
    ├── demo
    │   └── mytest.log
    ├── root
    └── tmp
        └── hello.txt

    Voyons si nous pouvons voir le fichier que nous avons créé à partir du conteneur

    /demo # pwd
    /demo
    /demo # ls
    mytest.log

    Vous pouvez voir qu'il a pris effet, donc , si on veut initialiser ce conteneur, on peut directement supprimer tout le contenu de la couche supérieure.

Application

  • Trouver des traces d'installation de logiciels

    Au cours de projets précédents, les clients avaient toujours besoin de nous pour fournir le contenu que notre logiciel agent modifierait, mais nous n'avons jamais trouvé de meilleur moyen de le fournir aux clients. Grâce à l'application de ce fichier docker layered, nous pouvons déployer l'agent sur un conteneur, et nous pouvons alors découvrir clairement en un coup d'œil quels répertoires et fichiers le logiciel va modifier.

  • Restaurez rapidement le conteneur

  • Interagissez rapidement avec le système de fichiers du conteneur

  • Protégez le système de fichiers sous-jacent contre les dommages

  • Enregistrez l'espace hôte

Apprentissage recommandé : "Tutoriel vidéo Docker

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer