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?
docker
docker-container
docker-image
bibstha
quelle
quelle
Antworten:
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 images
während Sie Ihre laufenden Container mit sehen könnendocker ps
(und Sie können alle Container mit sehendocker ps -a
).Eine laufende Instanz eines Bildes ist also ein Container.
quelle
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
:Einige Dinge zu beachten:
-t
Flag desdocker build
Befehls oder ausdocker tag
einem 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 einemdocker push
oder verwendetdocker pull
.[REGISTRYHOST/][USERNAME/]NAME[:TAG]
. Fürubuntu
oben wird REGISTRYHOST abgeleitetregistry.hub.docker.com
. Wenn Sie also vorhaben, Ihrmy-application
in einer Registrierung aufgerufenes Bild unter zu speichern, sollten Sie dieses Bild mit einemdocker.example.com
Tag versehendocker.example.com/my-application
.latest
Tag ist nicht magisch, es ist einfach das Standard-Tag, wenn Sie kein Tag angeben.<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
: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:
docker ps
gibt nur laufende Container aus. Sie können alle Container ( ausgeführt oder gestoppt ) mit anzeigendocker ps -a
.--name
Flag 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 rmi
mit der letztendangling=true
Abfrage 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 rm
zuerst entfernen mit :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:
docker rm [CONTAINER_ID]
.docker rmi [IMAGE_ID]
.quelle
docker image prune
baumelnde Bilder bereinigen. Beschneiden Sie nicht verwendete Docker-Objektedocker system prune
um ALLES zu reinigenIn einfachen Worten.
Bilder -
Container -
Weitere wichtige Begriffe zu beachten:
Docker-Daemon -
Docker-Client -
Docker Store -
Ein Bild aus diesem Blogbeitrag sagt mehr als tausend Worte.
(Für ein tieferes Verständnis lesen Sie dies bitte .)
Zusammenfassung:
docker run image_name:tag_name
) => Gibt ein laufendes Bild, dh einen Container (bearbeitbar).quelle
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.
quelle
docker create
.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 ).
quelle
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.
Führen Sie Folgendes aus, um die Bilder aufzulisten, die Sie ausführen können:
So listen Sie die Container auf, für die Sie Befehle ausführen können:
quelle
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.Wichtig ist , dass jede Ebene nur eine Reihe von Unterschieden zu der vorherigen Ebene aufweist.
Grundlegendes zu Bildern und Containern aus der Perspektive der Größe auf der Festplatte
Mit dem
docker ps -s
Befehl können Sie die ungefähre Größe eines laufenden Containers anzeigen . Sie erhaltensize
undvirtual size
als 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.
quelle
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.
quelle
Einfach gesagt, wenn ein Bild a Klasse , dann wird ein Behälter eine Instanz einer Klasse ist eine Laufzeit ist Objekt .
quelle
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) .
quelle
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:
quelle
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
.tar
Dateidocker save -o my_file.tar my_image_id
my_file.tar
speichert das Bild. Öffnen Sie es mittar -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.
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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:
docker images
.quelle
Ich möchte den fehlenden Teil hier zwischen
docker images
und füllencontainers
. 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-only
read-write
quelle
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.
quelle
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.
quelle
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 :)
quelle
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.
quelle
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.
quelle