Dans Docker, quelle est la différence entre un conteneur et une image?

Quelle est la différence entre un conteneur et une image dans Docker? Dans le didacticiel Démarrer avec Docker, ces termes sont tous deux utilisés, mais je ne comprends pas la différence.

Quelqu’un peut-il s’il vous plaît faire la lumière?

Une image est une collection ordonnée de modifications du système de fichiers racine et des parameters d’exécution correspondants à utiliser dans un environnement d’exécution de conteneur. Les images sont en lecture seule.

Un conteneur est une instanciation dynamic (ou inactive si sortie) d’une image.

Les images sont des instantanés immuables et figés des conteneurs actifs. Les conteneurs exécutent (ou arrêtent) des instances d’une image.

Commencez avec l’image de base appelée ‘ubuntu’. Lançons bash interactivement dans l’image ubuntu et créons un fichier. Nous utiliserons les drapeaux -i et -t pour nous donner un shell interactif.

 $ docker run -i -t ubuntu /bin/bash root@48cff2e9be75:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var root@48cff2e9be75:/# cat > foo This is a really important file!!!! root@48cff2e9be75:/# exit 

Ne vous attendez pas à ce que ce fichier persiste lorsque vous quittez et redémarrez l’image. Vous redémarrez exactement du même état que celui dans lequel vous avez démarré, et non pas là où vous l’avez laissé.

 $ docker run -i -t ubuntu /bin/bash root@abf181be4379:/# ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var root@abf181be4379:/# exit 

Mais, le conteneur, qui ne fonctionne plus, a un état et peut être enregistré (engagé) dans une image.

 $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES abf181be4379 ubuntu:14.04 /bin/bash 17 seconds ago Exited (0) 12 seconds ago elegant_ardinghelli 48cff2e9be75 ubuntu:14.04 /bin/bash About a minute ago Exited (0) 50 seconds ago determined_pare ... 

Créons une image à partir de l’ID du conteneur 48cff2e9be75 où nous avons créé notre fichier:

 $ docker commit 48cff2e9be75 ubuntu-foo d0e4ae9a911d0243e95556e229c8e0873b623eeed4c7816268db090dfdd149c2 

Maintenant, nous avons une nouvelle image avec notre fichier vraiment important:

 $ docker run ubuntu-foo /bin/cat foo This is a really important file!!!! 

Essayez la commande docker images . Vous devriez voir votre nouvelle image ubuntu-foo listée avec l’image standard ubuntu avec laquelle nous avons commencé.

En utilisant une analogie de programmation orientée object, la différence entre une image Docker et un conteneur Docker est la même que celle de la différence entre une classe et un object. Un object est l’instance d’exécution d’une classe. De même, un conteneur est l’instance d’exécution d’une image.

Un object est créé une seule fois lorsqu’il est instancié. De même, un conteneur peut être en cours d’exécution ou arrêté. Les conteneurs sont créés à partir d’une image, bien que cela ne soit pas toujours le cas. L’exemple suivant crée une image de serveur Apache, exécute l’image, répertorie les images, puis répertorie les conteneurs:

  1. Créez un fichier Docker avec le contenu suivant:

     FROM httpd:2.4 
  2. Installer le serveur Apache

     sudo docker build -t my-apache2 . 
  3. Lancer l’image

     sudo docker run -it --rm --name my-running-app my-apache2 
  4. Liste des images Docker

     sudo docker images 
  5. Liste des conteneurs Docker en cours d’exécution

     docker ps 
  6. Liste tous les conteneurs

     docker ps -a 
  7. Liste les derniers conteneurs créés

     docker ps -l 

C’est assez simple.

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

Images

Le système de fichiers et la configuration de notre application qui sont utilisés pour créer des conteneurs. plus de détails..

Conteneurs

Ces instances exécutent des images Docker. Les conteneurs exécutent les applications réelles. Un conteneur comprend une application et toutes ses dépendances. Il partage le kernel avec d’autres conteneurs et s’exécute en tant que processus isolé dans l’espace utilisateur du système d’exploitation hôte. plus de détails..


Autres termes importants à noter:


Docker daemon

Le service d’arrière-plan exécuté sur l’hôte qui gère la construction, l’exécution et la dissortingbution des conteneurs Docker.

Client Docker

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

Docker Store

Store est, entre autres, un registre d’images Docker. Vous pouvez considérer le registre comme un répertoire de toutes les images Docker disponibles.

Une image vaut mieux que mille mots. entrer la description de l'image ici

Résumé:

  • Tirez Docker hub ou créez une image à 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.-à-d. Un conteneur (modifiable)

Une image est fondamentalement un modèle immuable pour créer un conteneur. Il est plus facile de comprendre la différence entre une image et un conteneur en considérant ce qui arrive à une image pour la transformer en conteneur.

Le moteur Docker prend l’image et ajoute un système de fichiers en lecture-écriture, puis initialise divers parameters. Ces parameters incluent les options réseau (IP, port, etc.), le nom, l’ID et les limites de ressources (processeur, mémoire). Si le moteur Docker a été invité à exécuter le conteneur, il initialisera également un processus à l’intérieur. Un conteneur peut être arrêté et redémarré, auquel cas il conservera tous les parameters et modifications du système de fichiers (mais perdra tout élément en mémoire et tous les processus seront redémarrés). Pour cette raison, un conteneur arrêté ou sorti n’est pas identique à une image.

Images [comme vm]

  • Modèle en lecture seule utilisé pour créer des conteneurs
  • Construit par vous ou d’autres utilisateurs de Docker
  • Stocké dans le Docker Hub ou votre registre local

Conteneurs [comme une machine qui coule]

  • Plate-forme d’application isolée
  • Contient tout ce qui est nécessaire pour exécuter votre application
  • Basé sur des images

lien images pour montrer ce qu'est un conteneur

Dans Docker, tout commence par une image. Une image est chaque fichier qui constitue juste assez du système d’exploitation pour faire ce que vous devez faire. Traditionnellement, vous installez un système d’exploitation complet avec tout ce que vous faites pour chaque application. Avec Docker, vous associez le système de manière à ce que vous ayez un petit conteneur avec juste assez de système d’exploitation pour faire ce que vous devez faire, et vous pouvez en avoir beaucoup sur votre ordinateur.

Utilisez les docker images pour voir les images installées et docker ps pour voir les images en cours. Lorsque vous tapez docker run il prend l’image et en fait un conteneur vivant avec un processus en cours d’exécution. J’ai tendance à utiliser:

docker exécuter -ti : bash

Enfin, les images ont leur propre ensemble d’identifiants et les conteneurs ont leur propre ensemble d’identifiants – ils ne se chevauchent pas.

DockerFile – (Build) -> DockerImage – (exécuter) -> DockerContainer

DockerFile est ce que vous ou le développeur écrivez pour faire quelque chose (ex-install)

Docker Image est ce que vous obtenez lorsque vous créez un fichier Docker .

Docker Container est ce que vous obtenez lorsque vous exécutez votre image Docker

Nous pouvons obtenir Docker Image à partir du hub Docker en le tirant, puis l’exécuter pour obtenir un conteneur.

Les conteneurs sont basés sur des images. Une image doit être transmise à la commande d’exécution Dockers.

Exemple:

Image BusyBox

http://i.stack.imgur.com/eK9dC.png

Ici, nous spécifions une image appelée busybox . Docker n’a pas cette image localement et le tire d’un registre public.

Un registre est un catalogue d’images Docker avec lesquelles le client Docker peut communiquer et télécharger des images. Une fois l’image extraite, Docker démarre un conteneur et exécute la commande echo hello world.

Images : le système de fichiers et les métadonnées nécessaires à l’exécution des conteneurs. Ils peuvent être considérés comme un format d’empaquetage d’applications qui inclut toutes les dépendances pour exécuter l’application et les parameters par défaut pour exécuter cette application. Les métadonnées incluent les valeurs par défaut pour la commande à exécuter, les variables d’environnement, les étiquettes et la commande healthcheck.

Conteneurs : instance d’une application isolée. Un conteneur a besoin de l’image pour définir son état initial et utilise le système de fichiers en lecture seule de l’image avec un système de fichiers en lecture-écriture spécifique au conteneur. Un conteneur en cours d’exécution est un wrapper autour d’un processus en cours d’exécution, ce qui donne aux espaces de noms de processus des éléments tels que le système de fichiers, le réseau et les PID.

Lorsque vous exécutez une commande docker run , vous fournissez une image sur la ligne de commande, avec toutes les configurations, et docker renvoie un conteneur en fonction de cette définition d’image et des configurations que vous avez fournies.


Références : au moteur de docker, une image est juste un identifiant d’image. C’est un hasch unique immuable. Une modification apscope à une image entraîne la création d’un nouvel identifiant d’image. Cependant, vous pouvez avoir une ou plusieurs références pointant vers un identifiant d’image, contrairement aux liens symboliques. Et ces références peuvent être mises à jour pour pointer vers de nouveaux identifiants d’image. Notez que lorsque vous créez un conteneur, docker résoudra cette référence au moment de la création du conteneur. Vous ne pouvez donc pas mettre à jour l’image d’un conteneur en cours d’exécution. Au lieu de cela, vous créez une nouvelle image et créez un nouveau conteneur basé sur cette nouvelle image.

Calques : En creusant un peu plus, vous avez des couches de système de fichiers. Docker assemble des images avec un système de fichiers en couches. Chaque couche est un ensemble de modifications en lecture seule du système de fichiers et cette couche est représentée par un hachage unique. En utilisant ces couches en lecture seule, plusieurs images peuvent en étendre une autre et seules les différences entre ces images doivent être stockées ou transmises sur le réseau. Lorsqu’un conteneur Docker est exécuté, il reçoit une couche de système de fichiers en lecture-écriture spécifique au conteneur, unique à ce conteneur, et tous les calques d’image sont assemblés à l’aide d’un système de fichiers union. Une lecture est traitée dans chaque couche jusqu’à ce que le fichier soit trouvé, qu’une suppression soit trouvée ou que le fichier ne soit pas trouvé dans la couche inférieure. Une écriture effectue une copie sur écriture de la couche en lecture seule de l’image dans la couche de lecture-écriture spécifique au conteneur. Et une suppression est enregistrée en tant que modification de la couche de lecture-écriture spécifique au conteneur. Une étape courante dans la création d’images consiste à exécuter une commande dans un conteneur temporaire en fonction de l’état du système de fichiers image précédent et à enregistrer le calque spécifique au conteneur résultant en tant que couche dans la nouvelle image.

Images Docker: contient une liste de commandes et d’instructions sur la manière de créer et d’exécuter un conteneur. Donc, fondamentalement, Images contient toutes les données et métadonnées nécessaires pour lancer un conteneur (également appelé blueprint). Nous ne pouvons pas préparer un conteneur sans spécifier d’images.

$docker images centos

Énumérez toutes les versions disponibles de centos.

Docker Container: les conteneurs sont des déjeuner à partir d’images afin que nous puissions dire que le conteneur est l’instance en cours d’exécution d’une image. Container est une construction d’exécution, contrairement à Images, qui est une construction à la fois.

La différence officielle est que le conteneur est la dernière couche accessible en écriture alors que les calques ci-dessous ne sont lisibles que par leur image. La différence intuitive est que l’instance de docker est l’instance virtualisée par votre démon docker et que votre image est en cours d’exécution. Elle fonctionne dans une section isolée de votre kernel (ce processus vous est caché). L’image est cependant statique, elle ne fonctionne pas, c’est juste une stack de calques (fichiers statiques). Si nous relions ce paradigme à la programmation orientée object, l’image est votre définition de classe, alors que votre instance de docker est votre object généré en classe qui réside en mémoire.

J’ai écrit un tutoriel pour renforcer votre intuition de connaissances sur les dockers:

http://javagoogleappspot.blogspot.com/2018/07/docker-basics.html