Was ist der Unterschied zwischen einem Docker-Image und einem Container?
Bei der Verwendung von Docker beginnen wir mit einem Basis-Image. Wir booten es, erstellen Änderungen und diese Änderungen werden in Schichten gespeichert, die ein weiteres Image bilden.
So habe ich schließlich ein Image für meine PostgreSQL-Instanz und ein Image für meine Webanwendung, deren Änderungen weiterhin gespeichert werden.
Was ist ein Container?
802
3
Eine Instanz eines Bildes wird als Container bezeichnet. Sie haben ein Abbild, das, wie Sie beschreiben, aus einer Reihe von Schichten besteht. Wenn Sie dieses Abbild starten, haben Sie einen laufenden Container dieses Abbilds. Sie können viele laufende Container desselben Images haben.
Sie können alle Ihre Images mit
docker images
sehen, während Sie Ihre laufenden Container mitdocker ps
sehen können (und Sie können alle Container mitdocker ps -a
sehen).Eine laufende Instanz eines Images ist also ein Container.
Aus meinem Artikel über Automatisierte Docker-Bereitstellungen:
Docker Images vs. Container
In Dockerland gibt es Images und es gibt Container. Die beiden sind eng miteinander verwandt, aber dennoch unterschiedlich. Für mich hat das Erfassen dieser Dichotomie Docker immens verdeutlicht.
Was ist ein Image?
Ein Image ist eine inerte, unveränderliche Datei, die im Wesentlichen einen Schnappschuss eines Containers darstellt. Images werden mit dem Befehl build erstellt und erzeugen einen Container, wenn sie mit run gestartet werden. Images werden in einer Docker-Registry wie registry.hub.docker.com gespeichert. Da sie recht groß werden können, sind Images so konzipiert, dass sie aus mehreren Schichten anderer Images bestehen, so dass bei der Übertragung von Images über das Netzwerk nur eine minimale Datenmenge übertragen werden muss.
Lokale Images können durch Ausführen von
docker images
aufgelistet werden:Einige Dinge zu beachten:
-t
-Flagge desdocker build
-Befehls oder vomdocker tag
-ing eines bestehenden Images. Es steht Ihnen frei, Images mit einer Nomenklatur zu taggen, die für Sie sinnvoll ist, aber Sie sollten wissen, dass Docker das Tag als Registrierungsort in einemdocker push
oderdocker pull
verwenden wird.[REGISTRYHOST/][USERNAME/]NAME[:TAG]
. Fürubuntu
oben, wird REGISTRYHOST alsregistry.hub.docker.com
abgeleitet. Wenn Sie also vorhaben, Ihr Image mit dem Namenmy-application
in einer Registry unterdocker.example.com
zu speichern, sollten Sie dieses Image mit dem Tagdocker.example.com/my-application
versehen.latest
Tag ist nicht magisch, es ist einfach das Standard-Tag, wenn Sie kein Tag angeben.Weitere Informationen über 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.
Mit
docker ps
können Sie lokal laufende Container anzeigen:Hier führe ich eine gedockte Version der Docker-Registry aus, so dass ich einen privaten Ort zum Speichern meiner Images habe. Wiederum sind einige Dinge zu beachten:
docker ps
gibt nur laufende Container aus. Sie können alle Container (laufend oder gestoppt) mitdocker ps -a
anzeigen.--name
Flag zu identifizieren.Wie man den Aufbau von Images und Containern vermeidet
Eine meiner ersten Frustrationen mit Docker war die scheinbar ständige Anhäufung von unmarkierten Images und gestoppten Containern. Bei einer Handvoll Gelegenheiten führte diese Anhäufung zu überlasteten Festplatten, die meinen Laptop verlangsamten oder meine automatische Build-Pipeline zum Stillstand brachten. Wir sprechen von "Containern überall"!
Wir können alle ungetaggten Images entfernen, indem wir
docker rmi
mit der neuendangling=true
-Abfrage kombinieren:docker images -q --filter "dangling=true" | xargs docker rmi
Docker ist nicht in der Lage, Bilder zu entfernen, die sich hinter vorhandenen Containern befinden. Daher müssen Sie gestoppte Container möglicherweise zuerst mit
docker rm
entfernen:Dies sind bekannte Probleme mit Docker und werden möglicherweise in zukünftigen Versionen behoben. Mit einem klaren Verständnis von Images und Containern lassen sich diese Situationen jedoch mit ein paar Praktiken vermeiden:
docker rm [CONTAINER_ID]
.docker rmi [IMAGE_ID]
.Obwohl es am einfachsten ist, sich einen Container als ein laufendes Image vorzustellen, ist dies nicht ganz richtig.
Ein Image ist eigentlich eine Vorlage, die in einen Container verwandelt werden kann. Um ein Image in einen Container zu verwandeln, nimmt die Docker-Engine das Image, fügt ein Dateisystem mit Lese- und Schreibzugriff hinzu und initialisiert verschiedene Einstellungen wie Netzwerkports, Containername, ID und Ressourcenbeschränkungen. Ein laufender Container hat einen aktuell ausgeführten Prozess, aber ein Container kann auch gestoppt werden (oder beendet in der Docker-Terminologie). Ein beendeter Container ist nicht dasselbe wie ein Image, da er neu gestartet werden kann und seine Einstellungen sowie alle Änderungen am Dateisystem beibehält.