run - download docker image




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

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, éventuellement, j'ai une image pour mon Postgres et une image pour mon application web, changements qui continuent d'être persistants.

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


flux de travail

Voici le workflow 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

Bien qu'il soit plus simple de considérer un conteneur comme une image en cours d'exécution, ce n'est pas tout à fait exact.

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 fermé n'est pas la même chose qu'une image, car il peut être redémarré et conservera ses paramètres et tous les changements apportés au système de fichiers.


Comme dans l'aspect de la programmation,

L'image est un code source.

Lorsque le code source est compilé et construit, il est appelé en tant qu'application.

Simillar à cela "quand l'instance est créée pour l'image", on l'appelle " Container "


De mon article sur l' automatisation des déploiements Docker :

Images Docker vs conteneurs

Dans Dockerland, il y a des 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 un fichier inerte, immuable, qui est essentiellement un instantané d'un conteneur. Les images sont créées avec la commande build , et elles produisent un conteneur au démarrage de run . 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 répertoriées en exécutant des 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. La TAILLE VIRTUELLE est virtuelle car elle 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 de la colonne REPOSITORY provient de l'indicateur -t de la commande docker build ou du 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 le tag comme emplacement de registre dans un docker push docker pull ou un 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 sur docker.example.com , vous devez marquer cette image docker.example.com/my-application .
  5. La colonne TAG est juste la partie [: TAG] de la balise complète . C'est une terminologie malheureuse.
  6. La latest balise n'est pas magique, c'est simplement la balise par défaut lorsque vous ne spécifiez pas de balise.
  7. Vous pouvez avoir des images non étiquetées uniquement identifiables par leurs ID IMAGE. Ceux-ci recevront le <none> TAG et le REPOSITORY. C'est facile de les oublier.

Plus d'informations sur les images sont disponibles dans les docs et le glossary Docker .

Qu'est-ce qu'un conteneur?

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

Voir les conteneurs en cours d'exécution 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 différent d'objet.
  2. docker ps ne sort que les conteneurs en cours d'exécution . Vous pouvez voir tous les conteneurs (en cours d'exécution ou arrêtés ) avec docker ps -a .
  3. NAMES peut être utilisé pour identifier un conteneur démarré via l'indicateur --name .

Comment éviter l'accumulation d'image et de conteneur?

L'une de mes premières frustrations avec Docker était l' accumulation apparemment constante d'images non étiquetées et de contenants arrêtés . À quelques reprises, cette accumulation a entraîné des disques durs à capacité maximale ralentissant mon ordinateur portable ou arrêtant mon pipeline de build automatisé. Parlez de "conteneurs partout"!

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

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 donc d'abord supprimer les conteneurs arrêtés avec docker rm :

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

Ce sont des points de douleur connus avec Docker, et peuvent être abordés 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. Retirez toujours un conteneur inutile et arrêté avec docker rm [CONTAINER_ID] .
  2. Toujours retirer l'image derrière un conteneur inutile et arrêté avec docker rmi [IMAGE_ID] .

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

Les conteneurs Docker sont comme une version extraite de l'archive. Vous pouvez avoir autant de copies que vous le souhaitez dans différents dossiers (les conteneurs)


En bref:

Container est une division (virtuelle) dans un noyau qui partage un système d'exploitation commun et exécute une image (image Docker).

Un conteneur est une application autonome qui aura des paquets et toutes les dépendances nécessaires pour exécuter le code.


Le concept de base du docker est de faciliter la création de "machines" qui dans ce cas peuvent être considérées comme des conteneurs. Le conteneur aide à la réutilisation, ce qui vous permet de créer et de déposer des conteneurs facilement.

Les images représentent l'état d'un conteneur à chaque instant. Donc, le flux de travail de base est:

  1. créer une image
  2. démarrer un conteneur
  3. apporter des modifications au conteneur
  4. sauvegarder le conteneur en tant qu'image

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

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

Une fois le 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 Dockerfile.

Une fois que vous avez l'image du conteneur, vous devez le 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 exécuter des conteneurs . Un conteneur en cours d'exécution est très similaire, dans de nombreux aspects, à une machine virtuelle (mais sans l' hypervisor ).

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


Un conteneur est simplement un exécutable binaire qui doit être exécuté par le système d'exploitation hôte sous un ensemble de restrictions prédéfinies à l'aide d'une application (par exemple, docker) qui sait comment indiquer au système d'exploitation les restrictions à appliquer.

Les restrictions typiques sont liées à l'isolation des processus, liées à la sécurité (comme l'utilisation de la protection SELinux) et liées aux ressources système (mémoire, disque, processeur, réseau).

Jusqu'à récemment, seuls les noyaux des systèmes basés sur Unix supportaient la possibilité d'exécuter des exécutables sous des restrictions strictes. C'est pourquoi la plupart des discussions sur les conteneurs 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 principalement) quelles sont les restrictions pour exécuter un exécutable. L'exécutable est contenu dans l'image Docker, qui est juste un fichier tar. Cet exécutable est généralement une version allégée d'une distribution Linux (Ubuntu, centos, Debian, etc.) préconfigurée pour exécuter une ou plusieurs applications.

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

D'autres applications qui, comme Docker, peuvent indiquer au système d'exploitation hôte les limites à appliquer à un processus pendant son exécution, notamment LXC , libvirt et systemd . Docker utilisait ces applications pour interagir indirectement avec le système d'exploitation Linux, mais maintenant Docker interagit directement avec Linux en utilisant sa propre bibliothèque appelée " libcontainer ".

Les conteneurs ne sont donc que des processus s'exécutant dans un mode restreint, similaire à ce que le chroot faisait auparavant.

IMO, qui distingue Docker de toute autre technologie de conteneur, est son référentiel (Docker Hub) et ses outils de gestion qui rendent le travail avec des conteneurs extrêmement facile.

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


Une image Docker conditionne l'application et l'environnement requis par l'application pour s'exécuter et un conteneur est une instance en cours d'exécution de l'image.

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

Dans la question, seule la partie "programme" est référencée et c'est l'image. La partie "en cours d'exécution" de docker est le conteneur. Lorsqu'un conteneur est exécuté et que des modifications sont apportées, c'est comme si le processus modifiait son propre code source et l'enregistrait en tant que nouvelle image.


Dockerfile > (Build)> Image > (Exécuter)> Conteneur .

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

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

  • Container : 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.


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

Container est l'instanciation réelle de l'image, tout comme un objet est une instanciation ou une instance d'une classe.





docker-image