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?

8voto

tothemario Punkte 5095

Es kann hilfreich sein, ein Bild als "Momentaufnahme" eines Containers zu betrachten.

Sie können Bilder aus einem Container erstellen (neue "Momentaufnahmen") und auch neue Container aus einem Bild starten (die "Momentaufnahme" instanziieren). Sie können z. B. einen neuen Container aus einem Basisbild instanziieren, einige Befehle im Container ausführen und das dann als neues Bild "Momentaufnahme" machen. Dann können Sie 100 Container aus diesem neuen Bild instanziieren.

Weitere Dinge, die zu beachten sind:

  • Ein Bild besteht aus Schichten, und Schichten sind "Diff"-Momentaufnahmen; wenn Sie ein Bild pushen, wird nur das "Diff" an das Register gesendet.
  • Ein Dockerfile definiert einige Befehle auf einem Basisbild, die neue Schichten ("Diffs") erstellen, die in einem neuen Bild ("Momentaufnahme") resultieren.
  • Container werden immer aus Bildern instanziiert.
  • Bild-Tags sind nicht nur Tags. Sie sind der "vollständige Name" des Bildes ("Repository:Tag"). Wenn dasselbe Bild mehrere Namen hat, wird es mehrmals angezeigt, wenn Sie docker images durchführen.

8voto

Akavall Punkte 75208

Wie viele Antworten darauf hingewiesen haben: Du erstellst ein Dockerfile, um ein Image zu erhalten, und du führt das Image aus, um einen Container zu bekommen.

Die folgenden Schritte haben mir jedoch geholfen, ein besseres Gefühl dafür zu bekommen, was ein Docker-Image und ein Container sind:

1) Dockerfile erstellen:

docker build -t my_image dir_mit_dockerfile

2) Das Image in eine .tar-Datei speichern

docker save -o my_file.tar my_image_id

my_file.tar wird das Image speichern. Öffne es mit tar -xvf my_file.tar und du wirst alle Schichten sehen können. Wenn du tiefer in jede Schicht eintauchst, kannst du sehen, welche Änderungen in jeder Schicht hinzugefügt wurden. (Sie sollten ziemlich nah an den Befehlen im Dockerfile liegen).

3) Um einen Blick in einen Container zu werfen, kannst du Folgendes tun:

sudo docker run -it my_image bash

und du wirst sehen, dass es sehr ähnlich einem Betriebssystem ist.

7voto

Lord Punkte 5685

Der Docker-Client, Server, Machine, Images, Hub und Composes sind alles Projekte und Tools, die zusammenkommen, um eine Plattform zu bilden, die ein Ökosystem rund um die Erstellung und Ausführung von sogenannten Containern ermöglicht. Wenn du den Befehl docker run redis ausführst, greift etwas namens Docker CLI auf den Docker Hub zu und lädt eine einzelne Datei namens Image herunter. enter image description here

Docker Image:

Ein Image ist eine einzelne Datei, die alle Abhängigkeiten und Konfigurationen enthält, die zum Ausführen eines sehr spezifischen Programms erforderlich sind, zum Beispiel redis ist das Image, das du gerade heruntergeladen hast (indem du den Befehl docker run redis ausgeführt hast).

Dies ist eine einzelne Datei, die auf deiner Festplatte gespeichert wird und zu einem bestimmten Zeitpunkt kannst du dieses Image verwenden, um etwas namens Container zu erstellen. enter image description here

Ein Container ist eine Instanz eines Image und du kannst es als eine Art laufendes Programm mit seinem eigenen isolierten Satz von Hardware-Ressourcen betrachten, es hat also seinen eigenen kleinen Speicherbereich, sein eigenes Netzwerk und seine eigene Festplattenkapazität.

Nun schauen wir uns an, wenn du den folgenden Befehl gibst: sudo docker run hello-world

Der obige Befehl startet den Docker-Client oder Docker CLI. Der Docker CLI ist dafür zuständig, Befehle von dir entgegenzunehmen, sie ein wenig zu verarbeiten und dann die Befehle an etwas namens den Docker-Server zu übermitteln. Der Docker-Server führt dann die eigentliche Arbeit aus, wenn du den Befehl Docker run hello-world ausführst. enter image description here

Das bedeutet, dass wir einen neuen Container starten wollten, der das Image mit dem Namen hello world verwendet. Das hello world Image enthält ein kleines Programm, dessen einziger Zweck darin besteht, die Nachricht auszudrucken, die du auf dem Terminal siehst.

Als wir diesen Befehl ausführten und er an den Docker-Server übermittelt wurde, erfolgten im Hintergrund schnell eine Reihe von Aktionen. Der Docker-Server sah, dass wir versuchten, einen neuen Container mit einem Image namens hello world zu starten.

Das erste, was der Docker-Server tat, war zu überprüfen, ob er bereits eine lokale Kopie des hello world Images oder dieser Datei auf deiner persönlichen Maschine hatte. Der Docker-Server schaute also in den sogenannten Image-Cache. enter image description here

Weil du und ich gerade Docker auf unseren persönlichen Computern installiert haben, ist dieser Image-Cache derzeit leer. Wir haben keine Bilder, die zuvor heruntergeladen wurden.

Weil der Image-Cache leer war, entschied sich der Docker-Server, auf einen kostenlosen Dienst namens Docker Hub zuzugreifen. Der Docker Hub ist ein Repository kostenloser öffentlicher Images, die du frei auf deinen persönlichen Computer herunterladen und ausführen kannst. Der Docker-Server griff also auf den Docker Hub zu, lud die hello world Datei herunter und speicherte sie auf deinem Computer im Image-Cache, wo sie später schnell wieder verwendet werden kann, ohne sie erneut vom Docker-Hub herunterladen zu müssen.

Danach wird der Docker-Server sie verwenden, um eine Instanz eines Containers zu erstellen. Ein Container ist eine Instanz eines Image und hat den alleinigen Zweck, ein bestimmtes Programm auszuführen. Der Docker-Server hat also im Grunde genommen diese Image-Datei aus dem Image-Cache geladen, um eine Instanz eines Containers daraus zu erstellen und dann ein einzelnes Programm darin auszuführen. Und das alleinige Ziel dieses einzelnen Programms war es, die Nachricht auszudrucken, die du siehst.

Was ist ein Container: Zunächst einmal ist ein Image eine Blaupause dafür, wie man einen Container erstellt.

enter image description here Ein Container ist ein Prozess oder eine Gruppe von Prozessen, die speziell zugewiesene Ressourcen haben. Im Diagramm unten haben wir eine laufende Prozessinstanz, die einen Systemaufruf an einen Kernel sendet. Der Kernel prüft dann diesen eingehenden Systemaufruf und leitet ihn auf einen sehr spezifischen Teil der Festplatte, des RAMs, der CPU oder auf was auch immer es benötigt, und ein Teil jeder dieser Ressourcen wird für diesen einzelnen Prozess zur Verfügung gestellt.

7voto

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

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

Es ruft Docker-CLI auf, die dafür verantwortlich ist, Docker-Befehle entgegenzunehmen und sie in Aufrufe von Docker-Server-Befehlen umzuwandeln. Sobald der Docker-Server einen Befehl zum Ausführen eines Images erhält, überprüft er, ob der Image-Cache ein Image mit einem solchen Namen enthält.

Angenommen, hello-world existiert nicht. Der Docker-Server geht zum Docker Hub (Docker Hub ist nur ein kostenloser Speicherort für Images) und fragt: Hey Hub, hast du ein Image namens hello-world? Der Hub antwortet - ja, habe ich. Dann gib es mir bitte. Und der Download-Prozess beginnt. Sobald das Docker-Image heruntergeladen ist, legt es der Docker-Server im Image-Cache ab.

Bevor wir erklären, was Docker-Images und Docker-Container sind, lassen Sie uns mit einer Einführung darüber beginnen, wie das Betriebssystem auf Ihrem Computer funktioniert und wie es Software ausführt.

Wenn Sie zum Beispiel Chrome auf Ihrem Computer ausführen, ruft es das Betriebssystem auf, das Betriebssystem ruft selbst den Kernel auf und fragt: Hey, ich möchte dieses Programm ausführen. Der Kernel schafft es, Dateien von Ihrer Festplatte auszuführen.

Stellen Sie sich nun vor, Sie haben zwei Programme, Chrome und Node.js. Chrome benötigt Python-Version 2, um ausgeführt zu werden, und Node.js benötigt Python-Version 3. Wenn Sie nur Python v2 auf Ihrem Computer installiert haben, wird nur Chrome ausgeführt.

Um beide Fälle zum Laufen zu bringen, müssen Sie irgendwie eine Betriebssystemfunktion namens Namespacing verwenden. Ein Namespace ist eine Funktion, die es Ihnen ermöglicht, Prozesse, Festplatten, Netzwerke, Benutzer, Hostnamen und so weiter zu isolieren.

Also, wenn wir über ein Image sprechen, sprechen wir tatsächlich über einen Dateisystem-Snapshot. Ein Image ist eine physische Datei, die Anweisungen und Metadaten enthält, um einen bestimmten Container zu erstellen. Der Container selbst ist eine Instanz eines Images; es isoliert die Festplatte mit Namespacing, das nur für diesen Container verfügbar ist. Ein Container ist also ein Prozess oder eine Gruppe von Prozessen, die verschiedene Ressourcen zugewiesen bekommen.

6voto

Rohit Salecha Punkte 653

Bild ist äquivalent zu einer Klassendefinition in OOP und Ebenen sind verschiedene Methoden und Eigenschaften dieser Klasse.

Container ist die tatsächliche Instanziierung des Bildes, genauso wie ein Objekt eine Instanziierung oder eine Instanz einer Klasse ist.

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