Maison >Opération et maintenance >Docker >Quelle est la différence entre les conteneurs et les images dans Docker ?

Quelle est la différence entre les conteneurs et les images dans Docker ?

王林
王林avant
2020-11-12 16:16:542584parcourir

Quelle est la différence entre les conteneurs et les images dans Docker ?

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)

 10张图带你深入理解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.

Définition de l'image

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.

 10张图带你深入理解Docker容器和镜像

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.

sudo tree -L 1 /var/lib/docker/

/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.

 10张图带你深入理解Docker容器和镜像

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.

Définition du conteneur en cours 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.

 10张图带你深入理解Docker容器和镜像

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.

 10张图带你深入理解Docker容器和镜像     

我们可以通过运行以下命令来验证我们上面所说的: 

docker run ubuntu touch happiness.txt

即便是这个ubuntu容器不再运行,我们依旧能够在主机的文件系统上找到这个新文件。 

find / -name happiness.txt

/var/lib/docker/aufs/diff/860a7b...889/happiness.txt

Image Layer Definition

为了将零星的数据整合起来,我们提出了镜像层(image layer)这个概念。下面的这张图描述了一个镜像层,通过图片我们能够发现一个层并不仅仅包含文件系统的改变,它还能包含了其他重要信息。 

 10张图带你深入理解Docker容器和镜像     

元数据(metadata)就是关于这个层的额外信息,它不仅能够让Docker获取运行和构建时的信息,还包括父层的层次信息。需要注意,只读层和读写层都包含元数据。 

 10张图带你深入理解Docker容器和镜像     

除此之外,每一层都包括了一个指向父层的指针。如果一个层没有这个指针,说明它处于最底层。 

 10张图带你深入理解Docker容器和镜像     

Metadata Location: 
我发现在我自己的主机上,镜像层(image layer)的元数据被保存在名为”json”的文件中,比如说: 

/var/lib/docker/graph/e809f156dc985.../json

e809f156dc985...就是这层的id 

一个容器的元数据好像是被分成了很多文件,但或多或少能够在/var/lib/docker/containers/目录下找到,就是一个可读层的id。这个目录下的文件大多是运行时的数据,比如说网络,日志等等。 

全局理解(Tying It All Together)

现在,让我们结合上面提到的实现细节来理解Docker的命令。 

docker create

 10张图带你深入理解Docker容器和镜像     

docker create 命令为指定的镜像(image)添加了一个可读写层,构成了一个新的容器。注意,这个容器并没有运行。 

 10张图带你深入理解Docker容器和镜像     

docker start

 10张图带你深入理解Docker容器和镜像     

Docker start命令为容器文件系统创建了一个进程隔离空间。注意,每一个容器只能够有一个进程隔离空间。 

docker run

 10张图带你深入理解Docker容器和镜像     

看到这个命令,读者通常会有一个疑问:docker start 和 docker run命令有什么区别。 

Quelle est la différence entre les conteneurs et les images dans Docker ?

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.

docker ps

 10张图带你深入理解Docker容器和镜像

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.

docker ps –a

 10张图带你深入理解Docker容器和镜像

La commande docker ps –a listera tous les conteneurs, qu'ils soient en cours d'exécution ou arrêtés.

images docker

 10张图带你深入理解Docker容器和镜像 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 –a

 10张图带你深入理解Docker容器和镜像

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.

docker stop

 10张图带你深入理解Docker容器和镜像

La commande docker stop enverra un signal SIGTERM au conteneur en cours d'exécution, puis arrêtera tous les processus .

docker kill

 10张图带你深入理解Docker容器和镜像

La commande docker kill envoie un SIGKILL hostile à tous les processus exécutés dans le conteneur Signal.

docker pause

 10张图带你深入理解Docker容器和镜像

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.

docker rm

 10张图带你深入理解Docker容器和镜像

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.

docker rmi

 10张图带你深入理解Docker容器和镜像

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.

docker commit

 10张图带你深入理解Docker容器和镜像

La commande docker commit convertit la couche lecture-écriture du conteneur en lecture seule couche, donc Convertissez un conteneur en une image immuable.
 10张图带你深入理解Docker容器和镜像

docker build

 10张图带你深入理解Docker容器和镜像

La commande docker build est très intéressante, elle exécutera plusieurs commandes à plusieurs reprises.

Quelle est la différence entre les conteneurs et les images dans Docker ?

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.

docker exec

 10张图带你深入理解Docker容器和镜像

La commande docker exec exécutera un nouveau processus dans le conteneur en cours d'exécution.

docker inspect ou

 10张图带你深入理解Docker容器和镜像

La commande docker inspect extraira le niveau supérieur du métadonnées de conteneur ou d’image.

docker save

 10张图带你深入理解Docker容器和镜像

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.

docker export

 10张图带你深入理解Docker容器和镜像

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).

docker history

 10张图带你深入理解Docker容器和镜像

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!

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