So verwenden Sie Dockerfile zum Erstellen von Images in Docker

So verwenden Sie Dockerfile zum Erstellen von Images in Docker

Erstellen des Images

Früher haben wir verschiedene Images zum Testen und Vorführen verwendet. In vielen Fällen benötigen wir unsere eigenen Images, um unseren Geschäftsanforderungen gerecht zu werden. Dies erfordert, dass wir die benötigten Images anpassen können. Es gibt zwei Möglichkeiten, Docker-Images zu erstellen.

  • Verwenden Sie den Befehl „Docker Commit“.
  • Verwenden Sie den Befehl „Docker Build“ und die Docker-Datei, um die Datei zu erstellen.

Wir empfehlen derzeit nicht, den Befehl „Docker Commit“ zu verwenden, sondern stattdessen das flexiblere und leistungsfähigere Dockerfile zum Erstellen von Docker-Images zu verwenden.

1. Verwenden Sie den Commit-Befehl zum Erstellen

Der Befehl „Docker Commit“ ist die intuitivste Möglichkeit, ein neues Image zu erstellen. Der Vorgang besteht aus drei Schritten:

  • Führen Sie den Container aus;
  • Ändern Sie den Container.
  • Speichern Sie den Container als neues Image.

Beginnen wir mit der Erstellung eines neuen Containers. Wir werden für diesen Container das gängige Ubuntu-Image verwenden. Die Schritte sind wie folgt:

1.1 Führen Sie einen zu ändernden Container aus

root@ubuntu:~# docker run -ti ubuntu /bin/bash
root@733a4b080491:/#

1.2 Apache-Pakete installieren

root@733a4b080491:/# apt-get update
... ...
root@733a4b080491:/# apt-get install -y apache2
... ...

Wir haben einen Container gestartet und Apache darin installiert. Wir werden diesen Container als Webserver ausführen und müssen ihn speichern, damit wir diesen Schritt nicht jedes Mal ausführen müssen.

1.3 Einreichen eines benutzerdefinierten Containers

root@ubuntu:~# docker ps -a
CONTAINER ID BILD BEFEHL ERSTELLT STATUS PORTS NAMEN
733a4b080491 Ubuntu "/bin/bash" vor 11 Minuten Beendet (0) vor 5 Sekunden suspect_mestorf
root@ubuntu:~# docker commit 733a4b080491 wzlinux/ubuntu_with_apache
sha256:902ac2c87147fefc5b70c741ce9550dcda426cea9f824f442d5cc2744bdc90ae
root@ubuntu:~# Docker-Bilder
REPOSITORY TAG BILD ID ERSTELLT GRÖSSE
wzlinux/ubuntu_with_apache latest 902ac2c87147 vor 33 Sekunden 261 MB
Ubuntu aktuell 20c44cd7596f vor 10 Tagen 123 MB

Wie Sie sehen, haben wir Docker Commit verwendet, um den geänderten Container zu übermitteln. An der Größe können wir erkennen, dass das Image durch die Installation der Software größer geworden ist. Docker Commit übermittelt nur die Differenz zwischen dem zum Erstellen des Containers verwendeten Image und dem aktuellen Status des Containers, was das Update sehr leichtgewichtig macht.

Das Obige zeigt, wie mit Docker Commit ein neues Image erstellt wird. Docker empfiehlt Benutzern jedoch nicht, Images auf diese Weise zu erstellen. Da es sich hierbei um eine manuelle Methode zur Bilderstellung handelt, ist sie fehleranfällig, ineffizient und weist eine schlechte Wiederholbarkeit auf. Wenn Sie beispielsweise Apache zum Debian-Basisimage hinzufügen möchten, müssen Sie alle vorherigen Schritte wiederholen. Und was noch wichtiger ist: Nutzer wissen nicht, wie das Image erstellt wird und ob es Schadprogramme enthält. Mit anderen Worten: Das Image kann nicht geprüft werden, was ein Sicherheitsrisiko darstellt.

Um jedoch ein umfassenderes Verständnis von Docker zu erlangen, müssen wir noch verstehen, wie man mit Docker Commit ein Docker-Image erstellt. Denn selbst wenn Sie Dockerfile (empfohlene Methode) zum Erstellen eines Images verwenden, erstellt das zugrunde liegende Docker-Commit das neue Image Schicht für Schicht. Das Erlernen von Docker-Commit kann uns helfen, den Build-Prozess und die hierarchische Struktur des Images besser zu verstehen.

2. Erstellen mit Dockerfile

Dockerfile verwendet grundlegende, auf DSL-Syntax (Domain Specific Language) basierende Anweisungen, um ein Docker-Image zu erstellen. Wir empfehlen die Verwendung der Dockerfile-Methode anstelle von Docker Commit, da das Erstellen von Images mit ersterer wiederholbarer, transparenter und idempotenter ist.

Sobald wir eine Docker-Datei haben, können wir den Befehl „Docker Build“ verwenden, um basierend auf den Anweisungen in der Docker-Datei ein neues Image zu erstellen.

2.1 Unser erstes Dockerfile

Verwenden Sie Dockerfile, um das obige Ubuntu_with_Apache zu erstellen. Der Inhalt ist wie folgt.

# Version 0.0.1
VON Ubuntu
RUN sed -i 's/archive.ubuntu.com/cn.archive.ubuntu.com/g' /etc/apt/sources.list
RUN sed -i 's/security.ubuntu/cn.archive.ubuntu/g' /etc/apt/sources.list
Führen Sie apt-get -y update und apt-get -y install apache2 aus.
AUSSETZEN 80

Wenn der Befehl „Docker Build“ ausgeführt wird, werden alle Anweisungen in der Docker-Datei ausgeführt und festgeschrieben. Nach erfolgreichem Abschluss des Befehls wird ein neues Image zurückgegeben.

root@ubuntu:~/sample# docker build -t ubuntu_with_apache_dockerfile . ①
Senden des Build-Kontexts an den Docker-Daemon 6.144kB ②
Schritt 1/5: VON Ubuntu ③
 ---> 20c44cd7596f
Schritt 2/5: Führen Sie den Befehl sed -i 's/archive.ubuntu.com/cn.archive.ubuntu.com/g' /etc/apt/sources.list aus.
 ---> Läuft in bac6dc3b900f
 ---> c66ad94ad8a4
Zwischenbehälter entfernen bac6dc3b900f
Schritt 3/5: Führen Sie den Befehl sed -i ‚s/security.ubuntu/cn.archive.ubuntu/g‘ /etc/apt/sources.list aus.
 ---> Wird ausgeführt in 5158558b6403
 ---> 0a4c480147c5
Zwischenbehälter ausbauen 5158558b6403
Schritt 4/5: Führen Sie apt-get -y update und apt-get -y install apache2 aus ④
 ---> Wird ausgeführt in f547ce7a1b39 ⑤
 …
 …
 ---> 118bde35120a ⑥
Zwischenbehälter ausbauen f547ce7a1b39 ⑦
Schritt 5/5: EXPOSE 80
 ---> Wird ausgeführt in e546786de05b
 ---> f55d7b07365b
Zwischenbehälter ausbauen e546786de05b
Erfolgreich erstellt f55d7b07365b ⑧
Erfolgreich getaggt ubuntu_with_apache_dockerfile:latest


① Führen Sie den Befehl „Docker Build“ aus. -t benennt das neue Image ubuntu-with-apache-dockerfile. Der . am Ende des Befehls gibt an, dass der Build-Kontext das aktuelle Verzeichnis ist. Standardmäßig sucht Docker im Build-Kontext nach der Dockerfile-Datei. Wir können den Speicherort der Dockerfile auch über den Parameter -f angeben.

② Ab diesem Schritt beginnt der eigentliche Image-Erstellungsprozess. Zuerst sendet Docker alle Dateien im Build-Kontext an den Docker-Daemon. Der Build-Kontext stellt die zum Erstellen des Images erforderlichen Dateien oder Verzeichnisse bereit.

Mit den Befehlen ADD, COPY und anderen im Dockerfile können Sie Dateien im Build-Kontext zum Image hinzufügen. In diesem Beispiel ist der Build-Kontext das aktuelle Verzeichnis /sample und alle Dateien und Unterverzeichnisse in diesem Verzeichnis werden an den Docker-Daemon gesendet.

Daher müssen Sie bei der Verwendung des Build-Kontexts vorsichtig sein. Fügen Sie keine unnötigen Dateien in den Build-Kontext ein. Verwenden Sie insbesondere nicht / oder /usr als Build-Kontext. Andernfalls wird der Build-Prozess sehr langsam oder schlägt sogar fehl.

③ Schritt 1: Führen Sie FROM aus und verwenden Sie Ubuntu als Basis-Image. Die Ubuntu-Image-ID ist 452a96d81c30.

④ Schritt 4: Führen Sie RUN aus, um Apache zu installieren. Die spezifischen Schritte sind ⑤ ~ ⑬.

⑤ Starten Sie den temporären Container mit der ID e38bc83df8b1 und installieren Sie Apache mit apt-get im Container.

⑥ Speichern Sie den Container nach erfolgreicher Installation als Image mit der ID fbc9af08328d. Dieser Schritt verwendet auf der untersten Ebene einen Befehl, der dem Docker Commit ähnelt.

⑦ Löschen Sie den temporären Container 02a4f3243dda.

⑧ Das Image wurde erfolgreich erstellt.

Zeigen Sie die Bildinformationen über Docker-Bilder an.

root@ubuntu:~/sample# Docker-Bilder
REPOSITORY TAG BILD ID ERSTELLT GRÖSSE
ubuntu_with_apache_dockerfile latest f55d7b07365b vor 27 Minuten 261 MB
wzlinux/ubuntu_with_apache latest 902ac2c87147 Vor etwa einer Stunde 261 MB
Ubuntu aktuell 20c44cd7596f vor 10 Tagen 123 MB

2.2 Bildstruktur anzeigen

ubuntu_with_apache_dockerfile wird durch Hinzufügen mehrerer neuer Image-Ebenen über dem Basis-Image erhalten.

Das obige Bild ist aus dem Originaltext kopiert, und das Bild unten zeigt die Daten, die ich durch Experimente auf meinem Computer erhalten habe. Die BILD-ID ist anders, aber alles andere ist gleich.


Überprüfen Sie den IMAGE-Verlauf meiner Ubuntu-Maschine wie folgt:


Wie aus der Ausgabe ersichtlich, generiert jeder Befehl eine Spiegelebene.

Der Docker-Verlauf zeigt den Build-Verlauf des Images, d. h. den Ausführungsprozess der Docker-Datei.

Im Vergleich zum Ubuntu-Image hat ubuntu_with_apache_dockerfile nur ein paar Ebenen mehr. Jede Anweisung im Dockerfile erstellt eine Ebene. Der Docker-Verlauf zeigt uns auch die Ebenenstruktur des Images, wobei jede Ebene von oben nach unten angeordnet ist.

2.3 Bild-Caching-Funktionen

Da jeder Schritt des Build-Prozesses das Ergebnis als Image übermittelt, ist der Image-Erstellungsprozess von Docker sehr intelligent. Es behandelt die vorherige Bildebene als Cache.

Beispielsweise ändern wir EXPOSE 80 in EXPOSE 8080.

root@ubuntu:~/sample# docker build -t ubuntu_with_apache_8080 .   
Senden des Build-Kontexts an den Docker-Daemon 6.144kB
Schritt 1/5: VON Ubuntu 
---> 20c44cd7596f
Schritt 2/5: Führen Sie den Befehl sed -i 's/archive.ubuntu.com/cn.archive.ubuntu.com/g' /etc/apt/sources.list aus.
 ---> Cache verwenden ---> c66ad94ad8a4Schritt 3/5: RUN sed -i 's/security.ubuntu/cn.archive.ubuntu/g' /etc/apt/sources.list 
---> Cache verwenden 
---> 0a4c480147c5
Schritt 4/5: Führen Sie apt-get -y update und apt-get -y install apache2 aus. 
---> Cache verwenden 
---> 118bde35120a
Schritt 5/5: 8080 freilegen 
---> Wird ausgeführt in c89f8210c56a 
---> ac88967e578e
Zwischenbehälter entfernen c89f8210c56a
Erfolgreich erstellt ac88967e578e
Erfolgreich getaggt ubuntu_with_apache_8080:latest

Wir können sehen, dass die vorherigen Anweisungen dieselben sind. Daher verwendet Docker direkt den vorherigen Cache und erstellt nur die Anweisungen, die wir geändert haben. Die neue Bildebene sieht wie folgt aus.


Wenn wir beim Erstellen des Images keinen Cache verwenden möchten, können wir dem Docker-Build-Befehl den Parameter --no-cache hinzufügen.

Jeder Befehl im Dockerfile erstellt eine Image-Ebene und die obere Ebene ist von der unteren Ebene abhängig. Wenn sich eine Ebene ändert, werden die Caches aller darüber liegenden Ebenen ungültig. Das heißt, wenn wir die Reihenfolge ändern, in der die Dockerfile-Anweisungen ausgeführt werden, oder Anweisungen ändern oder hinzufügen, wird der Cache ungültig. Beispielsweise fügen wir den Befehl MAINTAINER wzlinux "[email protected]" am Anfang hinzu. wie folgt:

# Version 0.0.1
VON Ubuntu
WARTUNGSBEDIENER wzlinux "[email protected]"
RUN sed -i 's/archive.ubuntu.com/cn.archive.ubuntu.com/g' /etc/apt/sources.list
RUN sed -i 's/security.ubuntu/cn.archive.ubuntu/g' /etc/apt/sources.list
Führen Sie apt-get -y update und apt-get -y install apache2 aus.
AUSSETZEN 80

Verwenden Sie dann Docker zum Erstellen und Anzeigen des Prozesses.

root@ubuntu:~/sample# docker build -t ubuntu_with_apache_author .

Senden des Build-Kontexts an den Docker-Daemon 6.144kB
Schritt 1/6: VON Ubuntu
 ---> 20c44cd7596f
Schritt 2/6: MAINTAINER wzlinux "[email protected]" 
---> Wird ausgeführt in 637bb3457407 
---> 829b24531d69
Zwischenbehälter entfernen 637bb3457407
Schritt 3/6: Führen Sie den Befehl sed -i 's/archive.ubuntu.com/cn.archive.ubuntu.com/g' /etc/apt/sources.list aus. 
---> Wird ausgeführt in 416ae8aefb61 
---> 84643fe8447a
Zwischenbehälter ausbauen 416ae8aefb61
Schritt 4/6: Führen Sie den Befehl sed -i ‚s/security.ubuntu/cn.archive.ubuntu/g‘ /etc/apt/sources.list aus. 
---> Wird ausgeführt in 58d8375fd5c3 
---> 1cb5776982d3
Zwischenbehälter ausbauen 58d8375fd5c3
Schritt 5/6: Führen Sie apt-get -y update und apt-get -y install apache2 aus. 
---> Läuft in 0514a7d04814
 …
 …
Trigger für SGML-Base verarbeiten (1.26+nmu4ubuntu1)
 ... 
---> 30eb21527fee
Zwischenbehälter entfernen 0514a7d04814
Schritt 6/6: EXPOSE 80 
---> Wird ausgeführt in 476ca5f98886 
---> 30672998f3d0
Zwischenbehälter entfernen 476ca5f98886
Erfolgreich erstellt 30672998f3d0
Erfolgreich getaggt mit ubuntu_with_apache_author:latest 


Aus den Ausgabeergebnissen werden viele neue Bildebenen generiert und der Cache ist ungültig geworden.

2.4 Dockerfile debuggen

Jedes Skript oder Programm, einschließlich einer Docker-Datei, schlägt fehl. Fehler sind nicht schlimm, aber es muss eine Möglichkeit geben, sie zu beheben. Lassen Sie uns testen, was zu tun ist, wenn während des Build-Prozesses ein Fehler im Befehl auftritt. Beispielsweise haben wir den zweiten sed-Befehl falsch geschrieben und stattdessen sd geschrieben.

# Version 0.0.1
VON Ubuntu
WARTUNGSBEDIENER wzlinux "[email protected]"
RUN sed -i 's/archive.ubuntu.com/cn.archive.ubuntu.com/g' /etc/apt/sources.list
RUN sd -i 's/security.ubuntu/cn.archive.ubuntu/g' /etc/apt/sources.list
Führen Sie apt-get -y update und apt-get -y install apache2 aus.
AUSSETZEN 80

Führen Sie Docker Build wie folgt aus.


Beim Ausführen des vierten Schritts, der RUN-Anweisung, schlägt das Dockerfile fehl. Wir können das im dritten Schritt erstellte Image 84643fe8447a zum Debuggen verwenden, indem wir einen Container des Images über docker run -it starten.

root@ubuntu:~/sample# docker run -ti 84643fe8447a /bin/bash
root@422ecce78664:/#sd
bash: sd: Befehl nicht gefunden

Tatsächlich sind wir definitiv nicht dumm genug, um nicht zu wissen, dass SD nicht existiert. Ich verwende dies nur als Beispiel. Wir werden diese Methode für andere, schwierigere Methoden zur Fehlerbehebung verwenden.

2.5 Dockerfile-Anweisungen

AUS
Geben Sie das Basisimage an.

BEWAHRER
Legen Sie den Autor des Bildes fest. Dies kann eine beliebige Zeichenfolge sein.

KOPIE
Kopiert Dateien aus dem Build-Kontext in das Image.
COPY unterstützt zwei Formen:
KOPIEREN Quelle Ziel KOPIEREN ["Quelle", "Ziel"]
Hinweis: src kann im Build-Kontext nur Dateien oder Verzeichnisse angeben.

HINZUFÜGEN
Ähnlich wie COPY, kopiert Dateien aus dem Build-Kontext in das Image. Der Unterschied besteht darin, dass, wenn src eine Archivdatei (tar, zip, tgz, xz usw.) ist, die Dateien automatisch in dest entpackt werden.

Umwelt
Legen Sie Umgebungsvariablen fest, die von nachfolgenden Anweisungen verwendet werden können. Zum Beispiel:

ENV MEINE_VERSION 1.3RUN apt-get install -y meinpaket=$MEINE_VERSION

EXPONIEREN
Docker kann einen Port verfügbar machen, indem angegeben wird, dass der Prozess im Container darauf lauscht.

VOLUMEN
Deklarieren Sie eine Datei oder ein Verzeichnis als Volume.

ARBEITSVERZEICHNIS
Legt das aktuelle Arbeitsverzeichnis im Image für nachfolgende RUN-, CMD-, ENTRYPOINT-, ADD- oder COPY-Anweisungen fest.

LAUFEN
Führt den angegebenen Befehl im Container aus.

CMD
Führt den angegebenen Befehl aus, wenn der Container gestartet wird.
In einer Docker-Datei können mehrere CMD-Anweisungen enthalten sein, aber nur die letzte wird wirksam. CMD kann nach dem Docker-Ausführung durch Parameter ersetzt werden.

EINSTIEGSPUNKT
Legen Sie den Befehl so fest, dass er beim Start des Containers ausgeführt wird.
In einer Docker-Datei können mehrere ENTRYPOINT-Anweisungen vorhanden sein, aber nur die letzte ist wirksam. Die Parameter nach CMD oder Docker Run werden als Parameter an ENTRYPOINT übergeben.

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • Befehlsanalyse zum Schreiben von Dockerfile-Dateien und Erstellen von Images
  • Implementierung zum Erstellen benutzerdefinierter Images mit Dockerfile
  • Erstellen Sie ein Docker-Image mit Dockerfile
  • Schritte zum Erstellen eines Docker-Images mit Dockerfile
  • So erstellen Sie ein Tomcat-Image basierend auf Dockerfile
  • Beispiel für die Verwendung von Dockerfile zum Erstellen eines Nginx-Images
  • So verwenden Sie Dockerfile zum Erstellen von Images
  • Beispielcode zum Erstellen eines Docker-Images mit der Dockerfile-Anweisung

<<:  Tutorial zur Installation und Konfiguration von MySQL für Mac

>>:  js, um ein Wasserfall-Flusslayout zu erreichen (unendliches Laden)

Artikel empfehlen

Eine kurze Analyse des Unterschieds zwischen FIND_IN_SET() und IN in MySQL

Ich habe die Mysql FIND_IN_SET-Funktion vor einig...

Der Unterschied zwischen Hash-Modus und Verlaufsmodus im Vue-Router

vue-router hat zwei Modi Hash-Modus Verlaufsmodus...

Detaillierte Erklärung von Softlinks und Hardlinks in Linux

Inhaltsverzeichnis 1. Grundlegende Speicherung vo...

Eine kurze Erläuterung der Rolle des Parameters docker --privileged=true

Mit etwa Version 0.6 wurde Privileged in Docker e...

15 Linux-Befehlsaliase, die Ihnen Zeit sparen

Vorwort Bei der Verwaltung und Wartung des Linux-...

Eine kurze Analyse zum Upgrade von PHP 5.4 auf 5.6 in CentOS 7

1. Überprüfen Sie die PHP-Version nach dem Aufruf...

Implementierungsschritte für die Docker-Bereitstellung lnmp-wordpress

Inhaltsverzeichnis 1. Experimentelle Umgebung 2. ...

Detailliertes Tutorial zum Kompilieren und Installieren von Python3.6 unter Linux

1. Gehen Sie zunächst auf die offizielle Website ...

So erstellen Sie einen Pod in Kubernetes

Inhaltsverzeichnis Wie erstelle ich einen Pod? We...

Anweisungen zur verschachtelten Verwendung von MySQL ifnull

Verschachtelte Verwendung von MySQL ifnull Ich ha...

React DVA-Implementierungscode

Inhaltsverzeichnis dva Verwendung von dva Impleme...

Zusammenfassung gängiger Befehle für Ubuntu-Server

Die meisten der folgenden Befehle müssen in der K...

Hinweise zur IE8-Kompatibilität, die mir aufgefallen sind

1. getElementById von IE8 unterstützt nur IDs, nic...