De mon article sur l' automatisation des déploiements Docker :
Images Docker vs conteneurs
Dans Dockerland, il y a des images et 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 l' exécution . Les images sont stockées dans un registre Docker tel que registry.hub.docker.com . Parce qu'elles peuvent devenir assez volumineuses, 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 répertorié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
Quelques points à noter:
- ID D'IMAGE correspond aux 12 premiers caractères de l'identifiant réel d'une image. Vous pouvez créer de nombreuses balises d'une image donnée, mais leurs identifiants seront tous les mêmes (comme ci-dessus).
- VIRTUAL SIZE est virtuel car il additionne les 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.
- La valeur de la colonne REPOSITORY provient du
-t
drapeau de la docker build
commande ou de docker tag
-ing une image existante. Vous êtes libre de baliser les images en utilisant une nomenclature qui vous convient, mais sachez que Docker utilisera la balise comme emplacement de registre dans un docker push
ou docker pull
.
- La forme complète d'une balise 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 devez étiqueter cette image docker.example.com/my-application
.
- La colonne TAG n'est que la partie [: TAG] de la balise complète . C'est une terminologie malheureuse.
- La
latest
balise n'est pas magique, c'est simplement la balise par défaut lorsque vous ne spécifiez pas de balise.
- Vous pouvez avoir des images non balisées uniquement identifiables par leurs ID IMAGE. Ceux-ci obtiendront le
<none>
TAG et le REPOSITORY. Il est facile de les oublier.
Plus d'informations sur les images sont disponibles dans la documentation et le glossaire 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.
Afficher les conteneurs en cours d'exécution 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 dockée du registre docker, de sorte que j'ai un endroit privé pour stocker mes images. Encore une fois, certaines choses à noter:
- Comme l'ID D'IMAGE, l'ID DE CONTENEUR est le véritable identifiant du conteneur. Il a la même forme, mais il identifie un type d'objet différent.
docker ps
ne produit que des conteneurs en cours d'exécution . Vous pouvez afficher tous les conteneurs (en cours d'exécution ou arrêtés ) avec docker ps -a
.
- NAMES peut être utilisé pour identifier un conteneur démarré via l'
--name
indicateur.
Comment éviter l'accumulation d'images et de conteneurs
L'une de mes premières frustrations avec Docker a été l' accumulation apparemment constante d'images non marquées et de conteneurs arrêtés . À quelques reprises, cette accumulation a entraîné un maximum de disques durs ralentissant mon ordinateur portable ou arrêtant mon pipeline de construction automatisé. Parlez de «conteneurs partout»!
Nous pouvons supprimer toutes les images non marquées en les combinant docker rmi
avec la dangling=true
requête récente :
docker images -q --filter "dangling=true" | xargs docker rmi
Docker ne pourra pas supprimer les images qui se trouvent derrière les conteneurs existants, vous devrez donc peut-être supprimer les conteneurs arrêtés avec d' docker rm
abord:
docker rm `docker ps --no-trunc -aq`
Ces problèmes sont connus avec Docker et pourront être résolus dans les prochaines versions. Cependant, avec une compréhension claire des images et des conteneurs, ces situations peuvent être évitées avec quelques pratiques:
- Retirez toujours un récipient inutile et arrêté avec
docker rm [CONTAINER_ID]
.
- Retirez toujours l'image derrière un récipient inutile et arrêté avec
docker rmi [IMAGE_ID]
.