Exploring Docker, Teil 4: Reduzieren der Größe von Bildern und Beschleunigen ihrer Montage

In diesem Teil der Übersetzung der Docker-Reihe werden wir darüber sprechen, wie Sie die Bildgröße optimieren und die Montage beschleunigen können. In früheren Materialien haben wir Docker-Bilder mit Pizza, Begriffe mit Donuts und Dockerfile-Anweisungen mit Bagels verglichen. Heute wird nicht gebacken. Es ist Zeit, eine Diät zu machen.

Teil 1: die Grundlagen
Teil 2: Begriffe und Konzepte
Teil 3: Dockerfile-Dateien
Teil 4: Verkleinern von Bildern und Beschleunigen ihrer Montage
Teil 5: Teams
Teil 6: Arbeiten mit Daten


Um zu verstehen, worüber wir hier sprechen werden, ist es hilfreich, wenn Sie die Erinnerung an das auffrischen, was im dritten Teil dieser Materialreihe besprochen wurde. Dort haben wir nämlich über Dockerfile-Dateianweisungen gesprochen. Wenn Sie diese Anweisungen und die Funktionen von Docker kennen, die wir heute diskutieren, können Sie Ihre Docker-Bilddateien optimieren.

Caching


Eine der Stärken von Docker ist das Caching. Dank dieses Mechanismus wird die Zusammenstellung von Bildern beschleunigt.

Beim Zusammenstellen eines Docker-Images folgen die Anweisungen der Docker-Datei in der angegebenen Reihenfolge. Während der Analyse von Anweisungen überprüft Docker seinen eigenen Cache auf Bilder, die wir in den Zwischenphasen des Zusammenstellens anderer Bilder erhalten. Wenn solche Bilder gefunden werden können, kann das System sie verwenden, ohne Zeit damit zu verschwenden, sie neu zu erstellen.

Wenn der Cache ungültig ist, wird die Anweisung ausgeführt, in der er ausgeführt wurde, und es wird eine neue Ebene erstellt, ohne den Cache zu verwenden. Das gleiche passiert, wenn Sie die folgenden Anweisungen ausführen.

Wenn sich während der Ausführung von Anweisungen aus der Docker-Datei herausstellt, dass sich das Basis-Image im Cache befindet, wird dieses Image aus dem Cache verwendet. Dies wird als Cache-Treffer bezeichnet. Befindet sich das Basis-Image nicht im Cache, wird der gesamte Prozess der Image-Assemblierung ohne Verwendung des Caches ausgeführt.

Anschließend wird die folgende Anweisung mit allen Bildern aus dem Cache verglichen, die auf demselben Basisbild basieren, das bereits im Cache gefunden wurde. Jedes zwischengespeicherte Zwischenbild wird überprüft, um festzustellen, ob es das enthält, was mit derselben Anweisung erstellt wurde. Wenn keine Übereinstimmung gefunden werden kann, wird dies als "Cache-Fehler" bezeichnet und der Cache wird als ungültig betrachtet. Das gleiche passiert, bis die gesamte Docker-Datei verarbeitet ist.

Die meisten neuen Anweisungen werden einfach mit den bereits in den Zwischenbildern enthaltenen verglichen. Wenn es dem System gelingt, eine Übereinstimmung zu finden, verwendet die Assembly das, was sich bereits im Cache befindet.

Die Verwendung eines Caches kann das Zusammenstellen von Bildern beschleunigen, es gibt jedoch ein Problem. Wenn beispielsweise in der Docker-Datei eine Anweisung RUN pip install -r requirements.txt require.txt gefunden wird, sucht Docker in seinem lokalen Cache mit Zwischenbildern nach derselben Anweisung. Der Inhalt der alten und der neuen Version der Datei require.txt wird jedoch nicht verglichen.

Dies kann zu Problemen führen, wenn der requirements.txt Informationen zu neuen Paketen hinzugefügt wurden. Anschließend müssen Sie beim Erstellen des aktualisierten Abbilds die RUN pip install Anweisung erneut ausführen, um einen neuen Satz von Paketen zu RUN pip install . Bald werden wir darüber sprechen, wie wir mit diesem Problem umgehen können.

Im Gegensatz zu anderen Docker-Anweisungen muss Docker beim Ausführen der ADD und COPY Anweisungen den Inhalt der Datei oder der Dateien überprüfen, um festzustellen, ob der Cache beim Erstellen des Bildes verwendet werden kann. Die Prüfsumme der in diesen Anweisungen genannten Dateien wird nämlich mit der Prüfsumme der Dateien verglichen, die sich in den Zwischenbildern befinden, die sich bereits im Cache befinden. Wenn sich der Inhalt der Dateien oder ihrer Metadaten geändert hat, wird der Cache ungültig.

Hier einige Tipps zur Nutzung des Docker-Cache:

  • Das Caching kann deaktiviert werden, indem der Schalter --no-cache=True an den docker build .
  • Wenn Sie beabsichtigen, Änderungen an den Dockerfile-Anweisungen vorzunehmen, wird jede Ebene, die durch die nach den geänderten Anweisungen kommenden Anweisungen erstellt wird, häufig ohne Verwendung eines Caches neu zusammengesetzt. Platzieren Sie Anweisungen, die sich höchstwahrscheinlich ändern, so nahe wie möglich am Ende der Docker-Datei, um das Caching zu nutzen.
  • Kombinieren Sie die RUN apt-get update Befehle RUN apt-get update und apt-get install in Ketten, um Probleme im Zusammenhang mit der unsachgemäßen Verwendung des Caches zu vermeiden.
  • Wenn Sie Paketmanager wie pip mit der Datei pip , halten Sie sich an das folgende Schema, um die Verwendung veralteter Zwischenbilder aus dem Cache auszuschließen, der die in der alten Version der Datei require.txt aufgeführten Pakete enthält. So sieht es aus:

     COPY requirements.txt /tmp/ RUN pip install -r /tmp/requirements.txt COPY . /tmp/ 

Wenn Sie andere Möglichkeiten kennen, um mit dem Problem „require.txt“ umzugehen, können Sie dies in den Kommentaren erläutern.

Reduzierung der Bildgröße


▍ Sorgfältige Auswahl des Grundbildes


Docker-Bilder können sehr groß sein. Dies widerspricht dem begründeten Wunsch der Person, die sie erstellt, sie so kompakt wie möglich zu gestalten, was das Herunterladen aus einem Remote-Repository erleichtert und sich positiv auf die Menge an freiem Speicherplatz auf dem Computer auswirkt, auf den sie geladen werden. Lassen Sie uns darüber sprechen, wie sie ihre Größe reduzieren können.


Anstelle von Bagels und Donuts werden wir jetzt Gemüse essen

Eine Möglichkeit, die Größe von Bildern zu verringern, besteht darin, die Grundbilder sorgfältig auszuwählen und sie anschließend anzupassen.

Das grundlegende Alpine-Image ist beispielsweise eine vollständige Distribution eines Linux-ähnlichen Betriebssystems, das ein Minimum an zusätzlichen Paketen enthält. Seine Größe beträgt ungefähr 5 Megabyte. Das Erstellen eines eigenen Images auf Alpine-Basis erfordert jedoch viel Zeit, um es mit allem auszustatten, was für den Betrieb einer bestimmten Anwendung erforderlich ist.

Es gibt auch spezielle Versionen des Grundbildes der Alpen. Das entsprechende Bild aus dem Python-Repository, in das das print("hello world") gepackt ist, wiegt beispielsweise etwa 78,5 MB. Hier ist die Docker-Datei zum Erstellen eines solchen Images:

 FROM python:3.7.2-alpine3.8 COPY . /app ENTRYPOINT ["python", "./app/my_script.py", "my_var"] 

Gleichzeitig gibt der Docker Hub an, dass dieses Basis-Image eine Größe von 29 MB hat. Die Größe eines auf diesem Basis-Image basierenden Images wird durch Herunterladen und Installieren von Python erhöht.

Zusätzlich zur Verwendung von Basisbildern auf Alpine-Basis können Sie die Größe von Bildern mithilfe der mehrstufigen Montagetechnologie reduzieren.

▍ Mehrstufige Zusammenstellung von Bildern


Die Docker-Datei, die die mehrstufige Zusammenstellung eines Bildes beschreibt, verwendet mehrere FROM Anweisungen. Der Ersteller eines solchen Bildes kann das selektive Kopieren von Dateien, die als Build-Artefakte bezeichnet werden, von einer Build-Ebene auf eine andere einrichten. Gleichzeitig wird es möglich, alles loszuwerden, was im fertigen Bild nicht benötigt wird. Dank dieser Methode können Sie die Größe des fertigen Bildes reduzieren.

So funktioniert jede FROM Anweisung:

  • Sie beginnt einen neuen Schritt.
  • Dies hängt nicht davon ab, was im vorherigen Erstellungsschritt erstellt wurde.
  • Sie kann ein Grundbild verwenden, das sich von dem im vorherigen Schritt verwendeten unterscheidet.

Hier ist ein modifiziertes Beispiel für eine Docker-Datei aus der Docker- Dokumentation , die einen mehrstufigen Build beschreibt.

 FROM golang:1.7.3 AS build WORKDIR /go/src/github.com/alexellis/href-counter/ RUN go get -d -v golang.org/x/net/html COPY app.go . RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app . FROM alpine:latest RUN apk --no-cache add ca-certificates WORKDIR /root/ COPY --from=build /go/src/github.com/alexellis/href-counter/app . CMD ["./app"] 

Bitte beachten Sie, dass wir den Namen der ersten Stufe der Assembly angegeben haben und ihn nach der FROM Anweisung angegeben haben. Wir verweisen auf die benannte Erstellungsphase in der COPY --from= unten in der Docker-Datei.

Die Verwendung des mehrstufigen Image-Assemblierungsprozesses ist in einigen Fällen sinnvoll, wenn Sie viele Container für die Produktionsumgebung erstellen müssen. Mit der mehrstufigen Baugruppe können Sie die Größe des fertigen Bildes minimieren. Manchmal erschwert dieser Ansatz jedoch die Unterstützung von Bildern. Daher werden Sie in den Fällen, in denen Sie darauf verzichten können, wahrscheinlich keine mehrstufige Montage von Bildern verwenden. Über die Funktionen dieser Technologie können Sie hier und hier lesen.

Wie Sie sehen, ist die mehrstufige Montage eine interessante Technologie, die jedoch nicht für alle Fälle geeignet ist. Die gleiche Methode zur Reduzierung der Bildgröße, die wir weiter unten erläutern werden, kann absolut jedem empfohlen werden.

▍ .dockerignore-Datei


Jeder, der Docker lernen möchte, muss etwas über .dockerignore Dateien wissen. Diese Dateien ähneln .gitignore Dateien. Sie enthalten eine Liste von Dateien und Ordnern in Form von Namen oder Vorlagen, die Docker bei der Image-Assemblierung ignorieren sollte.

Diese Datei befindet sich dort, wo sich die Docker-Datei befindet, und alles andere, was im Kontext der Image-Assembly enthalten ist.

Wenn Sie den docker build ausführen, der die Assemblierung des Images initiiert, überprüft Docker den Ordner auf das Vorhandensein der .dockerignore Datei. Wenn eine solche Datei gefunden werden kann, wird diese Datei analysiert, und die Regeln der Match() Funktion aus dem filepath Go-Paket und einige seiner eigenen Docker- Regeln werden verwendet, um die Liste der zu ignorierenden Dateien zu bestimmen.

Wenn beispielsweise eine Vorlage des Formulars *.jpg in der .dockerignore Datei gefunden wird, werden beim Erstellen eines Bildes Dateien mit einem beliebigen Namen und der Erweiterung .jpg ignoriert. Wenn die Zeichenfolgenvideos in der Datei videos werden, ignoriert das System den Videoordner und seinen gesamten Inhalt.

Wenn Sie eine .dockerignore Datei kompilieren, können Sie sie mit dem Symbol # kommentieren.

Die .dockerignore Datei bietet jedem, der Docker-Images erstellt, .dockerignore :

  • Auf diese Weise können Sie vertrauliche Informationen wie Anmeldungen und Kennwörter aus den Bilddateien ausschließen.
  • Auf diese Weise können Sie die Bildgröße reduzieren. Je kleiner die Dateien im Bild sind, desto kleiner ist die Größe und desto schneller kann damit gearbeitet werden.
  • Dies ermöglicht es, die Anzahl der Gründe für die Ungültigmachung des Caches beim Zusammenstellen ähnlicher Bilder zu verringern. Wenn sich beispielsweise während des erneuten Zusammenbaus des Images einige Servicedateien des Projekts ändern, z. B. Protokolldateien, aufgrund derer die im Cache gespeicherten Daten im Wesentlichen unangemessen ungültig werden, verlangsamt dies das Zusammenstellen von Images.

Weitere .dockerignore zur .dockerignore Datei finden Sie in der Docker- Dokumentation .

Bildgrößenforschung


Lassen Sie uns darüber sprechen, wie Sie mithilfe der Befehlszeilentools die Größe von Docker-Images und -Containern ermitteln.

  • Um die ungefähre Größe eines laufenden Containers zu ermitteln, können Sie einen Befehl des Formular- docker container ls -s .
  • Der docker image ls zeigt die docker image ls .
  • Mit dem docker image history my_image:my_tag Sie die Größe von Zwischenbildern ermitteln, aus denen ein bestimmtes Bild zusammengestellt wird.
  • Mit dem docker image inspect my_image:tag können Sie detaillierte Informationen zum Bild docker image inspect my_image:tag , einschließlich der Größe der einzelnen Ebenen. Ebenen unterscheiden sich geringfügig von den Zwischenbildern, aus denen das fertige Bild besteht. In den meisten Fällen können sie jedoch als identische Einheiten betrachtet werden. Hier finden Sie gutes Material zu den Details der internen Struktur von Docker-Images.
  • Um den Inhalt von Containern zu untersuchen, können Sie das Tauchpaket installieren.

Nachdem wir die Möglichkeiten zur Reduzierung der Bildgröße erörtert haben, mache ich Sie auf acht Empfehlungen zur Reduzierung der Bildgröße und zur Beschleunigung des Zusammenbaus aufmerksam.

Empfehlungen zur Reduzierung der Bildgröße und zur Beschleunigung des Montageprozesses


  1. Verwenden Sie nach Möglichkeit offizielle Bilder als Basisbilder. Offizielle Bilder werden regelmäßig aktualisiert, sie sind sicherer als informelle Bilder.
  2. Verwenden Sie Basisbilder auf Basis von Alpine Linux, um möglichst kompakte Bilder zu sammeln.
  3. Wenn Sie apt , kombinieren Sie die Befehle apt-get update und apt-get install in einer RUN Anweisung. Kombinieren Sie außerdem Paketinstallationsbefehle in einer einzigen Anweisung. Listen Sie Pakete alphabetisch in mehreren Zeilen auf und trennen Sie die Liste durch \ . Zum Beispiel könnte es so aussehen:

     RUN apt-get update && apt-get install -y \   package-one \   package-two \   package-three && rm -rf /var/lib/apt/lists/* 

    Diese Methode reduziert die Anzahl der Ebenen, die dem Bild hinzugefügt werden sollen, und hilft dabei, den Dateicode in einer anständigen Form zu halten.
  4. Fügen Sie am Ende der RUN Anweisung, die zum Installieren von Paketen verwendet wird, ein Konstrukt wie && rm -rf /var/lib/apt/lists/* . Dadurch wird der apt Cache apt und nicht in der durch den Befehl RUN gebildeten Ebene gespeichert. Details dazu finden Sie in der Dokumentation .
  5. Verwenden Sie Ihre Caching-Funktionen mit Bedacht, indem Sie Befehle in die Docker-Datei einfügen, die sich höchstwahrscheinlich gegen Ende der Datei ändern.
  6. Verwenden Sie die .dockerignore Datei.
  7. Schauen Sie sich dive , ein großartiges Tool zum Erkunden von Docker-Bildern, mit dessen Hilfe Sie die Größe reduzieren können.
  8. Installieren Sie keine Pakete, auf die verzichtet werden kann.

Zusammenfassung


Jetzt wissen Sie, wie Sie Docker-Images schnell zusammenstellen, schnell aus Repositorys laden und nicht zu viel Computerplatz beanspruchen können. Nächstes Mal werden wir über Docker-Teams sprechen.

Liebe Leser! Haben Sie beim Erstellen von Docker-Images Probleme mit den Caching-Mechanismen festgestellt?

Source: https://habr.com/ru/post/de440658/


All Articles