Docker-Bilder und Container in Bildern

Hafenarbeiter Container

Der Autor übersetzt einen Visualizing Docker Containers and Images- Post von Anfänger zu Anfänger und erklärt anhand einfacher Beispiele grundlegende Entitäten und Prozesse bei der Verwendung von Docker.

Wenn Sie nicht wissen, was Docker ist, oder nicht wissen, wie es sich auf virtuelle Maschinen oder Konfigurationsverwaltungstools bezieht, ist dieser Beitrag möglicherweise etwas kompliziert.

Der Post ist für diejenigen gedacht, die versuchen, Docker-Cli zu beherrschen, um zu verstehen, wie sich der Container und das Bild unterscheiden. Insbesondere wird der Unterschied zwischen einem einfachen Container und einem laufenden Container erläutert.


Während des Entwicklungsprozesses müssen Sie sich einige grundlegende Details vorstellen, z. B. die Ebenen des UnionFS-Dateisystems. In den letzten Wochen habe ich Technologie studiert, bin neu in der Docker-Welt und die Docker-Befehlszeile schien mir ziemlich schwer zu beherrschen.

Meiner Meinung nach ist es am besten, zu verstehen, wie die Technologie von innen funktioniert, um schnell ein neues Werkzeug zu erlernen und es richtig zu verwenden. Oft entwickelt eine neue Technologie neue Abstraktionsmodelle und führt neue Begriffe und Metaphern ein, die am Anfang klar erscheinen mögen, aber ohne ein klares Verständnis die spätere Verwendung des Tools erschweren.

Ein gutes Beispiel ist Git. Ich konnte Git nicht verstehen, bis ich das Grundmodell verstanden hatte, einschließlich Bäume, Blobs, Commits, Tags, Tree-ish und mehr. Ich denke, dass Leute, die die Interna von Git nicht verstehen, dieses Tool nicht sachkundig einsetzen können.

Bilddefinition (Bild)


Die Visualisierung des Bildes wird im Folgenden auf zwei Arten dargestellt. Ein Bild kann als „Entity“ oder „Union View“ eines schreibgeschützten Ebenenstapels definiert werden.

docker_image

Links sehen wir einen Stapel von Ebenen zum Lesen. Sie werden nur angezeigt, um das interne Gerät zu verstehen. Sie sind außerhalb des laufenden Containers auf dem Host-System zugänglich. Wichtig ist, dass sie schreibgeschützt sind (unveränderlich) und alle Änderungen in der obersten Ebene des Stapels erfolgen. Jede Ebene kann ein übergeordnetes Element haben, das übergeordnete Element hat auch ein übergeordnetes Element usw. Die oberste Ebene kann als UnionFS (in meinem Fall AUFS mit Docker) verwendet werden und wird als ein einziges schreibgeschütztes Dateisystem dargestellt, in dem sich alle Ebenen widerspiegeln. Wir sehen diese „Essenz“ des Bildes in der Abbildung rechts.

Wenn Sie diese Ebenen in ihrer ursprünglichen Form anzeigen möchten, finden Sie sie im Dateisystem auf dem Hostcomputer. Sie sind nicht direkt vom laufenden Container sichtbar. Auf meinem Hostrechner kann ich die Bilder in / var / lib / docker / aufs finden.

# 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

Container-Definition


Ein Container kann als "Objekt" eines Ebenenstapels mit einer obersten Ebene für die Aufzeichnung bezeichnet werden.

docker_container

Das obige Bild zeigt ungefähr das gleiche Bild wie das Bild, außer dass die oberste Ebene beschreibbar ist. Sie haben vielleicht bemerkt, dass diese Definition nichts darüber aussagt, ob der Container läuft oder nicht, und dies ist kein Zufall. Die Trennung der Container in "Laufen" und "Nicht Laufen" beseitigte die Verwirrung in meinem Verständnis.

Ein Container definiert nur eine Ebene zum Schreiben über dem Bild (einen Stapel von Ebenen zum Lesen). Es läuft nicht.

Laufenden Container definieren


Ein laufender Container ist eine „allgemeine Ansicht“ eines Lese- / Schreibcontainers und seines isolierten Prozessraums. Unten befindet sich ein Container in seinem Prozessraum.

docker_container_running

Die Isolation des Dateisystems wird durch Kernel-Level-Technologien, Cgroups, Namespaces und andere bereitgestellt, was Docker zu einer vielversprechenden Technologie macht. Prozesse im Container-Bereich können Dateien ändern, löschen oder erstellen, die auf der obersten Ebene für die Aufzeichnung gespeichert sind. Siehe Abbildung:

docker_touch_file

Um dies zu überprüfen, führen Sie den Befehl auf dem Host-Computer aus:

docker run ubuntu touch happiness.txt

Sie können eine neue Datei in der Aufzeichnungsebene auf dem Hostcomputer finden, auch wenn der Container nicht ausgeführt wird.

# find / -name happiness.txt
/var/lib/docker/aufs/diff/860a7b...889/happiness.txt

Bildebene definieren


Zuletzt definieren wir die Bildebene. Das Bild unten stellt die Bildebene dar und macht deutlich, dass sich die Ebene nicht nur im Dateisystem ändert.

docker_layer

Metadaten - Zusätzliche Informationen zum Layer, mit denen der Docker Informationen zur Laufzeit und während der Montage speichern kann. Beide Layertypen (zum Lesen und Schreiben) enthalten Metadaten.

docker_container_metadata

Außerdem enthält jede Ebene, wie bereits erwähnt, einen Zeiger auf die übergeordnete Ebene mit der ID (in der Abbildung sind die übergeordneten Ebenen darunter). Wenn die Ebene nicht auf die übergeordnete Ebene zeigt, befindet sie sich oben im Stapel.

docker_image_metadata

Speicherort der Metadaten

Im Moment (ich verstehe, dass Docker-Entwickler die Implementierung später ändern können) befinden sich die Metadaten der Bildebenen (zum Lesen) in einer Datei mit dem Namen "json" im Ordner / var / lib / docker / graph / id_layer:

/var/lib/docker/graph/e809f156dc985.../json

Dabei ist "e809f156dc985 ..." die abgeschnittene ID der Ebene.

Binde alles zusammen


Schauen wir uns nun die Befehle an, die mit klaren Bildern dargestellt sind.

Docker erstellen

Vorher: Nachher
Andockfenster Eingabe erstellen

:
Andockfenster Ausgabe erstellen

Der Befehl 'Andockfenster erstellen' fügt eine Ebene hinzu, die oben auf den von gefundenen Ebenenstapel geschrieben werden soll. Der Befehl startet den Container nicht.

Docker erstellen

Docker starten

Vorher: Nachher
Andockfenster Ausgabe erstellen

:
Docker-Startausgabe

Der Befehl 'Andockfenster starten' erstellt einen Prozessraum um die Containerebenen. Es kann nur einen Prozessraum pro Container geben.

Hafenarbeiter laufen

Vorher:
Docker-Run-Eingabe

Nachher:
Docker-Run-Ausgabe

Eine der ersten Fragen, die Leute stellen (ich habe auch gefragt): „Was ist der Unterschied zwischen„ Docker-Start “und„ Docker-Lauf “?“ Eines der ersten Ziele dieses Beitrags ist es, diese Subtilität zu erklären.

Hafenarbeiter laufen

Wie wir sehen können, findet der docker run Befehl das Bild, erstellt einen Container darüber und startet den Container. Dies dient der Vereinfachung und verbirgt die Details der beiden Teams.

Wenn ich den Vergleich mit dem Mastering von Git fortsetze, werde ich sagen, dass 'docker run' 'git pull' sehr ähnlich ist. Genau wie bei git pull (bei dem git fetch und git merge kombiniert werden), kombiniert der Andockbefehl run zwei Befehle, die unabhängig voneinander verwendet werden können. Das ist praktisch, kann aber zunächst irreführend sein.

Docker ps

Docker ps

Der Befehl 'docker ps' listet die laufenden Container auf Ihrem Host-Computer auf. Es ist wichtig zu verstehen, dass diese Liste nur laufende Container enthält. Nicht laufende Container werden ausgeblendet. Um eine Liste aller Container anzuzeigen, müssen Sie den folgenden Befehl verwenden.

Docker ps -a

Docker ps -a

Der Befehl 'docker ps -a', wobei 'a' die Abkürzung für 'all' ist, zeigt eine Liste aller Container unabhängig von ihrem Status an.

Andockbilder

Bild

Mit dem Befehl "Andockbilder" wird eine Liste der Bilder der obersten Ebene angezeigt. In der Tat unterscheidet nichts Besonderes ein Bild von einer Leseschicht. Nur die Bilder, an die Container angehängt sind oder die per Pull abgerufen wurden, werden als Bilder der obersten Ebene betrachtet. Dieser Unterschied ist aus Bequemlichkeitsgründen erforderlich, da sich hinter jedem Bild der obersten Ebene viele Ebenen befinden können.

Andockbilder -a

Andockbilder -a

Der Befehl 'docker images -a' zeigt alle Bilder auf dem Hostcomputer an. Dies ist eine Liste aller Ebenen, die im System gelesen werden sollen. Wenn Sie alle Ebenen eines Bildes anzeigen möchten, verwenden Sie den Befehl "Docker-Verlauf".

Docker zu stoppen

Vorher: Nachher
Docker-Stopp-Eingabe

:
Docker-Stop-Ausgabe

Der Befehl 'Docker-Stopp' sendet ein SIGTERM-Signal an den laufenden Container, der alle Prozesse im Prozessraum des Containers sanft stoppt. Als Ergebnis erhalten wir einen Container, der nicht ausgeführt wird.

Hafenarbeiter töten

Vorher: Nachher
Docker töten Eingang

:
Docker-Kill-Ausgabe

Der Befehl 'docker kill' sendet ein SIGKILL-Signal, das sofort alle Prozesse im aktuellen Container beendet. Dies entspricht fast dem Drücken von Strg + \ im Terminal.

Docker Pause

Vorher: Nachher
Docker-Pause-Eingabe

:
Docker-Pausenausgabe

Im Gegensatz zu Docker-Stopp und Docker-Kill, die echte UNIX-Signale an Containerprozesse senden, verwendet der Befehl docker pause die spezielle Funktion cgroups, um den ausgeführten Prozessbereich einzufrieren. Details können hier gelesen werden , kurz gesagt, das Senden des Signals Strg + Z (SIGTSTP) reicht nicht aus, um alle Prozesse im Containerraum einzufrieren.

Hafenarbeiter rm

Vorher: Nachher
Docker-RM-Eingang

:
Docker-RM-Ausgabe

Der Befehl 'docker rm' entfernt die Aufzeichnungsebene, die den Container auf dem Hostsystem definiert. Muss auf gestoppten Containern laufen. Löscht Dateien.

Hafenarbeiter rmi

Vorher: Nachher
Docker-RMI-Eingang

:
Docker-RMI-Ausgang

Der Befehl 'docker rmi' entfernt die gelesene Ebene, die das „Wesen“ des Bildes definiert. Das Image wird vom Host-System entfernt, kann jedoch weiterhin über 'Docker Pull' aus dem Repository abgerufen werden. Sie können 'docker rmi' nur für Ebenen (oder Bilder) der obersten Ebene verwenden. Um Zwischenebenen zu entfernen, müssen Sie 'docker rmi -f' verwenden.

Docker-Commit

Vorher:
Docker Commit läuft Containeroder Nachher Docker-Commit-Container

:
Von Docker festgeschriebene Ebene

Der Befehl 'docker commit' nimmt die oberste Ebene des Containers, diejenige zum Schreiben, und verwandelt sie in eine Ebene zum Lesen. Dadurch wird der Container (unabhängig davon, ob er ausgeführt wird) tatsächlich zu einem unveränderlichen Bild.

Docker-Commit

Docker bauen

До:
Dockerfile dockerfile и Docker-Bild

После:
Docker-Bild
Со многими другими слоями.

Команда 'docker build' интересна тем, что запускает целый ряд команд:
Docker bauen

На изображении выше мы видим, как команда build использует значение инструкции FROM из файла Dockerfile как базовый образ после чего:

1) запускает контейнер (create и start)
2) изменяет слой для записи
3) делает commit
На каждой итерации создается новый слой. При исполнении 'docker build' может создаваться множество слоев.

docker exec

До:
Hafenarbeiter läuft Container

После:
Docker Exec

Команда 'docker exec' применяется к запущенному контейнеру, запускает новый процесс внутри пространства процессов контейнера.

docker inspect |

Vorher:
Hafenarbeiter inspizieren Containeroder Nachher Docker inspizieren Bild

:
Metadaten

Der Befehl 'Docker inspizieren' ruft die Metadaten der obersten Ebene des Containers oder Bildes ab.

Hafenarbeiter speichern

Vorher: Nachher
Docker Eingabe speichern

:
Docker Ausgabe speichern

Mit dem Befehl "Docker speichern" wird eine Datei erstellt, mit der das Image auf ein anderes Hostsystem importiert werden kann. Im Gegensatz zum Exportbefehl werden alle Ebenen und ihre Metadaten gespeichert. Kann nur auf Bilder angewendet werden.

Docker-Export

Vorher: Nachher
Docker-Exporteingang

:
Docker Export Ausgabe

Mit dem Befehl 'Docker-Export' wird ein Tar-Archiv mit dem Inhalt der Container-Dateien erstellt, sodass ein Ordner für die Verwendung außerhalb von Docker erstellt werden kann. Das Team entfernt Ebenen und deren Metadaten. Es kann nur auf Behälter angewendet werden.

Docker-Geschichte

Vorher: Nachher
Docker-Verlaufseingabe

:
Docker-Verlaufsausgabe

Der Befehl 'Docker-Verlauf' akzeptiert und zeigt rekursiv eine Liste aller übergeordneten Bildebenen an (bei denen es sich auch um Bilder handeln kann)

Zusammenfassung


Ich hoffe, Ihnen hat diese Visualisierung von Containern und Bildern gefallen. Es gibt viele andere Befehle (Pull, Search, Restart, Attach und andere), die möglicherweise durch meine Vergleiche erklärt werden oder nicht.

Jetzt auch beliebt: