Question Quelle est la différence entre une image Docker et un conteneur?


Lorsque vous utilisez Docker, nous commençons avec une image de base. Nous l'initialisons, créons des changements et ces changements sont sauvegardés dans des couches formant une autre image.

Donc finalement j'ai une image pour mon instance de PostgreSQL et une image pour mon application web, changements auxquels je continue d'être persisté.

Donc la question est: Qu'est-ce qu'un conteneur?


475
2018-05-19 10:15


origine


Réponses:


Une instance d'une image est appelée un conteneur. Vous avez une image, qui est un ensemble de couches que vous décrivez. Si vous démarrez cette image, vous avez un conteneur en cours d'exécution de cette image. Vous pouvez avoir plusieurs conteneurs en cours d'exécution de la même image.

Vous pouvez voir toutes vos images avec docker images alors que vous pouvez voir vos conteneurs de course avec docker ps (et vous pouvez voir tous les conteneurs avec docker ps -a).

Ainsi, une instance en cours d'exécution d'une image est un conteneur.


671
2018-05-19 11:40



De mon article sur Automatisation des déploiements de Docker:

Images Docker vs conteneurs

Dans Dockerland, il y a images et il y a conteneurs. Les deux sont étroitement liés, mais distincts. Pour moi, saisir cette dichotomie a énormément clarifié Docker.

Qu'est-ce qu'une image?

Une image est un fichier inerte, immuable, qui est essentiellement un instantané d'un conteneur. Les images sont créées avec le construire commande, et ils produiront un conteneur avec démarré avec courir. Les images sont stockées dans un registre Docker tel que registry.hub.docker.com. Parce qu'elles peuvent devenir assez grandes, les images sont conçues pour être composées de couches d'autres images, ce qui permet d'envoyer une quantité importante de données lors du transfert d'images sur le réseau.

Les images locales peuvent être listées en cours d'exécution docker images:

REPOSITORY                TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu                    13.10               5e019ab7bf6d        2 months ago        180 MB
ubuntu                    14.04               99ec81b80c55        2 months ago        266 MB
ubuntu                    latest              99ec81b80c55        2 months ago        266 MB
ubuntu                    trusty              99ec81b80c55        2 months ago        266 MB
<none>                    <none>              4ab0d9120985        3 months ago        486.5 MB

Quelques choses à noter:

  1. IMAGE ID correspond aux 12 premiers caractères du véritable identifiant d'une image. Vous pouvez créer plusieurs tags d'une image donnée, mais leurs ID seront tous identiques (comme ci-dessus).
  2. TAILLE VIRTUELLE est virtuel parce qu'il additionne les tailles de toutes les couches sous-jacentes distinctes. Cela signifie que la somme de toutes les valeurs dans cette colonne est probablement beaucoup plus grande que l'espace disque utilisé par toutes ces images.
  3. La valeur dans la colonne REPOSITORY provient de -t drapeau du docker build commande, ou de docker tag-d'une image existante. Vous êtes libre d'étiqueter des images en utilisant une nomenclature qui a du sens pour vous, mais sachez que docker utilisera la balise comme emplacement de registre dans un docker push ou docker pull.
  4. La forme complète d'un tag est [REGISTRYHOST/][USERNAME/]NAME[:TAG]. Pour ubuntu ci-dessus, REGISTRYHOST est supposé être registry.hub.docker.com. Donc, si vous prévoyez de stocker votre image appelée my-application dans un registre à docker.example.com, vous devriez étiqueter cette image docker.example.com/my-application.
  5. La colonne TAG est juste la partie [: TAG] du plein marque. C'est une terminologie malheureuse.
  6. le latest tag n'est pas magique, c'est simplement la balise par défaut lorsque vous ne spécifiez pas de tag.
  7. Vous pouvez avoir des images non étiquetées uniquement identifiables par leurs ID IMAGE. Ceux-ci obtiendront le <none>TAG et REPOSITORY. Il est facile de les oublier.

Plus d'informations sur les images sont disponibles à partir du Docker docs et glossaire.

Qu'est-ce qu'un conteneur?

Pour utiliser une métaphore de programmation, si une image est une classe, un conteneur est une instance d'un objet runtime de classe. Les conteneurs sont, espérons-le, pourquoi vous utilisez Docker; ils sont des encapsulations légères et portables d'un environnement dans lequel exécuter des applications.

Voir les conteneurs de course locaux avec docker ps:

CONTAINER ID        IMAGE                               COMMAND                CREATED             STATUS              PORTS                    NAMES
f2ff1af05450        samalba/docker-registry:latest      /bin/sh -c 'exec doc   4 months ago        Up 12 weeks         0.0.0.0:5000->5000/tcp   docker-registry

Ici, je cours une version dockerized du registre de docker, de sorte que j'ai un endroit privé pour stocker mes images. Encore une fois, certaines choses à noter:

  1. Comme ID IMAGE, ID CONTAINER est le véritable identifiant du conteneur. Il a la même forme, mais il identifie un type d'objet différent.
  2. docker ps seulement les sorties fonctionnement conteneurs. Vous pouvez voir tous les conteneurs (fonctionnement ou arrêté) avec docker ps -a.
  3. NAMES peut être utilisé pour identifier un conteneur démarré via le --name drapeau.

Comment éviter les images et l'accumulation de conteneurs?

Une de mes premières frustrations avec Docker était le accumulation apparemment constante d'images non étiquetées et de conteneurs arrêtés. À quelques occasions, cette accumulation a entraîné un maximum de disques durs qui ont ralenti mon ordinateur portable ou interrompu mon pipeline de génération automatisée. Parlez de "conteneurs partout"!

Nous pouvons supprimer toutes les images non étiquetées en combinant docker rmi avec le récent dangling=true question:

docker images -q --filter "dangling=true" | xargs docker rmi

Docker ne sera pas en mesure de supprimer les images qui se trouvent derrière des conteneurs existants, vous devrez peut-être supprimer les conteneurs arrêtés avec docker rm premier:

docker rm `docker ps --no-trunc -aq`

Ceux-ci sont points de douleur connus avec Docker, et pourrait être abordé dans les prochaines versions. Cependant, avec une compréhension claire des images et des conteneurs, ces situations peuvent être évitées avec quelques pratiques:

  1. Toujours retirer un contenant inutile et arrêté avec docker rm [CONTAINER_ID].
  2. Toujours supprimer l'image derrière un conteneur inutile et arrêté avec docker rmi [IMAGE_ID].

405
2017-11-16 19:07



Bien qu'il soit plus simple de concevoir un conteneur comme une image en cours d'exécution, ce n'est pas assez précis.

Une image est vraiment un modèle qui peut être transformé en un conteneur. Pour transformer une image en conteneur, le moteur Docker prend l'image, ajoute un système de fichiers en lecture-écriture et initialise divers paramètres, notamment les ports réseau, le nom du conteneur, l'ID et les limites de ressources. Un conteneur en cours d'exécution a un processus en cours d'exécution, mais un conteneur peut également être arrêté (ou quitté dans la terminologie de Docker). Un conteneur sorti est ne pas identique à une image, car elle peut être redémarrée et conservera ses paramètres et tout changement de système de fichiers.


88
2017-11-12 11:14



Peut-être que l'explication de tout le flux de travail peut aider.

Tout commence par le Dockerfile. Le Dockerfile est le code source de l'image.

Une fois le fichier Docker créé, vous le créez pour créer le fichier image du conteneur. L'image est juste la "version compilée" du "code source" qui est le fichier Docker.

Une fois que vous avez l'image du conteneur, vous devez le redistribuer en utilisant enregistrement. Le registre est comme un dépôt git - vous pouvez pousser et tirer des images.

Ensuite, vous pouvez utiliser l'image pour exécuter conteneurs. Un conteneur en cours d'exécution est très similaire, à de nombreux égards, à une machine virtuelle (mais sans la hyperviseur).

Ce post explique beaucoup de choses de base sur les conteneurs docker (il s'agit de Docker et Puppet, mais il y a beaucoup de concepts qui peuvent être utilisés dans n'importe quel contexte)


65
2018-05-05 11:06



C'est plutôt droit.

(Pour plus de compréhension, veuillez lire ce.)

Images -

Le système de fichiers et la configuration (en lecture seule) qui est utilisée pour   créer des conteneurs. plus de détails..

Conteneurs -

Ce sont des instances en cours d'exécution des images Docker. Les conteneurs fonctionnent le réel   applications. Un conteneur comprend une application et tous ses éléments   dépendances. Il partage le noyau avec d'autres conteneurs et fonctionne comme   un processus isolé dans l'espace utilisateur sur le système d'exploitation hôte. plus de détails..


Autres termes importants à remarquer:


Démon Docker -

Le service d'arrière-plan exécuté sur l'hôte qui gère le bâtiment,   exécuter et distribuer des conteneurs Docker.

Docker client -

L'outil de ligne de commande qui permet à l'utilisateur d'interagir avec le Docker   démon.

Magasin Docker -

Store est, entre autres choses, un registre d'images Docker. Vous pouvez   Considérez le registre comme un répertoire de toutes les images Docker disponibles.

Une image vaut mieux que mille mots. enter image description here

Résumé:

  • tirer Image former Docker Hub ou construire à partir de Dockerfile => Donne une image de docker (non modifiable).
  • Exécuter l'image (docker run image_name:tag_name) => Donne une image en cours d'exécution, c'est-à-dire un conteneur (modifiable)

48
2017-10-02 14:44



Workflow

Voici le flux de travail de bout en bout montrant les différentes commandes et leurs entrées et sorties associées. Cela devrait clarifier la relation entre une image et un conteneur.

+------------+  docker build   +--------------+  docker run -dt   +-----------+  docker exec -it   +------+
| Dockerfile | --------------> |    Image     | --------------->  | Container | -----------------> | Bash |
+------------+                 +--------------+                   +-----------+                    +------+
                                 ^
                                 | docker pull
                                 |
                               +--------------+
                               |   Registry   |
                               +--------------+

Pour lister les images que vous pourriez exécuter, exécutez:

docker image ls

Pour lister les conteneurs, vous pouvez exécuter des commandes:

docker ps

27
2017-08-09 18:25



Je ne pouvais pas comprendre le concept de l'image et de la couche en dépit de lire toutes les questions ici et ensuite finalement tombé sur cette excellente documentation de docker (duh!).

L'exemple là est vraiment la clé pour comprendre l'ensemble du concept. C'est un long post, donc je résume les points clés qui doivent être vraiment saisis pour être clairs.

  • Image: Une image Docker est construite à partir d'une série de lecture seulement couches

  • Couche: Chaque couche représente une instruction dans le fichier Docker de l'image.

Example: Le fichier Dockerfile ci-dessous contient quatre commandes, chacune créant une couche.

À partir de Ubuntu: 15.04

COPIE . / app

Exécuter make / app

CMD python /app/app.py

Important, Chaque couche est seulement un ensemble de différences de la couche avant elle.

  • Récipient. Lorsque vous créez un nouveau conteneur, vous ajoutez une nouvelle couche inscriptible au-dessus des couches sous-jacentes. Cette couche est souvent appelée "couche conteneur". Toutes les modifications apportées au conteneur en cours d'exécution, telles que l'écriture de nouveaux fichiers, la modification de fichiers existants et la suppression de fichiers, sont écrites dans ce fichier. mince couche de conteneur inscriptible.

Par conséquent, la différence majeure entre un conteneur et une image est   la couche accessible en écriture. Tout écrit dans le conteneur qui ajoute un nouveau ou   modifier les données existantes sont stockées dans cette couche inscriptible. Quand le   Le conteneur est supprimé, la couche accessible en écriture est également supprimée. le   l'image sous-jacente reste inchangée.

Comprendre les images et les conteneurs à partir d'une perspective de taille sur disque

Pour afficher la taille approximative d'un conteneur en cours d'exécution, vous pouvez utiliser le docker ps -s commander. Vous obtenez size et virtual size comme deux des sorties

  • Taille: la quantité de données (sur le disque) utilisée pour la couche inscriptible de chaque conteneur

  • Taille virtuelle: la quantité de données utilisée pour les données d'image en lecture seule utilisées par le conteneur. Plusieurs conteneurs peuvent partager certaines ou toutes les données d'image en lecture seule. Par conséquent, ceux-ci ne sont pas additifs. c'est-à-dire que vous ne pouvez pas ajouter toutes les tailles virtuelles pour calculer la taille du disque utilisée par l'image

Un autre concept important est la stratégie Copy on Write  Si un fichier ou un répertoire existe dans une couche inférieure de l'image et qu'un autre calque (y compris la couche accessible en écriture) doit y être accessible en lecture, il utilise uniquement le fichier existant. La première fois qu'une autre couche doit modifier le fichier (lors de la création de l'image ou de l'exécution du conteneur), le fichier est copié dans cette couche et modifié.

J'espère que ça aide quelqu'un d'autre comme moi.


26
2017-08-10 10:59



Dockerfile > (Construire)> Image > (Exécuter)> Récipient.

  • Dockerfile: contient un jeu d'instructions docker qui configure votre système d'exploitation comme vous le souhaitez, et installe / configure tous vos logiciels.

  • Image: compilé Dockerfile. Vous gagnez du temps en reconstruisant le fichier Docker à chaque fois que vous devez exécuter un conteneur. Et c'est un moyen de cacher votre code de provision.

  • Récipient: le système d'exploitation virtuel lui-même, vous pouvez entrer dans ssh et exécuter toutes les commandes que vous souhaitez, comme si c'était un environnement réel. Vous pouvez exécuter plus de 1000 conteneurs à partir de la même image.


15
2018-04-25 01:26