Aus meinem Artikel über die Automatisierung von Docker-Bereitstellungen :
Docker-Bilder vs. Container
In Dockerland gibt es Bilder und Container . Die beiden sind eng miteinander verbunden, aber unterschiedlich. Für mich hat das Erfassen dieser Dichotomie Docker immens klargestellt.
Was ist ein Bild?
Ein Bild ist eine inerte, unveränderliche Datei, die im Wesentlichen eine Momentaufnahme eines Containers ist. Images werden mit dem Befehl build erstellt und erzeugen beim Start von run einen Container . Bilder werden in einer Docker-Registrierung wie registry.hub.docker.com gespeichert . Da sie sehr groß werden können, bestehen Bilder aus Schichten anderer Bilder, sodass beim Übertragen von Bildern über das Netzwerk nur eine minimale Datenmenge gesendet werden kann.
Lokale Bilder können aufgelistet werden, indem Sie Folgendes ausführen 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
Einige Dinge zu beachten:
- IMAGE ID sind die ersten 12 Zeichen der wahren Kennung für ein Bild. Sie können viele Tags eines bestimmten Bildes erstellen, aber ihre IDs sind alle gleich (wie oben).
- VIRTUELLE GRÖSSE ist virtuell, da sie die Größe aller unterschiedlichen zugrunde liegenden Ebenen addiert. Dies bedeutet, dass die Summe aller Werte in dieser Spalte wahrscheinlich viel größer ist als der von all diesen Bildern verwendete Speicherplatz.
- Der Wert in der Spalte REPOSITORY stammt aus dem
-t
Flag des docker build
Befehls oder aus docker tag
einem vorhandenen Bild. Es steht Ihnen frei, Bilder mit einer für Sie sinnvollen Nomenklatur zu kennzeichnen. Sie wissen jedoch, dass Docker das Tag als Registrierungsspeicherort in einem docker push
oder verwendet docker pull
.
- Die vollständige Form eines Tags ist
[REGISTRYHOST/][USERNAME/]NAME[:TAG]
. Für ubuntu
oben wird REGISTRYHOST abgeleitet registry.hub.docker.com
. Wenn Sie also vorhaben, Ihr my-application
in einer Registrierung aufgerufenes Bild unter zu speichern, sollten Sie dieses Bild mit einem docker.example.com
Tag versehen docker.example.com/my-application
.
- Die TAG-Spalte ist nur der [: TAG] -Teil des vollständigen Tags. Dies ist eine unglückliche Terminologie.
- Das
latest
Tag ist nicht magisch, es ist einfach das Standard-Tag, wenn Sie kein Tag angeben.
- Sie können Bilder ohne Tags haben, die nur anhand ihrer BILD-IDs erkennbar sind. Diese erhalten den
<none>
TAG und das REPOSITORY. Es ist leicht, sie zu vergessen.
Weitere Informationen zu Bildern finden Sie in der Docker-Dokumentation und im Glossar .
Was ist ein Container?
Um eine Programmiermetapher zu verwenden: Wenn ein Bild eine Klasse ist, ist ein Container eine Instanz einer Klasse - ein Laufzeitobjekt. Container sind hoffentlich der Grund, warum Sie Docker verwenden. Sie sind leichte und tragbare Kapseln einer Umgebung, in der Anwendungen ausgeführt werden können.
Lokale laufende Container anzeigen mit 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
Hier führe ich eine Docker-Version der Docker-Registrierung aus, damit ich einen privaten Ort zum Speichern meiner Bilder habe. Wieder einige Dinge zu beachten:
- Wie die IMAGE ID ist die CONTAINER ID die wahre Kennung für den Container. Es hat die gleiche Form, identifiziert jedoch eine andere Art von Objekt.
docker ps
gibt nur laufende Container aus. Sie können alle Container ( ausgeführt oder gestoppt ) mit anzeigen docker ps -a
.
- NAMES kann verwendet werden, um einen gestarteten Container über das
--name
Flag zu identifizieren .
So vermeiden Sie die Bildung von Bildern und Containern
Eine meiner frühen Frustrationen mit Docker war der scheinbar ständige Aufbau von Bildern ohne Tags und angehaltenen Containern . In einigen Fällen führte dieser Aufbau dazu, dass die Festplatten meinen Laptop verlangsamten oder meine automatisierte Build-Pipeline stoppten. Sprechen Sie über "Container überall"!
Wir können alle Bilder ohne Tags entfernen, indem wir sie docker rmi
mit der letzten dangling=true
Abfrage kombinieren :
docker images -q --filter "dangling=true" | xargs docker rmi
Docker kann keine Bilder entfernen, die sich hinter vorhandenen Containern befinden. Daher müssen Sie möglicherweise gestoppte Container docker rm
zuerst entfernen mit :
docker rm `docker ps --no-trunc -aq`
Dies sind bekannte Schwachstellen bei Docker und werden möglicherweise in zukünftigen Versionen behoben. Mit einem klaren Verständnis von Bildern und Containern können diese Situationen jedoch mit einigen Methoden vermieden werden:
- Entfernen Sie immer einen unbrauchbaren, gestoppten Behälter mit
docker rm [CONTAINER_ID]
.
- Entfernen Sie immer das Bild hinter einem unbrauchbaren, gestoppten Behälter mit
docker rmi [IMAGE_ID]
.