1248 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?

60voto

Sridhar Sarnobat Punkte 21937

Arbeitsablauf

Hier ist der End-to-End-Arbeitsablauf, der die verschiedenen Befehle und deren zugehörige Eingaben und Ausgaben zeigt. Das sollte die Beziehung zwischen einem Bild und einem Container klären.

+------------+  docker build   +--------------+  docker run -dt   +-----------+  docker exec -it   +------+
| Dockerfile | --------------> |    Image     | --------------->  | Container | -----------------> | Bash |
+------------+                 +--------------+                   +-----------+                    +------+
                                 ^
                                 | docker pull
                                 |
                               +--------------+
                               |   Registry   |
                               +--------------+

Um die Bilder aufzulisten, die Sie ausführen könnten, führen Sie aus:

docker image ls

Um die Container aufzulisten, auf denen Sie Befehle ausführen könnten, führen Sie aus:

docker ps

54voto

HopeKing Punkte 2877

Ich konnte das Konzept von Bild und Layer trotz des Lesens aller Fragen hier nicht verstehen und bin schließlich auf diese exzellente Dokumentation von Docker gestoßen (duh!).

Das Beispiel dort ist wirklich der Schlüssel zum Verständnis des gesamten Konzepts. Es ist ein langer Beitrag, also fasse ich die wichtigsten Punkte zusammen, die wirklich verstanden werden müssen, um Klarheit zu erlangen.

  • Bild: Ein Docker-Image wird aus einer Reihe von schreibgeschützten Layern aufgebaut.

  • Layer: Jeder Layer stellt eine Anweisung im Dockerfile des Bildes dar.

Beispiel: Das folgende Dockerfile enthält vier Befehle, von denen jeder einen Layer erstellt.

FROM ubuntu:15.04

COPY . /app

RUN make /app

CMD python /app/app.py

Wichtig, jeder Layer ist nur eine Folge von Unterschieden zum vorherigen Layer.

  • Container. Wenn Sie einen neuen Container erstellen, fügen Sie einen neuen beschreibbaren Layer über den zugrunde liegenden Layern hinzu. Dieser Layer wird oft als "Container Layer" bezeichnet. Alle Änderungen am laufenden Container, wie das Schreiben neuer Dateien, das Ändern vorhandener Dateien und das Löschen von Dateien, werden in diesem dünnen beschreibbaren Container-Layer geschrieben.

Daher ist der wesentliche Unterschied zwischen einem Container und einem Bild der oberste beschreibbare Layer. Alle Schreibvorgänge im Container, die neue Daten hinzufügen oder vorhandene Daten ändern, werden in diesem beschreibbaren Layer gespeichert. Wenn der Container gelöscht wird, wird der beschreibbare Layer ebenfalls gelöscht. Das zugrunde liegende Bild bleibt unverändert.

Verständnis von Bildern und Containern aus einer Größen-auf-Disk-Perspektive

Um die ungefähre Größe eines laufenden Containers anzuzeigen, können Sie den Befehl docker ps -s verwenden. Sie erhalten Größe und Virtuelle Größe als zwei der Ausgaben:

  • Größe: die Menge an Daten (auf der Festplatte), die für den beschreibbaren Layer jedes Containers verwendet wird

  • Virtuelle Größe: die Menge an Daten, die für die schreibgeschützten Bilddaten verwendet werden, die vom Container verwendet werden. Mehrere Container können einige oder alle schreibgeschützten Bilddaten teilen. Daher sind diese nicht additiv. D.h. Sie können nicht alle virtuellen Größen addieren, um zu berechnen, wie viel Größe auf der Festplatte vom Bild verwendet wird

Ein weiteres wichtiges Konzept ist die Kopieraufzeichnungsstrategie

Wenn eine Datei oder ein Verzeichnis in einem darunter liegenden Layer im Bild vorhanden ist und ein anderer Layer (einschließlich des beschreibbaren Layers) Lesezugriff darauf benötigt, verwendet er einfach die vorhandene Datei. Wenn ein anderer Layer die Datei zum ersten Mal ändern muss (beim Erstellen des Bildes oder beim Ausführen des Containers), wird die Datei in diesen Layer kopiert und geändert.

Ich hoffe, dass das auch jemand anderem hilft, wie mir.

24voto

giokoguashvili Punkte 1943

Einfach gesagt, wenn ein Bild eine Klasse ist, dann ist ein Container eine Instanz einer Klasse, ein Laufzeit-Objekt.

15voto

AleQ Punkte 159

Ein Container ist einfach eine ausführbare Binärdatei, die vom Hostbetriebssystem unter einer Reihe von Einschränkungen ausgeführt werden soll, die mithilfe einer Anwendung (z.B. Docker) voreingestellt sind und dem Betriebssystem mitteilen, welche Einschränkungen anzuwenden sind.

Die typischen Einschränkungen beziehen sich auf die Prozessisolierung, die Sicherheit (wie die Verwendung von SELinux Schutz) und die Systemressourcen (Speicher, Festplatte, CPU und Netzwerk).

Bis vor kurzem unterstützten nur Kernel in Unix-basierten Systemen die Möglichkeit, ausführbare Dateien unter strengen Einschränkungen auszuführen. Deshalb dreht sich der Großteil der Containerdiskussionen heute hauptsächlich um Linux oder andere Unix-Distributionen.

Docker ist eine dieser Anwendungen, die wissen, wie sie dem Betriebssystem (meist Linux) mitteilen müssen, unter welchen Einschränkungen eine ausführbare Datei ausgeführt werden soll. Die ausführbare Datei befindet sich im Docker-Image, das einfach eine Tar-Datei ist. Diese ausführbare Datei ist in der Regel eine abgespeckte Version des Benutzerbereichs einer Linux-Distribution (Ubuntu, CentOS, Debian usw.), die vorkonfiguriert ist, um eine oder mehrere Anwendungen auszuführen.

Obwohl die meisten Menschen einen Linux-Kern als die ausführbare Datei verwenden, kann es sich um jede andere Binäranwendung handeln, solange der Kernel des Hostbetriebssystems sie ausführen kann (siehe Erstellen eines einfachen Basissystems mit Scratch). Ob die Binärdatei im Docker-Image ein Betriebssystem-Benutzerbereich oder nur eine Anwendung ist, für das Betriebssystem des Hosts ist es nur ein weiterer Prozess, ein eingeschränkter Prozess, der von voreingestellten Betriebssystemgrenzen regiert wird.

Weitere Anwendungen, die dem Hostbetriebssystem wie Docker mitteilen können, welche Grenzen auf einen Prozess angewendet werden sollen, während er läuft, sind LXC, libvirt und systemd. Docker hat früher diese Anwendungen verwendet, um indirekt mit dem Linux-Betriebssystem zu interagieren, aber jetzt interagiert Docker direkt mit Linux mithilfe seiner eigenen Bibliothek namens "libcontainer".

Container sind also nur Prozesse, die im eingeschränkten Modus laufen, ähnlich wie das, was chroot früher getan hat.

Meiner Meinung nach zeichnet sich Docker durch seine Repository (Docker Hub) und deren Verwaltungstools aus, die die Arbeit mit Containern äußerst einfach machen.

Siehe [Docker (Software)](https://en.wikipedia.org/wiki/Docker(software))_.

14voto

kweku360 Punkte 1025

Das Kernkonzept von Docker besteht darin, es einfach zu machen, "Maschinen" zu erstellen, die in diesem Fall als Container betrachtet werden können. Der Container unterstützt die Wiederverwendbarkeit und ermöglicht es Ihnen, Container einfach zu erstellen und zu löschen.

Bilder stellen den Zustand eines Containers zu jedem Zeitpunkt dar. Der grundlegende Arbeitsablauf ist also:

  1. ein Bild erstellen
  2. einen Container starten
  3. Änderungen am Container vornehmen
  4. den Container wieder als Bild speichern

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