Cet article présente la différence entre les conteneurs et les images dans Docker, j'espère qu'il pourra vous aider.
(Tutoriel recommandé : Tutoriel Docker)
Quand je connaissais encore peu la technologie Docker, j'ai découvert que je j'ai compris que les commandes de Docker sont très difficiles. J'ai donc passé quelques semaines à apprendre le fonctionnement de Docker, ou plus précisément, le système de fichiers Union, puis en repensant aux commandes Docker, tout s'est mis en place, extrêmement simple.
Digression : Personnellement, la meilleure façon de maîtriser une technologie et de l'utiliser de manière rationnelle est d'avoir une compréhension approfondie des principes de fonctionnement derrière la technologie. Habituellement, la naissance d'une nouvelle technologie s'accompagne souvent d'un battage médiatique et d'un battage médiatique, ce qui rend difficile pour les utilisateurs de voir la véritable nature de la technologie. Au contraire, les nouvelles technologies inventent toujours de nouveaux termes ou métaphores pour aider à informer le
Ceci est très utile au début, mais cela met une couche de papier de verre sur le principe de la technologie, ce qui ne permet pas aux utilisateurs de maîtriser le véritable sens de la technologie à un stade ultérieur.
Git est un bon exemple. Avant, je ne savais pas bien utiliser Git, j'ai donc passé du temps à apprendre les principes de Git. Ce n'est qu'à ce moment-là que j'ai vraiment compris l'utilisation de Git. Je crois fermement que seuls ceux qui comprennent vraiment les composants internes de Git peuvent maîtriser cet outil.
L'image est la perspective unifiée d'un groupe de couches en lecture seule. Peut-être que cette définition est un peu difficile à comprendre. L'image suivante peut aider les lecteurs à comprendre la définition du miroir.
De gauche à droite, nous voyons plusieurs calques en lecture seule, qui se chevauchent. À l’exception du calque inférieur, tous les autres calques auront un pointeur pointant vers le calque suivant. Ces couches sont des détails d'implémentation dans Docker et sont accessibles sur le système de fichiers de l'hôte (Note du traducteur : la machine exécutant Docker). La technologie du système de fichiers Union peut intégrer différentes couches dans un seul système de fichiers, fournissant une perspective unifiée pour ces couches, cachant ainsi l'existence de plusieurs couches. Du point de vue de l'utilisateur, un seul fichier existe dans le système. Nous pouvons voir à quoi ressemble cette perspective sur le côté droit de l’image.
Vous pouvez trouver de la documentation pour ces couches sur votre système de fichiers hôte. Notez que ces couches ne sont pas visibles à l’intérieur d’un conteneur en cours d’exécution. Sur mon hôte, j'ai constaté qu'ils existent dans le répertoire /var/lib/docker/aufs.
/var/lib/docker/ ├── aufs ├── containers ├── graph ├── init ├── linkgraph.db ├── repositories-aufs ├── tmp ├── trust └── volumes 7 directories, 2 files
Définition du conteneur
La définition du conteneur (conteneur) est presque exactement la même que celle d'image (image). C'est aussi une perspective unifiée d'un groupe de calques. La seule différence est que la couche supérieure du conteneur est lisible et inscriptible.
Les lecteurs attentifs peuvent constater que la définition d'un conteneur ne mentionne pas si le conteneur est en cours d'exécution. Oui, c'est intentionnel. C'est cette découverte qui m'a aidé à comprendre une grande partie de ma confusion.
Points clés : conteneur = image + calque lisible. Et la définition d'un conteneur ne précise pas s'il faut exécuter le conteneur.
Ensuite, nous discuterons des conteneurs d'exécution.
Un conteneur en cours d'exécution est défini comme un système de fichiers unifié lisible et inscriptible plus un espace de processus isolé et les processus qu'il contient. L'image ci-dessous montre un conteneur en cours d'exécution.
C'est la technologie d'isolation du système de fichiers qui fait de Docker une technologie prometteuse. Un processus dans un conteneur peut modifier, supprimer ou créer des fichiers, et ces modifications affecteront la couche de lecture-écriture. L'image ci-dessous illustre ce comportement.
我们可以通过运行以下命令来验证我们上面所说的:
docker run ubuntu touch happiness.txt
即便是这个ubuntu容器不再运行,我们依旧能够在主机的文件系统上找到这个新文件。
/var/lib/docker/aufs/diff/860a7b...889/happiness.txt
Image Layer Definition
为了将零星的数据整合起来,我们提出了镜像层(image layer)这个概念。下面的这张图描述了一个镜像层,通过图片我们能够发现一个层并不仅仅包含文件系统的改变,它还能包含了其他重要信息。
元数据(metadata)就是关于这个层的额外信息,它不仅能够让Docker获取运行和构建时的信息,还包括父层的层次信息。需要注意,只读层和读写层都包含元数据。
除此之外,每一层都包括了一个指向父层的指针。如果一个层没有这个指针,说明它处于最底层。
Metadata Location:
我发现在我自己的主机上,镜像层(image layer)的元数据被保存在名为”json”的文件中,比如说:
/var/lib/docker/graph/e809f156dc985.../json
e809f156dc985...就是这层的id
一个容器的元数据好像是被分成了很多文件,但或多或少能够在/var/lib/docker/containers/
现在,让我们结合上面提到的实现细节来理解Docker的命令。
docker create 命令为指定的镜像(image)添加了一个可读写层,构成了一个新的容器。注意,这个容器并没有运行。
Docker start命令为容器文件系统创建了一个进程隔离空间。注意,每一个容器只能够有一个进程隔离空间。
看到这个命令,读者通常会有一个疑问:docker start 和 docker run命令有什么区别。
Comme vous pouvez le voir sur l'image, la commande docker run crée d'abord un conteneur à l'aide de l'image, puis exécute le conteneur. Cette commande est très pratique et masque les détails des deux commandes, mais d'un autre côté, il est facile pour les utilisateurs de se méprendre.
Digression : Poursuivant notre sujet précédent sur Git, je pense que la commande docker run est similaire à la commande git pull. La commande git pull est une combinaison de git fetch et git merge. De même, docker run est une combinaison de docker create et docker start.
La commande docker ps listera tous les conteneurs en cours d'exécution. Cela masque l'existence de conteneurs non exécutés. Si nous voulons trouver ces conteneurs, nous devons utiliser la commande suivante.
La commande docker ps –a listera tous les conteneurs, qu'ils soient en cours d'exécution ou arrêtés.
La commande
images docker listera toutes les images de niveau supérieur. En fait, nous n'avons ici aucun moyen de faire la distinction entre un miroir et une couche en lecture seule, nous proposons donc une mise en miroir de niveau supérieur. Seule l'image utilisée lors de la création du conteneur ou l'image directement extraite peut être appelée image de niveau supérieur, et plusieurs calques d'image sont cachés sous chaque image de niveau supérieur.
docker images –une commande répertorie toutes les images, qui peut également être considérée comme listant toutes les images disponibles. . Si vous souhaitez afficher tous les calques sous un certain identifiant d'image, vous pouvez utiliser l'historique du Docker pour l'afficher.
La commande docker stop enverra un signal SIGTERM au conteneur en cours d'exécution, puis arrêtera tous les processus .
La commande docker kill envoie un SIGKILL hostile à tous les processus exécutés dans le conteneur Signal.
Les commandes docker stop et docker kill enverront des signaux UNIX au processus en cours d'exécution, docker Le La commande pause est différente. Elle utilise les caractéristiques des groupes de contrôle pour suspendre l'espace de processus en cours d'exécution. Vous pouvez trouver les principes internes spécifiques ici : www.kernel.org/doc/Doc..., mais l'inconvénient de cette méthode est que l'envoi d'un signal SIGTSTP n'est pas assez simple pour que le processus le comprenne, de sorte qu'il ne peut pas tout arrêter. processus.
La commande docker rm supprimera la couche de lecture-écriture qui constitue le conteneur. Notez que cette commande ne peut être exécutée que sur des conteneurs non en cours d'exécution.
La commande docker rmi supprimera un calque en lecture seule qui constitue l'image. Vous ne pouvez utiliser docker rmi que pour supprimer la couche de niveau supérieur (qui peut également être considérée comme un miroir). Vous pouvez également utiliser le paramètre -f pour forcer la suppression de la couche intermédiaire en lecture seule.
La commande docker commit convertit la couche lecture-écriture du conteneur en lecture seule couche, donc Convertissez un conteneur en une image immuable.
La commande docker build est très intéressante, elle exécutera plusieurs commandes à plusieurs reprises.
Comme nous pouvons le voir sur la figure ci-dessus, la commande build obtient l'image selon l'instruction FROM dans le fichier Dockerfile, puis à plusieurs reprises 1) exécutez ( créer et démarrer), 2) Modifier, 3) Valider. Chaque étape de la boucle génère un nouveau calque, donc de nombreux nouveaux calques sont créés.
La commande docker exec exécutera un nouveau processus dans le conteneur en cours d'exécution.
La commande docker inspect extraira le niveau supérieur du métadonnées de conteneur ou d’image.
La commande docker save créera un fichier compressé de l'image, qui peut être stocké sur un autre hôte Utilisé sur Docker. Contrairement à la commande d'exportation, cette commande enregistre les métadonnées pour chaque couche. Cette commande ne prend effet que sur les images.
La commande docker export crée un fichier tar et supprime les métadonnées et les couches inutiles, intègre plusieurs couches dans un seul calque et enregistre uniquement le contenu vu depuis la perspective unifiée actuelle (Note du traducteur : le conteneur après expoxt est ensuite importé dans Docker, et une seule image peut être vue via la commande docker images –tree ; l'image après l'enregistrement est différente , il peut voir l'image historique de cette image).
La commande docker history génère de manière récursive l'image historique de l'image spécifiée.
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!