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 DatenUm 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:
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 essenEine 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
- Verwenden Sie nach Möglichkeit offizielle Bilder als Basisbilder. Offizielle Bilder werden regelmäßig aktualisiert, sie sind sicherer als informelle Bilder.
- Verwenden Sie Basisbilder auf Basis von Alpine Linux, um möglichst kompakte Bilder zu sammeln.
- 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. - 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 . - 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.
- Verwenden Sie die
.dockerignore
Datei. - Schauen Sie sich
dive
, ein großartiges Tool zum Erkunden von Docker-Bildern, mit dessen Hilfe Sie die Größe reduzieren können. - 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?
