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?

Lösung

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 mit docker ps sehen können (und Sie können alle Container mit docker ps -a sehen).

Eine laufende Instanz eines Images ist also ein Container.

Kommentare (14)

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:

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
                                  4ab0d9120985        3 months ago        486.5 MB

Einige Dinge zu beachten:

  1. IMAGE ID sind die ersten 12 Zeichen des wahren Identifikators für ein Bild. Sie können viele Tags für ein bestimmtes Bild erstellen, aber ihre IDs werden alle gleich sein (wie oben).
  2. Die VIRTUELLE GRÖSSE ist virtuell, weil sie die Größen aller einzelnen darunter liegenden Ebenen addiert. Das bedeutet, dass die Summe aller Werte in dieser Spalte wahrscheinlich viel größer ist als der von all diesen Bildern belegte Speicherplatz.
  3. Der Wert in der Spalte REPOSITORY stammt von der -t-Flagge des docker build-Befehls oder vom docker 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 einem docker push oder docker pull verwenden wird.
  4. Die vollständige Form eines Tags ist [REGISTRYHOST/][USERNAME/]NAME[:TAG]. Für ubuntu oben, wird REGISTRYHOST als registry.hub.docker.com abgeleitet. Wenn Sie also vorhaben, Ihr Image mit dem Namen my-application in einer Registry unter docker.example.com zu speichern, sollten Sie dieses Image mit dem Tag docker.example.com/my-application versehen.
  5. Die TAG Spalte ist nur der [:TAG] Teil des full Tags. Dies ist eine unglückliche Terminologie.
  6. Das latest Tag ist nicht magisch, es ist einfach das Standard-Tag, wenn Sie kein Tag angeben.
  7. Sie können unmarkierte Bilder haben, die nur durch ihre IMAGE IDs identifizierbar sind. Diese erhalten den `` TAG und REPOSITORY. Es ist leicht, sie zu vergessen.

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:

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 gedockte Version der Docker-Registry aus, so dass ich einen privaten Ort zum Speichern meiner Images habe. Wiederum sind einige Dinge zu beachten:

  1. Wie die IMAGE ID ist auch die CONTAINER ID der eigentliche Bezeichner für den Container. Sie hat die gleiche Form, aber sie identifiziert eine andere Art von Objekt.
  2. docker ps gibt nur laufende Container aus. Sie können alle Container (laufend oder gestoppt) mit docker ps -a anzeigen.
  3. NAMES kann verwendet werden, um einen gestarteten Container über das --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 neuen dangling=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:

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

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:

  1. Entfernen Sie immer einen nutzlosen, gestoppten Container mit docker rm [CONTAINER_ID].
  2. Entfernen Sie immer das Image hinter einem unbrauchbaren, gestoppten Container mit docker rmi [IMAGE_ID].
Kommentare (11)

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.

Kommentare (5)