Aus meinem Artikel über Automatisierung von Docker-Bereitstellungen (archiviert):
Docker-Images vs. Container
In Dockerland gibt es Images und es gibt Container. Die beiden sind eng miteinander verbunden, aber unterschiedlich. Für mich hat das Erfassen dieser Dichotomie Docker ungemein klar gemacht.
Was ist ein Image?
Ein Image ist eine träge, unveränderliche Datei, die im Wesentlichen einen Schnappschuss eines Containers darstellt. Images werden mit dem build-Befehl erstellt und sie erzeugen einen Container, wenn sie mit run gestartet werden. Images werden in einem Docker-Registry wie registry.hub.docker.com gespeichert. Da sie recht groß werden können, sind Images darauf ausgelegt, aus Schichten anderer Images zusammengesetzt zu sein, um beim Übertragen von Images über das Netzwerk eine minimale Datenmenge zu senden.
Lokale Images können durch Ausführen von docker images
aufgelistet werden:
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
ubuntu 13.10 5e019ab7bf6d vor 2 Monaten 180 MB
ubuntu 14.04 99ec81b80c55 vor 2 Monaten 266 MB
ubuntu latest 99ec81b80c55 vor 2 Monaten 266 MB
ubuntu trusty 99ec81b80c55 vor 2 Monaten 266 MB
4ab0d9120985 vor 3 Monaten 486,5 MB
Einige Dinge, die beachtet werden sollten:
- IMAGE ID sind die ersten 12 Zeichen des wahren Identifikators für ein Image. Sie können viele Tags eines bestimmten Images erstellen, aber ihre IDs sind alle gleich (wie oben).
- VIRTUAL SIZE ist virtuell, weil es die Größen aller verschiedenen zugrunde liegenden Schichten zusammenzählt. Das bedeutet, dass die Summe aller Werte in dieser Spalte wahrscheinlich viel größer ist als der von all diesen Images verwendete Festplattenspeicher.
- Der Wert in der REPOSITORY-Spalte stammt vom
-t
-Flag des docker build
-Befehls oder vom Taggen eines vorhandenen Images mit docker tag
. Sie können Images mit einer Benennung versehen, die für Sie sinnvoll ist, aber bedenken Sie, dass Docker den Tag als den Registrierungsort in einem docker push
oder docker pull
verwenden wird.
- Die vollständige Form eines Tags ist
[REGISTRYHOST/][USERNAME/]NAME[:TAG]
. Für ubuntu
oben wird REGISTRYHOST automatisch als registry.hub.docker.com
interpretiert. Wenn Sie also Ihr Image mit dem Namen my-application
in einem Registry unter docker.example.com
speichern möchten, sollten Sie dieses Image als docker.example.com/my-application
taggen.
- Die TAG-Spalte ist nur der [:TAG]-Teil des vollen Tags. Das ist unglückliche Terminologie.
- Der Tag
latest
ist nicht magisch, er ist einfach der Standardtag, wenn Sie keinen Tag angeben.
- Sie können ungetaggte Images haben, die nur anhand ihrer IMAGE IDs identifizierbar sind. Diese erhalten den TAG und REPOSITORY. Es ist leicht, sie zu vergessen.
Weitere Informationen zu Images finden Sie in der Docker-Dokumentation und im Glossar.
Was ist ein Container?
Um eine Programmiermetapher zu verwenden, wenn ein Image eine Klasse ist, dann ist ein Container eine Instanz einer Klasse - ein Laufzeitobjekt. Container sind hoffentlich der Grund, warum Sie Docker verwenden; sie sind leichtgewichtige und portable Kapselungen einer Umgebung, in der Anwendungen ausgeführt werden können.
Zeigen Sie lokale laufende Container mit docker ps
:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f2ff1af05450 samalba/docker-registry:latest /bin/sh -c 'exec doc vor 4 Monaten Up 12 Wochen 0.0.0.0:5000->5000/tcp docker-registry
Hier führe ich eine dockerisierte Version des Docker-Registrierung aus, damit ich einen privaten Ort zum Speichern meiner Images habe. Auch hier einige Dinge, die beachtet werden sollten:
- Wie IMAGE ID ist CONTAINER ID der wahre Identifikator für den Container. Sie hat die gleiche Form, identifiziert aber eine andere Art von Objekt.
docker ps
gibt nur laufende Container aus. Sie können alle Container (laufend oder gestoppt) mit docker ps -a
anzeigen.
- NAMES können verwendet werden, um einen gestarteten Container über das
--name
-Flag zu identifizieren.
Wie man die Ansammlung von Images und Containern vermeiden kann
Einer meiner frühen Frustation mit Docker war die scheinbar ständige Ansammlung von ungetaggten Images und gestoppten Containern. In einigen wenigen Fällen führte diese Ansammlung dazu, dass meine Festplatte voll war und meinen Laptop verlangsamte oder meine automatisierte Build-Pipeline zum Stillstand brachte. Von "Containern überall" zu sprechen!
Wir können alle ungetaggten Images entfernen, indem wir docker rmi
mit der kürzlichen Abfrage dangling=true
kombinieren:
docker images -q --filter "dangling=true" | xargs docker rmi
Docker kann Images, die hinter vorhandenen Containern liegen, nicht entfernen, daher müssen Sie möglicherweise zuerst gestoppte Container mit docker rm
entfernen:
docker rm `docker ps --no-trunc -aq`
Das sind bekannte Problemstellen bei Docker und können in zukünftigen Versionen behoben werden. Mit einem klaren Verständnis von Images und Containern können diese Situationen jedoch mit ein paar Praktiken vermieden werden:
- Entfernen Sie immer einen nutzlosen, gestoppten Container mit
docker rm [CONTAINER_ID]
.
- Entfernen Sie immer das Image hinter einem nutzlosen, gestoppten Container mit
docker rmi [IMAGE_ID]
.