Comprendre le processus que Docker utilise pour stocker des données via des images et des conteneurs vous aidera à mieux concevoir vos applications Docker. Les images Docker sont comme des modèles tandis que les conteneurs Docker sont les instances de course créées à partir de ces modèles. Docker utilise une approche en couches pour stocker des images et des conteneurs.
Images et couches
Une image Docker est créée à partir de plusieurs couches. Si nous prenons un exemple de dockerfile, chaque instruction est convertie en couche. Voici un simple dockerfile:
Chaque ligne du dockerfile ci-dessus créera une couche. L'énoncé de la recherche recherchera le nœud: 6.9.2 Image dans le registre local. S'il ne le trouve pas là-bas, il le téléchargera à partir du Docker Hub. Alors docker créera la première couche. L'instruction de copie suivante ajoute le serveur.Fichier JS à l'image en deuxième couche. La dernière couche exécute un nœud.Application JS. Toutes ces couches sont empilées les unes sur les autres. Chaque couche supplémentaire est ajoutée comme une différence par rapport à la couche avant elle.
Conteneurs et couches
Les conteneurs sont créés à partir d'images. Lorsqu'un conteneur est créé à partir d'une image, une fine couche de lecture / écriture est placée sur l'image (notez que les calques d'image sont immuables, les couches de conteneur ne le sont pas). Toute modification apportée au conteneur est mise sur cette couche de lecture / écriture pendant la durée de vie du conteneur. Lorsqu'un conteneur est supprimé, la couche de lecture / écriture mince associée est supprimée. Cela signifie que plusieurs conteneurs peuvent partager la même image. Chaque couche de conteneur conservera ses propres données en toute sécurité au-dessus de l'image Docker.
Images et conteneurs
Essayons un exemple simple. Vous pouvez utiliser la commande docker images pour trouver toutes les images:
Taille de la balise du référentiel |
Et la commande docker ps pour trouver des conteneurs:
Commande d'image d'ID de conteneur Image Créé les noms de ports d'état |
Ceci est une nouvelle installation de Docker. Il n'y a donc pas d'image ou de conteneur présent. Vous pouvez exécuter le nœud docker run -it: 6.9.2 commande pour démarrer un conteneur.
$ docker run -it nœud: 6.9.2 |
Impossible de trouver l'image nœud: 6.9.2 'localement |
6.9.2: Tirer de la bibliothèque / nœud |
75A822CD7888: Pull complet |
57DE64C72267: Pull complet |
4306be1e8943: Pull complet |
871436AB7225: Pull complet |
0110C26A367A: Pull complet |
1F04FE713F1B: Pull complet |
AC7C0B5FB553: Pull complet |
Digest: Sha256: 2E95BE60FAF429D6C97D928C762CB36F1940F4456CE4BD33FBDC34DE94A5E043 |
Statut: Image plus récente téléchargée pour le nœud: 6.9.2 |
Maintenant, si nous vérifions à nouveau les images Docker, nous trouvons:
Taille de la balise du référentiel |
Node 6.9.2 FAAADB4AAF9B il y a 11 mois 655 Mo |
Et si nous vérifions le conteneur, nous trouvons:
Commande d'image d'ID de conteneur Image Créé les noms de ports d'état |
8C48C7E03BC7 NODE: 6.9.2 "Node" il y a 20 secondes en haut de 18 secondes Reverent_jackson |
Si nous commençons un autre conteneur à partir de la même image en utilisant la commande:
$ docker run -it nœud: 6.9.2 |
Et vérifiez à nouveau, nous voyons:
Taille de la balise du référentiel |
Node 6.9.2 FAAADB4AAF9B il y a 11 mois 655 Mo |
Et
Commande d'image d'ID de conteneur Image Créé les noms de ports d'état |
96E6DB955276 NODE: 6.9.2 "nœud" il y a 24 secondes en haut de 23 secondes Cocky_dijkstra |
8C48C7E03BC7 NODE: 6.9.2 "nœud" il y a 4 minutes en haut de 4 minutes Reverent_jackson |
Les deux conteneurs avec ID de conteneur 96E6DB955276 et 8C48C7E03BC7 fonctionnent tous deux sur l'image Docker avec l'image ID FAAADB4AAF9B. Les minces couches de lecture / écriture des conteneurs Docker résident sur le dessus de la couche de l'image Docker.
Astuces:
Vous pouvez supprimer les conteneurs Docker avec la commande docker rm [id de conteneur] et supprimer les images docker avec la commande docker rmi [ID d'image].
Le nœud d'image: 6.9.2 Nous avons téléchargé à partir de Docker Hub est également créé en combinant plusieurs couches. Vous pouvez vérifier les calques d'images en utilisant l'historique Docker [ID d'image].
$ Docker History Faaadb4aaf9b |
Image créée par la taille |
faaadb4aaf9b il y a 11 mois / bin / sh -c # (nop) cmd ["nœud"] 0b |
Il y a 11 mois / bin / sh -c curl -slo "https: // nodejs.org / d 42.5 Mo |
Il y a 11 mois / bin / sh -c # (nop) env node_version = 6.9.2 0b |
Il y a 11 mois / bin / sh -c # (nop) env npm_config_loglevel 0b |
Il y a 11 mois / bin / sh -c set -ex && pour la clé dans 955 108KB |
Il y a 11 mois / bin / sh -c groupadd --gid 1000 nœud && u 335KB |
Il y a 11 mois / bin / sh -c apt-get update && apt-get insta 323Mb |
Conclusion
Une façon populaire d'expliquer les images et les conteneurs est de comparer une image à une classe et un conteneur à l'instance de cette classe. L'approche en couches des images et des conteneurs Docker aide à maintenir la taille des images et des conteneurs petits.
Les références:
- https: // docs.docker.com / moteur / userguide / storagedriver / images et contraintes / contraintes /
- Image Docker vs conteneur
- https: // stackOverflow.com / questions / 23735149 / docker-image-vs-container