Was ist der Unterschied zwischen Containern und Bildern in Docker?

王林
Freigeben: 2020-11-12 16:16:54
nach vorne
2547 Leute haben es durchsucht

Was ist der Unterschied zwischen Containern und Bildern in Docker?

Dieser Artikel stellt den Unterschied zwischen Containern und Bildern in Docker vor. Ich hoffe, er kann Ihnen helfen.

(Empfohlenes Tutorial: Docker-Tutorial)

 10张图带你深入理解Docker容器和镜像


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.

Bilddefinition

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.

 10张图带你深入理解Docker容器和镜像

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.

sudo tree -L 1 /var/lib/docker/

/var/lib/docker/
├── aufs
├── containers
├── graph
├── init
├── linkgraph.db
├── repositories-aufs
├── tmp
├── trust
└── volumes
7 directories, 2 files
Nach dem Login kopieren

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.

 10张图带你深入理解Docker容器和镜像

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.

Laufende Containerdefinition

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.

 10张图带你深入理解Docker容器和镜像

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.

 10张图带你深入理解Docker容器和镜像     

我们可以通过运行以下命令来验证我们上面所说的: 

docker run ubuntu touch happiness.txt
Nach dem Login kopieren

即便是这个ubuntu容器不再运行,我们依旧能够在主机的文件系统上找到这个新文件。 

find / -name happiness.txt

/var/lib/docker/aufs/diff/860a7b...889/happiness.txt
Nach dem Login kopieren

Image Layer Definition

为了将零星的数据整合起来,我们提出了镜像层(image layer)这个概念。下面的这张图描述了一个镜像层,通过图片我们能够发现一个层并不仅仅包含文件系统的改变,它还能包含了其他重要信息。 

 10张图带你深入理解Docker容器和镜像     

元数据(metadata)就是关于这个层的额外信息,它不仅能够让Docker获取运行和构建时的信息,还包括父层的层次信息。需要注意,只读层和读写层都包含元数据。 

 10张图带你深入理解Docker容器和镜像     

除此之外,每一层都包括了一个指向父层的指针。如果一个层没有这个指针,说明它处于最底层。 

 10张图带你深入理解Docker容器和镜像     

Metadata Location: 
我发现在我自己的主机上,镜像层(image layer)的元数据被保存在名为”json”的文件中,比如说: 

/var/lib/docker/graph/e809f156dc985.../json
Nach dem Login kopieren

e809f156dc985...就是这层的id 

一个容器的元数据好像是被分成了很多文件,但或多或少能够在/var/lib/docker/containers/目录下找到,就是一个可读层的id。这个目录下的文件大多是运行时的数据,比如说网络,日志等等。 

全局理解(Tying It All Together)

现在,让我们结合上面提到的实现细节来理解Docker的命令。 

docker create

 10张图带你深入理解Docker容器和镜像     

docker create 命令为指定的镜像(image)添加了一个可读写层,构成了一个新的容器。注意,这个容器并没有运行。 

 10张图带你深入理解Docker容器和镜像     

docker start

 10张图带你深入理解Docker容器和镜像     

Docker start命令为容器文件系统创建了一个进程隔离空间。注意,每一个容器只能够有一个进程隔离空间。 

docker run

 10张图带你深入理解Docker容器和镜像     

看到这个命令,读者通常会有一个疑问:docker start 和 docker run命令有什么区别。 

Was ist der Unterschied zwischen Containern und Bildern in Docker?

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

 10张图带你深入理解Docker容器和镜像

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

 10张图带你深入理解Docker容器和镜像

docker ps –a Der Befehl listet alle Container auf, unabhängig davon, ob sie ausgeführt oder gestoppt werden.

Docker-Bilder

 10张图带你深入理解Docker容器和镜像

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

 10张图带你深入理解Docker容器和镜像

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.

docker stop

 10张图带你深入理解Docker容器和镜像 Der Befehl

docker stop sendet ein SIGTERM-Signal an den laufenden Container und stoppt dann alle Prozesse.

docker kill

 10张图带你深入理解Docker容器和镜像 Der Befehl

docker kill sendet ein unfreundliches SIGKILL-Signal an alle im Container ausgeführten Prozesse.

docker pause

 10张图带你深入理解Docker容器和镜像

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.

docker rm

 10张图带你深入理解Docker容器和镜像

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.

docker rmi

 10张图带你深入理解Docker容器和镜像

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.

docker commit

 10张图带你深入理解Docker容器和镜像 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.
 10张图带你深入理解Docker容器和镜像

docker build

 10张图带你深入理解Docker容器和镜像

Der Befehl „docker build“ ist sehr interessant, er führt mehrere Befehle wiederholt aus.

Was ist der Unterschied zwischen Containern und Bildern in Docker?

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.

docker exec

 10张图带你深入理解Docker容器和镜像

Der Befehl docker exec führt einen neuen Prozess im laufenden Container aus.

docker inspect oder

 10张图带你深入理解Docker容器和镜像

Der Befehl „docker inspect“ extrahiert die Metadaten der obersten Ebene des Containers oder Bildes.

docker save

 10张图带你深入理解Docker容器和镜像 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.

docker export

 10张图带你深入理解Docker容器和镜像 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

 10张图带你深入理解Docker容器和镜像

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!

Verwandte Etiketten:
Quelle:juejin.im
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage