Dieser Artikel stellt den Unterschied zwischen Containern und Bildern in Docker vor. Ich hoffe, er kann Ihnen helfen.
(Empfohlenes Tutorial: Docker-Tutorial)
Als ich noch wenig Wissen über die Docker-Technologie hatte, fiel es mir sehr schwer, Docker-Befehle zu verstehen. Also habe ich ein paar Wochen damit verbracht, zu lernen, wie Docker funktioniert, oder genauer gesagt, das Union-Dateisystem, und als ich dann auf die Docker-Befehle zurückblickte, stellte sich heraus, dass alles ganz einfach war.
Exkurs: Persönlich besteht der beste Weg, eine Technologie zu beherrschen und rational zu nutzen, darin, die Funktionsprinzipien hinter der Technologie genau zu verstehen. Normalerweise wird die Geburt einer neuen Technologie oft von einem Medienrummel und einem Hype begleitet, der es den Benutzern erschwert, die wahre Natur der Technologie zu erkennen. Vielmehr erfinden neue Technologien immer neue Begriffe oder Metaphern, um zu informieren
Dies ist in der Anfangsphase sehr hilfreich, stellt jedoch eine Schicht Sandpapier auf das Prinzip der Technologie, was den Benutzern nicht förderlich ist, die wahre Bedeutung der Technologie in der späteren Phase zu beherrschen.
Git ist ein gutes Beispiel. Ich konnte Git vorher nicht gut nutzen, also habe ich einige Zeit damit verbracht, die Prinzipien von Git zu erlernen. Erst dann habe ich die Verwendung von Git wirklich verstanden. Ich bin fest davon überzeugt, dass nur diejenigen, die die Interna von Git wirklich verstehen, dieses Tool beherrschen können.
Bild ist die einheitliche Perspektive einer Reihe schreibgeschützter Ebenen. Möglicherweise ist diese Definition etwas schwer zu verstehen. Das folgende Bild kann den Lesern helfen, die Definition von Bild zu verstehen.
Von links sehen wir mehrere schreibgeschützte Ebenen, die sich überlappen. Mit Ausnahme der untersten Ebene verfügen alle anderen Ebenen über einen Zeiger, der auf die nächste Ebene zeigt. Bei diesen Ebenen handelt es sich um Implementierungsdetails innerhalb von Docker, auf die über das Dateisystem des Hosts zugegriffen werden kann (Anmerkung des Übersetzers: der Computer, auf dem Docker ausgeführt wird). Die Union-Dateisystemtechnologie kann verschiedene Ebenen in ein Dateisystem integrieren und so eine einheitliche Perspektive für diese Ebenen bereitstellen, wodurch die Existenz mehrerer Ebenen ausgeblendet wird. Aus Sicht des Benutzers existiert nur ein Dateisystem. Wie diese Perspektive aussieht, können wir auf der rechten Seite des Bildes sehen.
Sie können Dateien zu diesen Ebenen in Ihrem Host-Dateisystem finden. Beachten Sie, dass diese Ebenen in einem laufenden Container nicht sichtbar sind. Auf meinem Host habe ich festgestellt, dass sie im Verzeichnis /var/lib/docker/aufs vorhanden sind.
/var/lib/docker/ ├── aufs ├── containers ├── graph ├── init ├── linkgraph.db ├── repositories-aufs ├── tmp ├── trust └── volumes 7 directories, 2 files
Containerdefinition
Die Definition eines Containers ist fast genau die gleiche wie die eines Bildes (Image). Es ist auch eine einheitliche Perspektive eines Haufens Der einzige Unterschied besteht darin, dass der Container am meisten lesbar und beschreibbar ist.
Aufmerksame Leser stellen möglicherweise fest, dass in der Definition eines Containers nicht erwähnt wird, ob der Container ausgeführt wird. Es war diese Entdeckung, die mir half, einen Großteil meiner Verwirrung zu verstehen.
Wichtige Punkte: Container = Bild + lesbare Ebene. Und in der Definition eines Containers wird nicht erwähnt, ob der Container ausgeführt werden soll.
Als nächstes besprechen wir Laufzeitcontainer.
Ein laufender Container ist definiert als ein les- und beschreibbares einheitliches Dateisystem sowie einen isolierten Prozessraum und die darin enthaltenen Prozesse. Das Bild unten zeigt einen laufenden Container.
Es ist die Dateisystem-Isolationstechnologie, die Docker zu einer vielversprechenden Technologie macht. Ein Prozess in einem Container kann Dateien ändern, löschen oder erstellen, und diese Änderungen wirken sich auf die Lese-/Schreibebene aus. Das Bild unten zeigt dieses Verhalten.
我们可以通过运行以下命令来验证我们上面所说的:
docker run ubuntu touch happiness.txt
即便是这个ubuntu容器不再运行,我们依旧能够在主机的文件系统上找到这个新文件。
/var/lib/docker/aufs/diff/860a7b...889/happiness.txt
Image Layer Definition
为了将零星的数据整合起来,我们提出了镜像层(image layer)这个概念。下面的这张图描述了一个镜像层,通过图片我们能够发现一个层并不仅仅包含文件系统的改变,它还能包含了其他重要信息。
元数据(metadata)就是关于这个层的额外信息,它不仅能够让Docker获取运行和构建时的信息,还包括父层的层次信息。需要注意,只读层和读写层都包含元数据。
除此之外,每一层都包括了一个指向父层的指针。如果一个层没有这个指针,说明它处于最底层。
Metadata Location:
我发现在我自己的主机上,镜像层(image layer)的元数据被保存在名为”json”的文件中,比如说:
/var/lib/docker/graph/e809f156dc985.../json
e809f156dc985...就是这层的id
一个容器的元数据好像是被分成了很多文件,但或多或少能够在/var/lib/docker/containers/
现在,让我们结合上面提到的实现细节来理解Docker的命令。
docker create 命令为指定的镜像(image)添加了一个可读写层,构成了一个新的容器。注意,这个容器并没有运行。
Docker start命令为容器文件系统创建了一个进程隔离空间。注意,每一个容器只能够有一个进程隔离空间。
看到这个命令,读者通常会有一个疑问:docker start 和 docker run命令有什么区别。
Wie Sie auf dem Bild sehen können, erstellt der Docker-Ausführungsbefehl zunächst einen Container mithilfe des Bildes und führt dann den Container aus. Dieser Befehl ist sehr praktisch und verbirgt die Details der beiden Befehle. Andererseits kann es für Benutzer leicht zu Missverständnissen kommen.
Exkurs: Um unser vorheriges Thema über Git fortzusetzen, denke ich, dass der Docker-Run-Befehl dem Git-Pull-Befehl ähnelt. Der Befehl „git pull“ ist eine Kombination aus „git fetch“ und „git merge“. Ebenso ist „docker run“ eine Kombination aus „docker create“ und „docker start“.
docker ps-Befehl listet alle laufenden Container auf. Dies verbirgt die Existenz nicht laufender Container. Wenn wir diese Container finden möchten, müssen wir den folgenden Befehl verwenden.
docker ps –a Der Befehl listet alle Container auf, unabhängig davon, ob sie ausgeführt oder gestoppt werden.
Der Befehl „Docker-Bilder“ listet alle Bilder der obersten Ebene auf. Tatsächlich haben wir hier keine Möglichkeit, zwischen einer Spiegel- und einer schreibgeschützten Ebene zu unterscheiden, daher schlagen wir eine Spiegelung auf oberster Ebene vor. Nur das beim Erstellen des Containers verwendete Bild oder das direkt heruntergezogene Bild kann als Bild der obersten Ebene bezeichnet werden, und unter jedem Bild der obersten Ebene sind mehrere Bildebenen verborgen.
docker images –a Befehl listet alle Bilder auf, was auch als Auflistung aller lesbaren Ebenen bezeichnet werden kann. Wenn Sie alle Ebenen unter einer bestimmten Bild-ID anzeigen möchten, können Sie diese mithilfe des Docker-Verlaufs anzeigen.
Der Befehl
docker stop sendet ein SIGTERM-Signal an den laufenden Container und stoppt dann alle Prozesse.
Der Befehl
docker kill sendet ein unfreundliches SIGKILL-Signal an alle im Container ausgeführten Prozesse.
Die Befehle „docker stop“ und „docker kill“ senden UNIX-Signale an den laufenden Prozess. Er nutzt die Eigenschaften von cgroups, um den laufenden Prozess abzubrechen . Der Prozessraum wird angehalten. Die spezifischen internen Prinzipien finden Sie hier: www.kernel.org/doc/Doc..., aber der Nachteil dieser Methode besteht darin, dass das Senden eines SIGTSTP-Signals für den Prozess nicht einfach genug ist, um es zu verstehen, sodass er nicht alles anhalten kann Prozesse.
Der Befehl docker rm entfernt die lesbaren und beschreibbaren Schichten, aus denen der Container besteht. Beachten Sie, dass dieser Befehl nur auf nicht laufenden Containern ausgeführt werden kann.
Der Docker-RMI-Befehl entfernt eine schreibgeschützte Ebene, aus der das Bild besteht. Sie können Docker RMI nur zum Entfernen der obersten Ebene verwenden (die auch als Spiegel bezeichnet werden kann). Sie können auch den Parameter -f verwenden, um das Entfernen der mittleren schreibgeschützten Ebene zu erzwingen.
Der Befehl
docker commit wandelt die Lese-/Schreibebene des Containers in eine schreibgeschützte Ebene um und wandelt so einen Container in ein unveränderliches Bild um.
Der Befehl „docker build“ ist sehr interessant, er führt mehrere Befehle wiederholt aus.
Wie wir auf dem Bild oben sehen können, ruft der Build-Befehl das Image gemäß der FROM-Anweisung in der Dockerfile-Datei ab und führt dann wiederholt 1) aus (erstellen und starten), 2) ändern und 3) begehen. Jeder Schritt in der Schleife generiert eine neue Ebene, sodass viele neue Ebenen erstellt werden.
Der Befehl docker exec führt einen neuen Prozess im laufenden Container aus.
Der Befehl „docker inspect“ extrahiert die Metadaten der obersten Ebene des Containers oder Bildes.
Der Befehl
docker save erstellt eine komprimierte Bilddatei, die in Docker auf einem anderen Host verwendet werden kann. Im Gegensatz zum Exportbefehl speichert dieser Befehl Metadaten für jede Ebene. Dieser Befehl wirkt sich nur auf Bilder aus.
Der Befehl
docker export erstellt eine TAR-Datei, entfernt Metadaten und unnötige Ebenen, integriert mehrere Ebenen in eine Ebene und speichert nur den aktuellen Inhalt aus einer einheitlichen Perspektive ( Anmerkung des Übersetzers: Wenn der Container nach expoxt in Docker importiert wird, kann über den Befehl docker images –tree nur ein Bild angezeigt werden; das Bild nach dem Speichern ist anders, es kann den Verlauf dieses Bildspiegels anzeigen.
Docker History-Befehl gibt rekursiv das historische Image des angegebenen Images aus.
Das obige ist der detaillierte Inhalt vonWas ist der Unterschied zwischen Containern und Bildern in Docker?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!