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.
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:
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 BEWAHRER KOPIE HINZUFÜGEN Umwelt ENV MEINE_VERSION 1.3RUN apt-get install -y meinpaket=$MEINE_VERSION EXPONIEREN VOLUMEN ARBEITSVERZEICHNIS LAUFEN CMD EINSTIEGSPUNKT 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:
|
<<: Tutorial zur Installation und Konfiguration von MySQL für Mac
>>: js, um ein Wasserfall-Flusslayout zu erreichen (unendliches Laden)
Ich habe die Mysql FIND_IN_SET-Funktion vor einig...
vue-router hat zwei Modi Hash-Modus Verlaufsmodus...
Inhaltsverzeichnis 1. Grundlegende Speicherung vo...
Mit etwa Version 0.6 wurde Privileged in Docker e...
Vorwort Bei der Verwaltung und Wartung des Linux-...
Als Neuling, der gerade mit dem Linux-System in K...
1. Überprüfen Sie die PHP-Version nach dem Aufruf...
Inhaltsverzeichnis 1. Experimentelle Umgebung 2. ...
1. Gehen Sie zunächst auf die offizielle Website ...
Inhaltsverzeichnis Wie erstelle ich einen Pod? We...
Verschachtelte Verwendung von MySQL ifnull Ich ha...
Installieren Sie MySQL und machen Sie sich Notize...
Inhaltsverzeichnis dva Verwendung von dva Impleme...
Die meisten der folgenden Befehle müssen in der K...
1. getElementById von IE8 unterstützt nur IDs, nic...