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


924

Bei Verwendung von Docker beginnen wir mit einem Basis-Image. Wir booten es, erstellen Änderungen und diese Änderungen werden in Ebenen gespeichert, die ein anderes Bild bilden.

Schließlich habe ich ein Image für meine PostgreSQL-Instanz und ein Image für meine Webanwendung, dessen Änderungen weiterhin beibehalten werden.

Was ist ein Container?


Bevor Sie zu komplexen Detaled-Antworten springen, lautet die Antwort eines Laien auf Ihre ursprüngliche Frage: sunilk.work/what-is-docker-with-example
Sunil Kumar vor

Antworten:


1241

Eine Instanz eines Bildes wird als Container bezeichnet. Sie haben ein Bild, bei dem es sich um eine Reihe von Ebenen handelt, die Sie beschreiben. Wenn Sie dieses Bild starten, haben Sie einen laufenden Container dieses Bildes. Sie können viele laufende Container desselben Images haben.

Sie können alle Ihre Bilder mit sehen, docker imageswährend Sie Ihre laufenden Container mit sehen können docker ps(und Sie können alle Container mit sehen docker ps -a).

Eine laufende Instanz eines Bildes ist also ein Container.


107
Was ist also der Unterschied zwischen einem Bild und einem gestoppten Container?
Victor Dombrovsky

342
Das Bild ist das Rezept, der Behälter ist der Kuchen ;-) Sie können mit einem bestimmten Rezept so viele Kuchen machen, wie Sie möchten
Julien

142
@ VictorDombrovsky Ein angehaltener Behälter ist ein Kuchen im Gefrierschrank.
Jacob Ford

44
@ Julien Wenn das Bild das Rezept ist, was ist mit der Docker-Datei? :)
Johnny Willer

71
@JohnnyWiller Analogien haben ihre Grenzen, aber vielleicht können wir sehen, dass das Dockerfile Ihre Einkaufsliste für Zutaten ist ;-). Ansonsten nenne das Dockerfile das Rezept, das Bild die Form, der Behälter ist immer noch der leckere Kuchen
Julien

585

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:

  1. 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).
  2. 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.
  3. Der Wert in der Spalte REPOSITORY stammt aus dem -tFlag des docker buildBefehls oder aus docker tageinem 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 pushoder verwendet docker pull.
  4. Die vollständige Form eines Tags ist [REGISTRYHOST/][USERNAME/]NAME[:TAG]. Für ubuntuoben wird REGISTRYHOST abgeleitet registry.hub.docker.com. Wenn Sie also vorhaben, Ihr my-applicationin einer Registrierung aufgerufenes Bild unter zu speichern, sollten Sie dieses Bild mit einem docker.example.comTag versehen docker.example.com/my-application.
  5. Die TAG-Spalte ist nur der [: TAG] -Teil des vollständigen Tags. Dies ist eine unglückliche Terminologie.
  6. Das latestTag ist nicht magisch, es ist einfach das Standard-Tag, wenn Sie kein Tag angeben.
  7. 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:

  1. 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.
  2. docker psgibt nur laufende Container aus. Sie können alle Container ( ausgeführt oder gestoppt ) mit anzeigen docker ps -a.
  3. NAMES kann verwendet werden, um einen gestarteten Container über das --nameFlag 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 rmimit der letzten dangling=trueAbfrage 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 rmzuerst 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:

  1. Entfernen Sie immer einen unbrauchbaren, gestoppten Behälter mit docker rm [CONTAINER_ID].
  2. Entfernen Sie immer das Bild hinter einem unbrauchbaren, gestoppten Behälter mit docker rmi [IMAGE_ID].

5
Gute Unterscheidung zwischen Bildern und Container. Hilft Anfängern wie mir sehr.
Gibbs

2
Ich denke, ich bin fest davon überzeugt, wie Bilder ausgeführt werden (ich verwende boot2docker unter Windows). Warum erstellen wir Bilder für Anwendungen, sagen wir MySQL? Wie läuft MySQL zu diesem Zeitpunkt überhaupt? Benötige ich kein Linux-Image, um MySQL darüber auszuführen?
Kenny Worden

Eigentlich stimmt das nicht: "Wenn der Docker das: neueste Tag eines Bildes zieht, werden mindestens zwei Bilder zu Ihrer lokalen Bildliste hinzugefügt: eines mit dem neuesten Tag und eines für jedes Original-Tag des neuesten Bildes, z. B. 14.04 und Trysty oben. " Es wird nur ein Bild mit dem neuesten Tag hinzugefügt. Das spätere Ziehen von 14.04 kann ein No-Op sein, wenn die Bild-ID identisch ist, erfordert jedoch immer noch ein separates Ziehen.
Adrian Mouat

4
In neueren Docker-Versionen können Sie docker image prunebaumelnde Bilder bereinigen. Beschneiden Sie nicht verwendete Docker-Objekte
Dario Seidl

3
Ich benutze nur, docker system pruneum ALLES zu reinigen
Rami Alloush

137

In einfachen Worten.

Bilder -

Das Dateisystem und die Konfigurationsanwendung (schreibgeschützt), mit denen Container erstellt werden. Mehr Details .

Container -

Hier werden Instanzen von Docker-Images ausgeführt. In Containern werden die eigentlichen Anwendungen ausgeführt. Ein Container enthält eine Anwendung und alle ihre Abhängigkeiten. Es teilt den Kernel mit anderen Containern und wird als isolierter Prozess im Benutzerbereich des Host-Betriebssystems ausgeführt. Mehr Details .


Weitere wichtige Begriffe zu beachten:


Docker-Daemon -

Der Hintergrunddienst, der auf dem Host ausgeführt wird, der das Erstellen, Ausführen und Verteilen von Docker-Containern verwaltet.

Docker-Client -

Das Befehlszeilentool, mit dem der Benutzer mit dem Docker-Dämon interagieren kann.

Docker Store -

Store ist unter anderem eine Registrierung von Docker-Images. Sie können sich die Registrierung als ein Verzeichnis aller verfügbaren Docker-Images vorstellen.

Ein Bild aus diesem Blogbeitrag sagt mehr als tausend Worte.

Geben Sie hier die Bildbeschreibung ein

(Für ein tieferes Verständnis lesen Sie dies bitte .)

Zusammenfassung:

  • Pull Bild von Docker Hub oder Build von einem Dockerfile => Gibt ein Docker Bild (nicht editierbar).
  • Führen Sie das Bild aus ( docker run image_name:tag_name) => Gibt ein laufendes Bild, dh einen Container (bearbeitbar).

1
Vielen Dank. Woher stammt das Diagramm? ist es aus Dockers offiziellen Dokumenten?

Das gepostete Bild ist fantastisch . Ein Anliegen, das ich habe: Sie sagen "Ich habe es beim Lesen eines Artikels gefunden" - Wenn es nicht Ihr Diagramm ist, ist es moralisch wichtig [und gesetzlich vorgeschrieben], Kredit zu geben, wo dies fällig ist ("Zuschreibung"): Der ursprüngliche Bildautor ist WHO? Ursprünglich unter welcher URL gefunden?
ToolmakerSteve

@ToolmakerSteve Danke für den Tipp, ich werde daran denken und die Antwort aktualisieren, sobald ich die Quelle gefunden habe.
Imran Ahmad

126

Es ist zwar am einfachsten, sich einen Container als laufendes Image vorzustellen, dies ist jedoch nicht ganz richtig.

Ein Bild ist wirklich eine Vorlage, die in einen Container verwandelt werden kann. Um ein Image in einen Container umzuwandeln, nimmt die Docker-Engine das Image auf, fügt ein Lese- / Schreib-Dateisystem hinzu und initialisiert verschiedene Einstellungen, einschließlich Netzwerkports, Containername, ID und Ressourcenbeschränkungen. Ein laufender Behälter hat einen gegenwärtig ausgeführten Prozess, sondern ein Behälter kann auch (oder gestoppt werden , verlassen in Docker Terminologie). Ein verlassener Container ist nicht mit einem Image identisch, da er neu gestartet werden kann und seine Einstellungen und Änderungen am Dateisystem beibehält.


Wie verwandle ich ein Bild in einen Container, ohne es auszuführen?
Janus Troelsen

12
@ JanusTroelsen Verwendung docker create.
Adrian Mouat

1
Das ist etwas verwirrend. Wir sagen, dass Bilder unveränderlich sind, aber wenn sie als Container ausgeführt werden, werden alle Änderungen an der veränderlichen obersten Ebene gespeichert, wie Sie sagten. Wenn diese Änderungen gestoppt werden, werden sie dann als neue Ebene im Bild gespeichert? Wenn ja, wie war es dann möglich, dass das Originalbild unveränderlich sein sollte?
Dchucks

4
OK, habe etwas gelesen und die Antwort in diesem Thread selbst bekommen. "Wenn der Container gelöscht wird, wird auch die beschreibbare Ebene gelöscht. Das zugrunde liegende Bild bleibt unverändert."
Dchucks

Sehr hilfreiche Antwort. Ich war vorher verwirrt. Wenn ich ein Image DL, es als Container ausführe, eine zufällige Textdatei in diesen Container lege und den Container stoppe, befindet sich die Textdatei im gestoppten Container, aber NICHT in dem von mir heruntergeladenen Basis-Image.
James Allen

89

Vielleicht kann es helfen, den gesamten Workflow zu erklären.

Alles beginnt mit der Docker-Datei . Die Docker-Datei ist der Quellcode des Bildes.

Sobald die Docker-Datei erstellt wurde, erstellen Sie sie, um das Image des Containers zu erstellen . Das Bild ist nur die "kompilierte Version" des "Quellcodes", der Docker-Datei.

Sobald Sie das Image des Containers haben, sollten Sie es mithilfe der Registrierung neu verteilen . Die Registrierung ist wie ein Git-Repository - Sie können Bilder pushen und ziehen.

Als Nächstes können Sie das Image zum Ausführen von Containern verwenden . Ein laufender Container ist in vielerlei Hinsicht einer virtuellen Maschine sehr ähnlich (jedoch ohne Hypervisor ).


44

Arbeitsablauf

Hier ist der End-to-End-Workflow, der die verschiedenen Befehle und die zugehörigen Ein- und Ausgänge zeigt. Das sollte die Beziehung zwischen einem Bild und einem Container verdeutlichen.

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

Führen Sie Folgendes aus, um die Bilder aufzulisten, die Sie ausführen können:

docker image ls

So listen Sie die Container auf, für die Sie Befehle ausführen können:

docker ps

1
Ein umfassenderes Workflow-Diagramm finden Sie hier: stackoverflow.com/a/46528745/714112
Sridhar Sarnobat

1
Das erforderliche Scrollen in dieser ASCII-Grafik ist jedoch ein Problem.
Peter Mortensen

Unicode könnte stattdessen verwendet werden, um besser aussehende Boxen zu erhalten. Ein Online-Tool ist die Javascript Box Drawing Demo .
Peter Mortensen

40

Ich konnte das Konzept von Bild und Ebene nicht verstehen, obwohl ich alle Fragen hier gelesen hatte, und stieß schließlich auf diese hervorragende Dokumentation von Docker (duh!).

Das Beispiel dort ist wirklich der Schlüssel, um das gesamte Konzept zu verstehen. Es ist ein langer Beitrag, daher fasse ich die wichtigsten Punkte zusammen, die wirklich verstanden werden müssen, um Klarheit zu erhalten.

  • Bild : Ein Docker-Bild besteht aus einer Reihe von schreibgeschützten Ebenen

  • Ebene : Jede Ebene repräsentiert eine Anweisung in der Docker-Datei des Bildes.

Example: Die folgende Docker-Datei enthält vier Befehle, von denen jeder eine Ebene erstellt.

AB Ubuntu: 15.04

KOPIEREN . / app

RUN make / app

CMD-Python /app/app.py

Wichtig ist , dass jede Ebene nur eine Reihe von Unterschieden zu der vorherigen Ebene aufweist.

  • Behälter . Wenn Sie einen neuen Container erstellen, fügen Sie über den zugrunde liegenden Ebenen eine neue beschreibbare Ebene hinzu . Diese Schicht wird oft als "Containerebene" bezeichnet. Alle am laufenden Container vorgenommenen Änderungen, z. B. das Schreiben neuer Dateien, das Ändern vorhandener Dateien und das Löschen von Dateien, werden in diese dünne beschreibbare Containerebene geschrieben.

Daher ist der Hauptunterschied zwischen einem Container und einem Bild die oberste beschreibbare Ebene . Alle Schreibvorgänge in den Container, die neue Daten hinzufügen oder vorhandene Daten ändern, werden in dieser beschreibbaren Ebene gespeichert. Wenn der Container gelöscht wird, wird auch die beschreibbare Ebene gelöscht. Das zugrunde liegende Bild bleibt unverändert.

Grundlegendes zu Bildern und Containern aus der Perspektive der Größe auf der Festplatte

Mit dem docker ps -sBefehl können Sie die ungefähre Größe eines laufenden Containers anzeigen . Sie erhalten sizeund virtual sizeals zwei der Ausgänge:

  • Größe: Die Datenmenge (auf der Festplatte), die für die beschreibbare Ebene jedes Containers verwendet wird

  • Virtuelle Größe: Die Datenmenge, die für die vom Container verwendeten schreibgeschützten Bilddaten verwendet wird. Mehrere Container können einige oder alle schreibgeschützten Bilddaten gemeinsam nutzen. Daher sind diese nicht additiv. Das heißt, Sie können nicht alle virtuellen Größen hinzufügen, um zu berechnen, wie viel Größe auf der Festplatte vom Image verwendet wird

Ein weiteres wichtiges Konzept ist die Copy-on-Write-Strategie

Wenn eine Datei oder ein Verzeichnis in einer unteren Ebene des Bildes vorhanden ist und eine andere Ebene (einschließlich der beschreibbaren Ebene) Lesezugriff darauf benötigt, wird nur die vorhandene Datei verwendet. Wenn eine andere Ebene die Datei zum ersten Mal ändern muss (beim Erstellen des Images oder beim Ausführen des Containers), wird die Datei in diese Ebene kopiert und geändert.

Ich hoffe das hilft jemand anderem wie mir.


1
Dank dieses Kommentars wird der Unterschied zwischen Größe und virtueller Größe bestätigt. Für mehrere Container ist es sehr interessant, dass sie dieselben schreibgeschützten Daten verwenden, und es ist ein Gewinn an Speicherplatz.
user1842947

34

Dockerfile → (Build) → Image → (Run) → Container .

  • Docker- Datei : Enthält eine Reihe von Docker-Anweisungen, die Ihr Betriebssystem nach Ihren Wünschen bereitstellen und Ihre gesamte Software installieren / konfigurieren.

  • Bild : kompilierte Docker-Datei. Spart Ihnen Zeit, die Docker-Datei jedes Mal neu zu erstellen, wenn Sie einen Container ausführen müssen. Auf diese Weise können Sie Ihren Bereitstellungscode ausblenden.

  • Container : das virtuelle Betriebssystem selbst. Sie können darauf zugreifen und beliebige Befehle ausführen, als wäre es eine echte Umgebung. Sie können mehr als 1000 Container mit demselben Image ausführen.


Hervorragende Analogie. Wenn ich Ihnen 1000 Daumen hoch geben könnte, würde ich.
Rich Lysakowski PhD

16

Einfach gesagt, wenn ein Bild a Klasse , dann wird ein Behälter eine Instanz einer Klasse ist eine Laufzeit ist Objekt .


13

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

Die typischen Einschränkungen betreffen die Prozessisolation, die Sicherheit (wie die Verwendung des SELinux- Schutzes) 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. Aus diesem Grund handelt es sich bei den meisten heutigen Container-Gesprächen hauptsächlich um Linux- oder andere Unix-Distributionen.

Docker ist eine dieser Anwendungen, die dem Betriebssystem (meistens Linux) mitteilen kann, unter welchen Einschränkungen eine ausführbare Datei ausgeführt werden soll. Die ausführbare Datei ist im Docker-Image enthalten, das nur eine Tarfile ist. Diese ausführbare Datei ist normalerweise eine abgespeckte Version einer Linux-Distribution (Ubuntu, CentOS, Debian usw.), die für die Ausführung einer oder mehrerer Anwendungen vorkonfiguriert ist.

Obwohl die meisten Benutzer eine Linux-Basis als ausführbare Datei verwenden, kann es sich um jede andere Binäranwendung handeln, solange das Host-Betriebssystem sie ausführen kann (siehe Erstellen eines einfachen Basis-Images mit Scratch ). Unabhängig davon, ob die Binärdatei im Docker-Image ein Betriebssystem oder nur eine Anwendung ist, ist es für den Betriebssystemhost nur ein weiterer Prozess, ein enthaltener Prozess, der von voreingestellten Betriebssystemgrenzen beherrscht wird.

Andere Anwendungen, die wie Docker dem Host-Betriebssystem mitteilen können, welche Grenzen auf einen Prozess während der Ausführung angewendet werden sollen, sind LXC , libvirt und systemd . Früher verwendete Docker diese Anwendungen, um indirekt mit dem Linux-Betriebssystem zu interagieren. Jetzt interagiert Docker direkt mit Linux über eine eigene Bibliothek namens " libcontainer ".

Container sind also nur Prozesse, die in einem eingeschränkten Modus ausgeführt werden, ähnlich wie es früher bei chroot der Fall war .

IMO, was Docker von jeder anderen Containertechnologie unterscheidet, ist sein Repository (Docker Hub) und seine Verwaltungstools, die das Arbeiten mit Containern extrem einfach machen.

Siehe Docker (Software) .


12

Das Kernkonzept von Docker besteht darin, die Erstellung von "Maschinen" zu vereinfachen, die in diesem Fall als Container betrachtet werden können. Der Container unterstützt die Wiederverwendbarkeit und ermöglicht das einfache Erstellen und Löschen von Containern.

Bilder zeigen den Zustand eines Containers zu jedem Zeitpunkt. Der grundlegende Workflow lautet also:

  1. Erstellen Sie ein Bild
  2. Starten Sie einen Container
  3. Nehmen Sie Änderungen am Container vor
  4. Speichern Sie den Container als Bild zurück

8

Wie viele Antworten darauf hinwiesen: Sie erstellen Dockerfile , um ein Image zu erhalten, und Sie führen ein Image aus , um einen Container zu erhalten .

Die folgenden Schritte haben mir jedoch geholfen, ein besseres Gefühl für das Docker-Image und den Container zu bekommen:

1) Dockerfile erstellen:

docker build -t my_image dir_with_dockerfile

2) Speichern Sie das Bild in einer .tarDatei

docker save -o my_file.tar my_image_id

my_file.tarspeichert das Bild. Öffnen Sie es mit tar -xvf my_file.tar, und Sie werden alle Ebenen sehen. Wenn Sie tiefer in jede Ebene eintauchen, können Sie sehen, welche Änderungen in jeder Ebene hinzugefügt wurden. (Sie sollten den Befehlen in der Docker-Datei ziemlich nahe kommen.)

3) Um einen Blick in einen Container zu werfen, haben Sie folgende Möglichkeiten:

sudo docker run -it my_image bash

und Sie können sehen, dass dies einem Betriebssystem sehr ähnlich ist.


6

Image entspricht einer Klassendefinition in OOP, und Layer sind verschiedene Methoden und Eigenschaften dieser Klasse.

Container ist die eigentliche Instanziierung des Bildes, genau wie ein Objekt eine Instanziierung oder eine Instanz einer Klasse ist.


4

Ich denke, es ist besser, am Anfang zu erklären.

Angenommen, Sie führen den Befehl aus docker run hello-world. Was geschieht?

Es ruft die Docker-CLI auf, die dafür verantwortlich ist, Docker-Befehle zu übernehmen und in Docker-Serverbefehle aufzurufen . Sobald der Docker-Server einen Befehl zum Ausführen eines Bildes erhält , prüft er, ob der Bildcache ein Bild mit einem solchen Namen enthält.

Angenommen, die Hallo-Welt existiert nicht. Der Docker-Server wechselt zu Docker Hub (Docker Hub ist nur ein kostenloses Repository für Bilder) und fragt, hey Hub, haben Sie ein Bild namens hello-world? Hub-Antworten - ja, das tue ich. Dann gib es mir bitte. Und der Download-Vorgang beginnt. Sobald das Docker-Image heruntergeladen wurde, legt der Docker-Server es im Image-Cache ab .

Bevor wir erklären, was Docker-Images und Docker-Container sind, beginnen wir mit einer Einführung in das Betriebssystem auf Ihrem Computer und die Ausführung von Software.

Wenn Sie beispielsweise Chrome auf Ihrem Computer ausführen, ruft es das Betriebssystem auf, das Betriebssystem selbst ruft den Kernel auf und fragt, hey, ich möchte dieses Programm ausführen. Der Kernel kann Dateien von Ihrer Festplatte ausführen.

Stellen Sie sich nun vor, Sie haben zwei Programme, Chrome und Node.js. Für Chrome muss Python Version 2 und für Node.js Python Version 3 ausgeführt werden. Wenn Sie nur Python v2 auf Ihrem Computer installiert haben, wird nur Chrome ausgeführt.

Damit beide Fälle funktionieren, müssen Sie eine Betriebssystemfunktion verwenden, die als Namespace bezeichnet wird. Ein Namespace ist eine Funktion, mit der Sie Prozesse, Festplatten, Netzwerke, Benutzer, Hostnamen usw. isolieren können.

Wenn wir also über ein Image sprechen , sprechen wir tatsächlich über einen Dateisystem-Snapshot. Ein Bild ist eine physische Datei, die Anweisungen und Metadaten zum Erstellen eines bestimmten Containers enthält . Der Container selbst ist eine Instanz eines Bildes . Es isoliert die Festplatte mithilfe des Namespaces, der nur für diesen Container verfügbar ist . Ein Container ist also ein Prozess oder eine Reihe von Prozessen, die verschiedene ihm zugewiesene Ressourcen gruppieren.


3

Ein Docker-Image packt die Anwendung und Umgebung, die von der Anwendung zum Ausführen benötigt werden, und ein Container ist eine laufende Instanz des Images.

Bilder sind der Packteil von Docker, analog zu "Quellcode" oder "Programm". Container sind der Ausführungsteil von Docker, analog zu einem "Prozess".

In der Frage wird nur auf den Teil "Programm" verwiesen, und das ist das Bild. Der "laufende" Teil von Docker ist der Container. Wenn ein Container ausgeführt wird und Änderungen vorgenommen werden, ändert der Prozess seinen eigenen Quellcode und speichert ihn als neues Image.


3

Wie im Programmieraspekt,

Bild ist Quellcode.

Wenn Quellcode kompiliert und erstellt wird, wird er als Anwendung bezeichnet.

Ähnlich wie "Wenn eine Instanz für das Image erstellt wird" wird sie als " Container " bezeichnet.


1
Dockerfile ist wie Quellcode. Das Image ist wie eine ausführbare Datei, nachdem der Quellcode kompiliert / erstellt wurde. Ein Container ist wie eine Anwendung, die über die ausführbare Datei ausgeführt wird.
ejlp12

Image ist NICHT der Quellcode für einen Container. Die Docker-Datei ist die Metaklasse oder Spezifikation für die Klasse. Das Bild ist eine Klasse oder Vorlage für den Container, und der Container ist die Instanz der Klasse. Der Container ist eine Instanz, die ausgeführt wird. Sie können 1000 Instanzen einer Klasse haben. Ein Bild ist wie kompilierter Objektcode, der mit einem anderen Programm verknüpft und als Teil dieses Programms ausgeführt werden kann.
Rich Lysakowski PhD

3

Ein Bild ist eine "Momentaufnahme" eines Containers . Sie können Bilder aus einem Container erstellen (neue "Schnappschüsse") und neue Container aus einem Bild starten (den "Schnappschuss" instanziieren).

Sie können beispielsweise einen neuen Container aus einem Basis-Image instanziieren, einige Befehle im Container ausführen und diesen dann als neues Image erstellen. Dann können Sie 100 Container von diesem neuen Image ausführen.

Andere Dinge zu beachten:

  • Ein Bild besteht aus Ebenen, und Ebenen sind Schnappschuss-Diffs (wenn Sie also ein Bild verschieben, müssen Sie nur das "Diff" an die Registrierung senden).
  • Eine Docker-Datei definiert einige Befehle über einem Basis-Image, wodurch neue Ebenen ("Diffs") erstellt werden, die zu einem neuen Image ("Snapshot") führen.
  • Bild-Tags sind nicht nur Tags. Sie sind der "vollständige Name" des Bildes ("Repository: Tag"). Wenn dasselbe Bild mehrere Namen hat, wird es dabei mehrmals angezeigt docker images.

Diese Antwort hat es rückwärts. Ein Container ist eine Instanz eines Bildes oder eine ausführbare Momentaufnahme eines Bildes. Das Image wird nicht direkt ausgeführt, da es die übergeordnete Klasse der Instanz ist. Die Instanz (Container) ist ein
untergeordnetes Element

Diese Antwort beginnt am Ende des Prozesses. Ein neues Image kann als Momentaufnahme eines Containers erstellt werden, aber alle Container mussten ein übergeordnetes Image haben. In diesem Fall gibt es hier kein Henne-Ei-Problem, da zuerst ein erstes Urbild aus einer Docker-Datei erstellt werden muss. Zuerst kam die Docker-Datei, dann das Bild, dann der Container. Ein Container kann als Grundlage für ein neues Bild verwendet werden, dieser Container musste jedoch ein "übergeordnetes Bild" haben.
Rich Lysakowski PhD

3

Ich möchte den fehlenden Teil hier zwischen docker imagesund füllen containers. Docker verwendet ein UFS ( Union File System ) für Container, mit dem mehrere Dateisysteme in einer Hierarchie bereitgestellt und als ein einziges Dateisystem angezeigt werden können. Das Dateisystem aus dem Image wurde als Ebene bereitgestellt, und alle Änderungen am laufenden Container werden an einer darüber bereitgestellten Ebene vorgenommen. Aus diesem Grund muss Docker nur die oberste Lese- / Schreibschicht betrachten, um die am laufenden System vorgenommenen Änderungen zu finden.read-onlyread-write


1

Für eine Dummy-Programmieranalogie kann man sich vorstellen, dass Docker eine abstrakte ImageFactory hat, die ImageFactories enthält, die aus dem Geschäft stammen .

Sobald Sie eine App aus dieser ImageFactory erstellen möchten, haben Sie einen neuen Container, den Sie nach Belieben ändern können. DotNetImageFactory ist unveränderlich, da es als abstrakte Factory-Klasse fungiert und nur die von Ihnen gewünschten Instanzen liefert.

IContainer newDotNetApp = ImageFactory.DotNetImageFactory.CreateNew(appOptions);
newDotNetApp.ChangeDescription("I am making changes on this instance");
newDotNetApp.Run();

1

Zusamenfassend:

Container ist eine Abteilung (virtuell) in einem Kernel, die ein gemeinsames Betriebssystem verwendet und ein Image (Docker-Image) ausführt.

Ein Container ist eine selbsttragende Anwendung, die Pakete und alle erforderlichen Abhängigkeiten enthält, um den Code auszuführen.


1

In einem Docker-Container wird eine Instanz eines Images ausgeführt. Sie können ein Bild mit einem Programm und einen Container mit einem Prozess verknüpfen :)


1

Ein Bild ist für eine Klasse ein Container für ein Objekt.

Ein Container ist eine Instanz eines Bildes, da ein Objekt eine Instanz einer Klasse ist.


1

Dockerfile ist wie Ihr Bash-Skript, das einen Tarball erzeugt (Docker-Image).

Docker-Container sind wie eine extrahierte Version des Tarballs. Sie können beliebig viele Kopien in verschiedenen Ordnern (den Containern) haben.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.