Docker-Image erstellen Dockerfile und Commit-Operationen

Docker-Image erstellen Dockerfile und Commit-Operationen

Erstellen des Images

Es gibt zwei Hauptmethoden zum Erstellen eines Images:

Verwenden Sie den Befehl „Docker Commit“, um den laufenden Container in einem Image festzuschreiben.

Verwenden Sie den Befehl „Docker Build“, um ein Image aus einer Docker-Datei zu erstellen.

Lassen Sie uns zunächst vorstellen, wie ein Image aus einem laufenden Container übermittelt wird. Ich verwende immer noch das Busybox-Image als Beispiel. Verwenden Sie den folgenden Befehl, um einen Container mit dem Namen Busybox zu erstellen, und geben Sie den Busybox-Container ein.

$ docker run --rm --name=busybox -it busybox sh

Nach der Ausführung des obigen Befehls wird im aktuellen Fenster ein Busybox-Container gestartet und der Container aufgerufen. Führen Sie im Container den folgenden Befehl aus, um eine Datei zu erstellen und ihren Inhalt zu schreiben:

/ # touch hallo.txt && echo "Ich liebe Docker. " > hallo.txt

An diesem Punkt wurde im Stammverzeichnis des Containers eine Datei hello.txt erstellt und „I love Docker.“ hineingeschrieben.

Als nächstes öffnen wir ein weiteres Befehlszeilenfenster und führen den folgenden Befehl aus, um das Bild zu übermitteln:

$ Docker-Commit Busybox Busybox:Hallo

sha256:cbc6406aaef080d1dd3087d4ea1e6c6c9915ee0ee0f5dd9e0a90b03e2215e81c

Verwenden Sie dann den oben erwähnten Befehl „Docker Image ls“, um das Image anzuzeigen:

$ Docker-Image ls Busybox
REPOSITORY TAG BILD ID ERSTELLT GRÖSSE
busybox hallo cbc6406aaef0 vor 2 Minuten 1,22 MB
busybox latest 018c9d7b792b vor 4 Wochen 1,22 MB

An diesem Punkt können wir sehen, dass auf dem Host ein neues busybox:hello-Image erstellt wurde.

Im Vergleich ist es offensichtlich, dass der Docker-Build mit Dockerfile besser ist. Die Nachteile von Docker Commit sind folgende:

Der Vorgang muss innerhalb des Containers durchgeführt werden, was mühsam und ineffizient ist.

Dies ist auch der wichtigste Punkt. Andere oder sogar Sie selbst werden nach einer gewissen Zeit nicht wissen, wie dieses Image erstellt wurde, aber anhand des von Dockerfile erstellten Images können wir sehen, dass der Befehl apt-get install ausgeführt wurde.

Die zweite Methode ist die wichtigste und am häufigsten verwendete Methode zum Erstellen von Images: Dockerfile. Dockerfile ist eine Textdatei, die alle Build-Befehle des Benutzers enthält. Mit dem Befehl „Docker Build“ kann ein Image aus einer Docker-Datei generiert werden.

Die Verwendung von Dockerfile zum Erstellen eines Images bietet die folgenden Funktionen:

Jede Befehlszeile im Dockerfile generiert eine unabhängige Image-Ebene mit einer eindeutigen ID.

Die Befehle im Dockerfile sind vollständig transparent. Indem Sie den Inhalt des Dockerfiles anzeigen, können Sie sehen, wie das Image Schritt für Schritt erstellt wird.

Dockerfile liegt im Klartext vor, sodass es einfach zusammen mit dem Code im Code-Repository gespeichert und seine Version verwaltet werden kann.

Sie sind gespannt, wie Sie Dockerfile verwenden können, da die Verwendung von Dockerfile zum Erstellen von Images so viele tolle Funktionen bietet? Keine Sorge, lernen wir zuerst die allgemeinen Anweisungen für Dockerfile.

Dockerfile-Anweisungen Anleitung Einführung
AUS Zusätzlich zu den Kommentaren muss die erste Zeile der Docker-Datei „FROM“ sein, gefolgt vom Image-Namen, der das Basis-Image darstellt, auf dessen Grundlage wir unseren Container erstellen möchten.
LAUFEN Auf RUN folgt ein bestimmter Befehl, ähnlich dem Befehl zur Ausführung in der Linux-Befehlszeile.
HINZUFÜGEN Lokale Dateien oder Remotedateien in das Image kopieren
KOPIE Lokale Dateien in das Image kopieren
BENUTZER Geben Sie den Benutzer an, der den Container starten soll
EINSTIEGSPUNKT Container-Startbefehl
CMD CMD stellt Standardparameter für die ENTRYPOINT-Anweisung bereit. Sie können CMD auch allein verwenden, um Container-Startparameter anzugeben.
Umwelt Gibt die Umgebungsvariablen an, wenn der Container ausgeführt wird, im Format Schlüssel=Wert
ARG Definieren Sie externe Variablen. Beim Erstellen eines Images können Sie das Format build-arg = verwenden, um Parameter für den Aufbau zu übergeben.
EXPONIEREN Geben Sie den Port an, auf dem der Container lauscht, im Format [Port]/TCP oder [Port]/UDP.
ARBEITSVERZEICHNIS Legt das Arbeitsverzeichnis für alle RUN-, CMD-, ENTRYPOINT-, COPY- und ADD-Befehle fest, die ihm im Dockerfile folgen.

Fühlen Sie sich nach dem Lesen so vieler Anweisungen etwas verwirrt? Keine Sorge, ich werde Sie anhand eines Beispiels mit den einzelnen Schritten vertraut machen. Hier ist eine Docker-Datei:

VON centos:7 
KOPIEREN Sie nginx.repo /etc/yum.repos.d/nginx.repo 
Führen Sie den Befehl yum install -y nginx aus. 
AUSSETZEN 80 
ENV HOST=mynginx 
CMD ["nginx","-g","Daemon aus;"]

Die erste Zeile gibt an, dass ich ein benutzerdefiniertes Image basierend auf dem Image centos:7 erstellen möchte. Hierbei ist zu beachten, dass die erste Zeile jedes Dockerfiles außer bei Kommentaren mit FROM beginnen muss.

Die zweite Zeile bedeutet, dass die lokale Datei nginx.repo in das Verzeichnis /etc/yum.repos.d im Container kopiert wird. Die Datei nginx.repo wird hierher kopiert, um die Installationsquelle von nginx hinzuzufügen.

Die dritte Zeile gibt an, dass der Befehl yum install -y nginx im Container ausgeführt wird, um den nginx-Dienst im Container zu installieren. Nach der Ausführung der dritten Befehlszeile wurde nginx im Container installiert.

Die vierte Zeile deklariert, dass der Dienst (nginx) im Container Port 80 verwendet, um externe Dienste bereitzustellen.

Die fünfte Zeile definiert die Umgebungsvariable HOST = mynginx, wenn der Container gestartet wird. Nachdem der Container gestartet wurde, kann der Wert der Umgebungsvariablen HOST als mynginx abgerufen werden.

Die sechste Zeile definiert den Startbefehl des Containers und das Befehlsformat ist ein JSON-Array. Hier wird der Container-Startbefehl auf nginx gesetzt und der Nginx-Startparameter -g „daemon off;“ hinzugefügt, um nginx im Vordergrund zu starten.

Implementierungsprinzip der Spiegelung

Tatsächlich besteht ein Docker-Image aus einer Reihe von Image-Ebenen, von denen jede eine Übermittlung im Image-Erstellungsprozess darstellt. Im Folgenden wird eine aus einem Image erstellte Docker-Datei verwendet, um die Ebenenanordnung von Images zu veranschaulichen.

VON busybox

KOPIEREN von test /tmp/test

RUN mkdir /tmp/testdir

Das obige Dockerfile besteht aus drei Schritten:

Die erste Zeile erstellt eine Bildebene basierend auf Busybox;

Die zweite Zeile kopiert die lokale Testdatei in das Image;

Die dritte Zeile erstellt ein Verzeichnis testdir im Ordner /tmp.

Hier verwendet mein Docker den Dateitreiber overlay2. Gehen Sie in das Verzeichnis /var/lib/docker/overlay2 und verwenden Sie den Befehl tree ., um die generierte Image-Datei anzuzeigen:

$ Baum .
 
# Das Folgende ist die Ausgabe des Baums. Befehl |-- 3e89b959f921227acab94f5ab4524252ae0a829ff8a3687178e3aca56d605679
 
| |-- diff # Diese Ebene ist die Basisebene, die der ersten Zeile der obigen Docker-Datei entspricht und den gesamten Dateiinhalt des Busybox-Image enthält, z. B. /etc, /bin, /var und andere Verzeichnisse ... Dieses Mal werden einige der ursprünglichen Image-Dateiinhalte weggelassen| `-- link 
 
|-- 6591d4e47eb2488e6297a0a07a2439f550cdb22845b6d2ddb1be2466ae7a9391
 
| |-- diff # Diese Ebene entspricht der zweiten Zeile der obigen Docker-Datei und kopiert die Testdatei in den Ordner /tmp, sodass sich im Ordner „diff“ eine Datei /tmp/test befindet| | `-- tmp
 
| | `-- Prüfung
 
| |-- Verknüpfung
 
| |-- niedriger
 
| `-- Arbeit
 
|--backingFsBlockDev
 
|-- bec6a018080f7b808565728dee8447b9e86b3093b16ad5e6a1ac3976528a8bb1
 
| |-- diff # Diese Ebene entspricht der dritten Zeile der obigen Docker-Datei. Der Ordner testdir wird unter dem Ordner /tmp erstellt, daher gibt es einen Ordner /tmp/testdir unter dem Ordner diff. | | `-- tmp
 
| | `--testdir
 
| |-- Verknüpfung
 
| |-- niedriger
 
| `-- Arbeit
 
...

Aus der obigen Verzeichnisstruktur können wir erkennen, dass jede Befehlszeile in der Docker-Datei eine Spiegelebene generiert und der Diff-Ordner jeder Ebene nur inkrementelle Daten speichert, wie in Abbildung 2 dargestellt.

Die geschichtete Struktur macht das Docker-Image sehr leichtgewichtig. Jede Schicht hat einen eindeutigen ID-Wert, der auf dem Inhalt des Images basiert. Wenn verschiedene Images dieselbe Image-Schicht haben, kann die Image-Schicht zwischen verschiedenen Images gemeinsam genutzt werden.

Zusammenfassend lässt sich sagen, dass ein Docker-Image eine statische, hierarchisch verwaltete Kombination von Dateien ist und die zugrunde liegende Implementierung des Images auf dem Union File System (UnionFS) basiert. Ein umfassendes Verständnis der Bildprinzipien kann uns dabei helfen, in der Produktionspraxis die besten Bilder zu erstellen und die Beziehung zwischen Containern und Bildern besser zu verstehen.

Zusammenfassen

An diesem Punkt verfügen Sie meiner Meinung nach über ein tieferes Verständnis des Kernkonzepts von Docker-Images und sind mit den allgemeinen Vorgängen von Docker-Images (Abrufen, Anzeigen, „Umbenennen“, Löschen und Erstellen benutzerdefinierter Images) und den zugrunde liegenden Implementierungsprinzipien vertraut.

Befehl zum Spiegeln:

Ziehen Sie das Image. Verwenden Sie den Docker-Pull-Befehl, um das Image des Remote-Warehouses in das lokale Warehouse zu ziehen.

Benennen Sie das Image um. Verwenden Sie den Docker-Tag-Befehl, um das Image „umzubenennen“.

Um das Image anzuzeigen, verwenden Sie den Befehl „Docker Image ls“ oder „Docker Images“, um die vorhandenen Images lokal anzuzeigen.

Löschen Sie das Image und verwenden Sie den Docker-RMI-Befehl, um nicht benötigte Images zu löschen.

Erstellen Sie ein Image. Es gibt zwei Möglichkeiten, ein Image zu erstellen. Die erste Möglichkeit besteht darin, mit dem Befehl „Docker Build“ ein Image auf Grundlage der Docker-Datei zu erstellen. Dies ist auch die von mir empfohlene Methode zum Erstellen von Images. Die zweite Möglichkeit besteht darin, mit dem Befehl „Docker Commit“ ein Image auf Grundlage eines bereits laufenden Containers zu übermitteln.

Das Implementierungsprinzip der Spiegelung:

Ein Bild besteht aus einer Reihe von Bildebenen. Jede Ebene stellt ein Commit im Bilderstellungsprozess dar. Wenn wir eine Datei im Bild ändern müssen, müssen wir nur eine neue Bildebene basierend auf der aktuellen Bildebene erstellen und nur den geänderten Dateiinhalt speichern. Durch die Ebenenstruktur ist das Teilen von Bildebenen zwischen Bildern ganz einfach und bequem.

Der obige Artikel über Docker-Image-Erstellung, Dockerfile und Commit-Operationen ist alles, was ich mit Ihnen teilen muss. Ich hoffe, er kann Ihnen als Referenz dienen und ich hoffe auch, dass Sie 123WORDPRESS.COM unterstützen werden.

Das könnte Sie auch interessieren:
  • Senden Sie das Image über den Container DockerCommit und pushen Sie das Image DockerPush
  • Detaillierte Erläuterung des Funktionsprinzips und der Verwendung des Docker-Image-Submission-Befehls Commit
  • Docker-Lernhinweise: So übergeben Sie einen Container an ein Image
  • Detaillierte Erklärung zum Ändern vorhandener Images durch Docker (Commit)
  • Detaillierte Erklärung zum Docker-Lernen zum Erstellen eines Images mit dem Commit-Befehl
  • Beispiel und Funktion für den Commit-Vorgang eines Docker-Image

<<:  Detaillierte Erklärung des Javascript Echarts Luftqualitätskarteneffekts

>>:  Detaillierte Beschreibung der Funktion von new in JS

Artikel empfehlen

Mehrere Möglichkeiten zum Kapseln von Breadcrumb-Funktionskomponenten in Vue3

Inhaltsverzeichnis Vorwort 1. Warum brauchen wir ...

Detailliertes Beispiel der Lesegeschwindigkeit von JS-Objekten

1. Der Zugriff auf Literale und lokale Variablen ...

React-Beispiel, das den Fortschritt des Datei-Uploads zeigt

Inhaltsverzeichnis React-Demo zur Anzeige des Dat...

Zabbix' PSK-Verschlüsselung kombiniert mit zabbix_get-Wert

Seit Zabbix Version 3.0 wird verschlüsselte Kommu...

Zusammenfassung der Wissenspunkte zu MySQL-Index, Sperre und Transaktion

Dieser Artikel fasst die Wissenspunkte zu MySql-I...

Skin-Change-Lösung basierend auf Vue kombiniert mit ElementUI

Inhaltsverzeichnis Vorne geschrieben Lösung 1: Gl...

Implementierungscode der HTML-Floating-Promptbox-Funktion

Allgemeine Formulareingabeaufforderungen belegen ...

Beispiel für den schnellen Aufbau eines Redis-Clusters mit Docker

Was ist Redis Cluster? Redis Cluster ist eine von...

So ändern Sie das Root-Passwort in einem Container mit Docker

1. Verwenden Sie den folgenden Befehl, um das SSH...

Fünf Möglichkeiten zur Implementierung der Vererbung in js

Ausleihen von Konstruktoren Die Grundidee dieser ...

Eine ausführliche Diskussion zur Detailanalyse im Webdesign

Bei der Designarbeit höre ich oft, dass an der Übe...

Ein Beispiel, wie JavaScript doppelte Netzwerkanforderungen verhindern kann

Vorwort Während der Entwicklung stoßen wir häufig...

MySQL in Ubuntu 18.04 installieren (grafisches Tutorial)

Tipp: Die folgenden Vorgänge werden alle mit Root...