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

en utilisant Docker, nous commençons par une image de base. Nous l'amorçons, créons des changements et ces changements sont enregistrés dans des couches formant une autre image.

donc finalement j'ai une image pour mon instance PostgreSQL et une image pour mon application web, des changements qui persistent.

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

525
demandé sur Peter Mortensen 2014-05-19 14:15:27

20 réponses

Une instance d'une image est appelé conteneur. Vous avez une image, qui est un ensemble de couches que vous le décrivez. Si vous démarrez cette image, vous avez un conteneur courant de cette image. Vous pouvez avoir beaucoup de 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 votre course contenants docker ps (et vous pouvez voir tous les contenants docker ps -a ).

donc une instance courante d'une image est un conteneur.

733
répondu Thomas Uhrig 2017-10-20 17:41:57

De mon article sur "1519280920 de l'Automatisation de l'Docker Déploiements :

Docker Images vs. Containers

Dans Dockerland, il y a images et il y a des 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 une inerte, immuable, un fichier qui est essentiellement un instantané d'un conteneur. Les Images sont créées avec la commande build , et elles produiront un conteneur lorsqu'elles seront lancées avec run . Les Images sont stockées dans un registre Docker tel que registry.hub.docker.com . Parce qu'elles peuvent devenir très grandes, les images sont conçues pour être composées de couches d'autres images, ce qui permet d'envoyer une quantité minimale de données lors du transfert d'images sur le réseau.

les images locales peuvent être listées en exécutant 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

Certaines choses sont à noter:

  1. L'identificateur D'IMAGE est les 12 premiers caractères de l'identificateur véritable d'une image. Vous pouvez créer beaucoup de tags d'une image donnée, mais leurs IDs seront tous les mêmes (comme ci-dessus).
  2. la taille virtuelle est virtuel parce qu'il est l'addition de la tailles de toutes les couches sous-jacentes distinctes. Cela signifie que la somme de toutes les valeurs de cette colonne est probablement beaucoup plus grande que l'espace disque utilisé par toutes ces images.
  3. la valeur dans la colonne dépôt provient du drapeau -t de la commande docker build , ou de docker tag - ing 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 l'étiquette comme emplacement de Registre dans un docker push ou docker pull .
  4. la forme complète d'une étiquette 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 balise image docker.example.com/my-application .
  5. la colonne TAG est juste la partie [:TAG] de la full tag. C'est une terminologie malheureuse.
  6. Le latest la balise n'est pas magique, c'est simplement la balise par défaut quand vous ne spécifiez pas de balise.
  7. vous pouvez avoir des images non étiquetées seulement identifiables par leurs identifiants D'IMAGE. Ceux-ci obtiendront la balise et le dépôt <none> . Il est facile de les oublier.

plus d'informations sur les images sont disponibles sur le Docker docs et Glossaire .

qu'est Ce qu'un conteneur?

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

afficher les conteneurs courants 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 j'exécute une version dockerized du registre docker, de sorte que j'ai un endroit privé pour stocker mes images. Encore une fois, quelques choses à noter:

  1. comme le code D'identification D'IMAGE, le code D'identification du conteneur est le véritable identificateur du conteneur. Il a la même forme, mais il identifie un autre type d'objet.
  2. docker ps sorties seulement conteneurs en marche . Vous pouvez voir tous les conteneurs ( tournant ou arrêté ) avec docker ps -a .
  3. les noms peuvent être utilisé pour identifier un conteneur démarré via le drapeau --name .

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

l'une de mes premières frustrations avec Docker était le accumulation apparemment constante d'images non étiquetées et conteneurs arrêtés . À une poignée d'occasions, cette accumulation a entraîné des disques durs épuisés ralentissant mon ordinateur portable ou arrêtant mon pipeline de construction automatisée. Parler de "conteneurs partout"!

nous pouvons supprimer toutes les images non étiquetées en combinant docker rmi avec la récente dangling=true requête:

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

Docker ne sera pas en mesure d'enlever les images qui sont derrière les conteneurs existants, donc vous pouvez avoir à enlever les conteneurs arrêtés avec docker rm premier:

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

ce sont points de douleur connus avec Docker, et peut être abordée à l'avenir publier. Cependant, avec une compréhension claire des images et des conteneurs, ces situations peuvent être évitées avec quelques pratiques:

  1. toujours enlever un contenant inutile, arrêté avec docker rm [CONTAINER_ID] .
  2. toujours supprimer l'image derrière un contenant inutile, arrêté avec docker rmi [IMAGE_ID] .
431
répondu paislee 2018-05-26 10:10:43

bien qu'il soit plus simple de penser à un conteneur comme une image en cours d'exécution, ce n'est pas tout à fait précis.

une image est vraiment un modèle qui peut être transformé en conteneur. Pour transformer une image en conteneur, le moteur Docker prend l'image, ajoute un système de fichiers en lecture-écriture sur le dessus et initialise divers paramètres tels que les ports réseau, le nom du conteneur, L'ID et les limites de ressources. L'exécution d'un conteneur a un processus en cours d'exécution, mais un le conteneur peut également être arrêté (ou sorti dans la terminologie de Docker). Un conteneur sorti est et non comme une image, car il peut être redémarré et conservera ses paramètres et toute modification du système de fichiers.

90
répondu Adrian Mouat 2017-01-01 18:10:08

peut-être que l'explication de l'ensemble du flux de travail peut aider.

Tout commence avec le Dockerfile . Le fichier Dockerfile est le code source de l'Image.

une fois le fichier Dockerfile créé, vous le construisez pour créer l '" image du conteneur. L'image est juste la "version compilée" du "code source" qui est le fichier Dockerfile.

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

ensuite, vous pouvez utiliser l'image pour lancer containers . Un conteneur courant est très similaire, à bien des égards, à une machine virtuelle (mais sans le hyperviseur ).

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

70
répondu Tk421 2017-01-01 17:25:16

en termes simples.

Images -

le système de fichiers et l'application de configuration(en lecture seule) qui est utilisé pour créer des conteneurs. plus de détails .

Conteneurs -

ce sont des instances d'exécution d'images Docker. Conteneurs exécuter l' réel application. Un conteneur comprend une application et toutes ses dépendance. 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 à noter:


démon Docker -

le service d'arrière-plan tournant sur l'hôte qui gère le bâtiment, faire fonctionner et distribuer des conteneurs Docker.

Support client -

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

Docker Magasin -

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

Une image vaut mille mots.

Enter image description here

(pour une compréhension plus approfondie, veuillez lire this .)

résumé:

  • Pull image de Docker hub ou construire à partir d'un Dockerfile => Donne une image Docker (non modifiable).
  • exécuter l'image ( docker run image_name:tag_name ) = > donne une Image en cours d'exécution i.e. conteneur (modifiable)
55
répondu Imran 2018-09-21 04:13:19

Flux de travail

voici le workflow de bout en bout montrant les différentes commandes et leurs entrées et sorties associées. Qui 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 sur lesquels vous pouvez exécuter des commandes:

docker ps
29
répondu Sridhar-Sarnobat 2018-07-24 07:16:12

Je ne pouvais pas comprendre le concept de image et couche en dépit de la lecture de toutes les questions ici et puis éventuellement tombé sur cette excellente documentation de Docker (duh!).

L'exemple n'est vraiment la clé pour comprendre le concept. Il s'agit d'un long billet, c'est pourquoi je résume les points clés qu'il faut vraiment saisir pour obtenir de la clarté.

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

  • couche : chaque couche représente une instruction dans le fichier Dockerfile de l'image.

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

de ubuntu: 15.04

bien reçu . / app

RUN /app

CMD python /app/app.py

important , chaque couche n'est qu'un ensemble de différences par rapport à la couche précédente.

  • conteneur . Lorsque vous créez un nouveau conteneur, vous ajoutez une nouvelle couche les 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 à cette couche mince conteneur writable.

par conséquent, la principale différence entre un conteneur et une image est le top écriture couche . Tout écrit au conteneur qui ajoute nouveau ou modifier les données existantes sont stockées dans cette couche d'écriture. Lorsque l' le conteneur est supprimé, le calque modifiable est également supprimé. Le l'image sous-jacente demeure inchangée.

la Compréhension des images cnd de Conteneurs à partir d'une taille sur disque " point de vue

pour voir la taille approximative d'un conteneur, vous pouvez utiliser la commande docker ps -s . Vous obtenez size et virtual size comme deux des sorties:

  • Taille: la quantité de données (sur disque) qui est utilisé pour l'écriture de la couche de chaque conteneur

  • taille virtuelle: la quantité de données utilisées 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: vous ne pouvez pas ajouter toutes les tailles virtuelles pour calculer combien la taille sur le disque est utilisée par l'image

un autre concept important est la stratégie de copie-sur-écriture

si un fichier ou un répertoire existe dans une couche inférieure de l'image, et qu'une autre couche (y compris la couche en écriture) a besoin d'y accéder en lecture, elle utilise simplement le fichier existant. La première fois qu'un autre calque doit modifier le fichier (lors de la construction de l'image ou de l'exécution du conteneur), le fichier est copié dans ce calque et modifier.

j'espère que ça aidera quelqu'un comme moi.

27
répondu HopeKing 2018-08-28 19:47:33

Dockerfile > () > Image > (Run) > Conteneur .

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

  • Image : compiled Dockerfile. Vous fait gagner du temps à partir de reconstruire le fichier Dockerfile chaque fois que vous avez besoin de courir un conteneur. Et c'est une façon de cacher votre disposition du code.

  • Container : le système d'exploitation virtuel lui-même, vous pouvez ssh en elle et exécuter toutes les commandes que vous souhaitez, comme si c'est un environnement réel. Vous pouvez lancer plus de 1000 conteneurs à partir de la même Image.

17
répondu Mahmoud Zalt 2017-04-25 01:26:26

le concept de base de docker est de faciliter la création de" machines " qui, dans ce cas, peuvent être considérées comme des conteneurs. Le conteneur sida dans la réutilisabilité, vous permettant de créer et supprimer des conteneurs avec facilité.

les Images représentent l'état d'un conteneur à chaque moment dans le temps. Ainsi, le flux de travail de base est:

  1. créer une image
  2. démarrer un conteneur
  3. apporter des modifications au conteneur
  4. enregistrer le conteneur à l'arrière comme une image
11
répondu kweku360 2017-01-01 18:03:21

un conteneur est juste un binaire exécutable qui doit être exécuté par L'OS hôte sous un ensemble de restrictions qui sont prédéfinies en utilisant une application (par exemple, docker) qui sait comment dire à L'OS quelles restrictions appliquer.

les restrictions typiques sont liées au processus d'isolation, à la sécurité (comme la protection SELinux) et aux ressources du système (Mémoire, Disque, cpu, réseau).

Jusqu'à récemment seulement les noyaux dans les systèmes basés sur Unix pris en charge la capacité à exécuter des exécutables sous de strictes restrictions. C'est pourquoi la plupart des discussions sur les conteneurs aujourd'hui concernent principalement Linux ou d'autres distributions Unix.

Docker est l'une de ces applications qui sait comment dire au système D'exploitation (Linux surtout) quelles sont les restrictions pour exécuter un exécutable. L'exécutable est contenu dans L'image du Docker, qui n'est qu'un fichier tarfile. Cet exécutable est généralement une version dépouillée d'une distribution Linux (Ubuntu, centos, Debian, etc.).) préconfiguré pour exécuter une ou plusieurs applications.

bien que la plupart des gens utilisent une base Linux comme exécutable, il peut être n'importe quelle autre application binaire aussi longtemps que L'OS hôte peut l'exécuter. (voir créer une image de base simple en utilisant scratch ). Que le binaire dans l'image du docker soit un OS ou simplement une application, pour l'hôte du système D'exploitation, il s'agit simplement d'un autre processus, un processus contenu régi par des limites prédéfinies du système d'exploitation.

autres les applications qui, comme Docker, peuvent indiquer à L'OS hôte quelles limites appliquer à un processus pendant qu'il est en cours d'exécution comprennent LXC , libvirt , et systemd . Docker utilisait ces applications pour interagir indirectement avec L'OS Linux, mais maintenant Docker interagit directement avec Linux en utilisant sa propre bibliothèque appelée " libcontainer ".

donc les conteneurs ne sont que des processus en cours dans un mode restreint, similaire à ce que chroot utilisé pour faire.

IMO ce qui distingue Docker de toute autre technologie de conteneurs est son dépôt (Docker Hub) et ses outils de gestion qui rend le travail avec les conteneurs extrêmement facile.

voir https://en.m.wikipedia.org/wiki/Docker_ (Linux_container_engine)

10
répondu AleQ 2017-01-01 17:51:39

, dit Simplement, si une image est une classe, un conteneur est une instance d'une classe est un objet d'exécution.

8
répondu kogoia 2018-08-28 19:49:29

une image Docker emballe l'application et l'environnement requis par l'application à exécuter, et un conteneur est une instance de fonctionnement de l'image.

Images sont la partie d'emballage de docker, analogue à" code source "ou un"programme". Les conteneurs sont la partie d'exécution de docker, analogue à un"processus".

dans la question, seule la partie" programme " est mentionnée et c'est l'image. La partie" courante " de docker est le conteneur. Lorsqu'un le conteneur est exécuté et les changements sont faits, c'est comme si le processus de changement dans son propre code source et l'enregistrer comme une nouvelle image.

3
répondu div 2017-01-01 18:07:47

Image est l'équivalent d'une définition de classe dans OOP et les couches sont différentes méthodes et propriétés de cette classe.

Conteneur est l'instanciation de l'image tout comme la façon dont un objet est une instanciation ou une instance d'une classe.

3
répondu Rohit Salecha 2018-02-20 12:14:46

Comme dans la partie programmation,

Image est un code source.

quand code source est compilé et construit, il est appelé application.

Similaire que "lorsqu'une instance est créée pour l'image", il est appelé comme " Conteneur "

1
répondu Nandakumar 2017-06-19 06:28:27

en bref:

conteneur est une division (virtuelle) dans un noyau qui partage un OS commun et exécute une image (image Docker).

un conteneur est une application Auto-soutenable qui aura des paquets et toutes les dépendances nécessaires ensemble pour exécuter le code.

1
répondu Rajendra kumar Vankadari 2018-08-28 19:52:49

une image est classée comme contenant d'un objet.

Un conteneur est une instance d'une image comme un objet est une instance d'une classe.

1
répondu Rodolfo 2018-08-28 20:04:08

Comme beaucoup de réponses a souligné: Vous construire Dockerfile pour obtenir un image et vous exécuter image pour obtenir un conteneur .

cependant, les étapes suivantes m'ont aidé à obtenir une meilleure idée de ce que sont L'image et le conteneur Docker:

1) Construction Fichier Dockerfile:

docker build -t my_image dir_with_dockerfile

2) Enregistrer l'image dans .tar fichier

docker save -o my_file.tar my_image_id

my_file.tar stockera l'image. Ouvrez-le avec tar -xvf my_file.tar , et vous verrez toutes les couches. Si vous plongez plus profondément dans chaque couche, vous pouvez voir quels changements ont été ajoutés dans chaque couche. (Ils devraient être assez proches des commandes dans le fichier Dockerfile).

3) pour jeter un coup d'oeil à l'intérieur d'un conteneur, vous pouvez faire:

sudo docker run -it my_image bash

et vous pouvez voir que c'est comme un OS.

1
répondu Akavall 2018-09-29 02:44:27

Dockerfile est comme votre script bash qui produit une tarball (image Docker).

Docker containers est comme une version extraite de la tarball. Vous pouvez avoir autant de copies que vous le souhaitez dans les différents dossiers (les conteneurs)

0
répondu haalcala 2017-07-14 00:48:43

pour une analogie de programmation factice, vous pouvez penser à Docker a un répertoire Imag abstrait qui contient des ImageFactories qu'ils viennent de store .

Puis une fois que vous voulez créer une appli qui ImageFactory, vous aurez un nouveau conteneur, et vous pouvez les modifier comme vous le souhaitez. DotNetImageFactory sera immuable, car il agit comme une classe d'usine abstraite, où il ne délivre que les instances que vous désirez.

IContainer newDotNetApp = ImageFactory.DotNetImageFactory.CreateNew(appOptions);
newDotNetApp.ChangeDescription("I am making changes on this instance");
newDotNetApp.Run();
0
répondu Teoman shipahi 2018-04-30 16:17:11

un conteneur Docker exécute une instance d'une image. Vous pouvez relier une image avec un programme et un conteneur avec un processus:)

0
répondu Rahul Bagad 2018-08-28 20:03:40