1244 Stimmen

Was ist der Unterschied zwischen einem Docker-Image und einem Container?

Bei der Verwendung von Docker beginnen wir mit einem Grundimage. Wir starten es, führen Änderungen durch und diese Änderungen werden in Schichten gespeichert, um ein anderes Image zu bilden.

Also habe ich letztendlich ein Image für meine PostgreSQL-Instanz und ein Image für meine Webanwendung, Änderungen an denen fortlaufend bestehen bleiben.

Was ist ein Container?

1632voto

Thomas Uhrig Punkte 29959

Ein Exemplar eines Bildes wird als Container bezeichnet. Du hast ein Bild, das aus Ebenen besteht, wie du beschreibst. Wenn du dieses Bild startest, hast du einen laufenden Container dieses Bildes. Du kannst viele laufende Container desselben Bildes haben.

Du kannst alle deine Bilder mit docker images sehen, während du deine laufenden Container mit docker ps sehen kannst (und du kannst alle Container mit docker ps -a sehen).

Also ist ein laufendes Exemplar eines Bildes ein Container.

706voto

calebds Punkte 24884

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:

  1. 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).
  2. 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.
  3. 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.
  4. 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.
  5. Die TAG-Spalte ist nur der [:TAG]-Teil des vollen Tags. Das ist unglückliche Terminologie.
  6. Der Tag latest ist nicht magisch, er ist einfach der Standardtag, wenn Sie keinen Tag angeben.
  7. 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:

  1. 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.
  2. docker ps gibt nur laufende Container aus. Sie können alle Container (laufend oder gestoppt) mit docker ps -a anzeigen.
  3. 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:

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

159voto

Adrian Mouat Punkte 41468

Es ist zwar am einfachsten, einen Container als ein laufendes Bild zu betrachten, das ist jedoch nicht ganz korrekt.

Ein Bild ist eigentlich eine Vorlage, die in einen Container umgewandelt werden kann. Um ein Bild in einen Container umzuwandeln, nimmt der Docker-Motor das Bild, fügt ein Dateisystem mit Schreibzugriff oben drauf hinzu und initialisiert verschiedene Einstellungen wie Netzwerkports, Containername, ID und Ressourcenbeschränkungen. Ein laufender Container hat einen gerade ausgeführten Prozess, aber ein Container kann auch gestoppt werden (oder in der Terminologie von Docker beendet werden). Ein beendeter Container ist nicht dasselbe wie ein Bild, da er neu gestartet werden kann und seine Einstellungen sowie etwaige Dateisystemänderungen beibehält.

113voto

Tk421 Punkte 5716

Vielleicht hilft es, den gesamten Workflow zu erklären.

Alles beginnt mit dem Dockerfile. Das Dockerfile ist der Quellcode des Images.

Nachdem das Dockerfile erstellt wurde, wird es erstellt, um das Image des Containers zu erstellen. Das Image ist nur die "kompilierte Version" des "Quellcodes", welcher das Dockerfile ist.

Sobald Sie das Image des Containers haben, sollten Sie es über das Registry verteilen. Die Registry ist wie ein Git-Repository - Sie können Bilder hochladen und herunterladen.

Anschließend können Sie das Image verwenden, um Container auszuführen. Ein ausgeführter Container ist in vielen Aspekten sehr ähnlich zu einer virtuellen Maschine (aber ohne den Hypervisor).

85voto

Mahmoud Zalt Punkte 27664

Dockerfile → (Erstellen) → Image → (Ausführen) → Container.

  • Dockerfile: enthält eine Reihe von Docker-Anweisungen, die Ihr Betriebssystem so einrichten, wie Sie es möchten, und alle Ihre Software installieren/konfigurieren.

  • Image: kompiliertes Dockerfile. Spart Zeit, da das Dockerfile nicht jedes Mal neu erstellt werden muss, wenn Sie einen Container ausführen möchten. Und es ist eine Möglichkeit, Ihren Bereitstellungscode zu verbergen.

  • Container: das virtuelle Betriebssystem selbst. Sie können sich darauf einloggen und beliebige Befehle ausführen, als ob es eine echte Umgebung wäre. Sie können 1000+ Container aus demselben Image starten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X