Optimierung der Docker-Image-Größe

DockerDockerBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

Docker ist zu einer weit verbreiteten Technologie für die Erstellung, Bereitstellung und Verwaltung von Anwendungen in einer containerisierten Umgebung geworden. Die Größe von Docker-Images kann jedoch einen erheblichen Einfluss auf die Leistung, die Bereitstellungsdauer und die Speicheranforderungen Ihrer Anwendung haben. Dieses Tutorial führt Sie durch den Prozess der Optimierung der Größe Ihrer Docker-Images und behandelt die grundlegenden Konzepte, praktischen Techniken und Best Practices, um effizientere und leichtere Container zu erstellen.

Grundlagen von Docker-Images

Was ist ein Docker-Image?

Ein Docker-Image ist ein leichtgewichtiges, eigenständiges, ausführbares Paket, das alles enthält, was zum Ausführen einer Anwendung benötigt wird – den Code, die Laufzeitumgebung, Systemtools, Bibliotheken und Einstellungen. Docker-Images sind die Bausteine von Docker-Containern, die die Laufzeitinstanzen der Docker-Images darstellen.

Docker-Image-Layers

Docker-Images werden aus einer Reihe von Layers aufgebaut. Jede Layer repräsentiert eine Anweisung in der Dockerfile des Images. Diese Layers werden übereinander gestapelt, um das endgültige Image zu bilden. Wenn ein Image aktualisiert wird, werden nur die geänderten Layers neu erstellt, was den Prozess der Erstellung und Verteilung von Images effizient macht.

graph TB subgraph Docker Image Layers layer1[Layer 1] --> layer2[Layer 2] layer2 --> layer3[Layer 3] layer3 --> layer4[Layer 4] layer4 --> layer5[Layer 5] end

Docker-Image-Größen

Docker-Images können je nach Anwendung und verwendetem Basis-Image stark variieren, von einigen Megabytes bis zu mehreren Gigabytes. Kleinere Images werden im Allgemeinen bevorzugt, da sie schneller erstellt, heruntergeladen und bereitgestellt werden können und weniger Speicherplatz und Arbeitsspeicher auf dem Hostsystem benötigen.

Basis-Image Größe
alpine:latest 5,6 MB
ubuntu:latest 77,8 MB
nginx:latest 133 MB
python:3.9-slim 113 MB

Docker-Image-Registries

Docker-Images werden typischerweise in einem Docker-Registry gespeichert, einem Dienst zum Speichern und Verteilen von Docker-Images. Das bekannteste Registry ist Docker Hub, das ein öffentliches Repository von Docker-Images bereitstellt. Entwickler können auch eigene private Registries einrichten, um ihre eigenen benutzerdefinierten Images zu speichern und zu verwalten.

Techniken zur Optimierung der Imagegröße

Auswahl eines kleineren Basis-Images

Das Basis-Image, das Sie für Ihr Docker-Image auswählen, kann einen erheblichen Einfluss auf die endgültige Imagegröße haben. Die Verwendung eines kleineren Basis-Images, wie z. B. alpine oder scratch, kann die Gesamtgröße des Images erheblich reduzieren.

## Verwendung eines größeren Basis-Images
FROM ubuntu:latest
## Verwendung eines kleineren Basis-Images
FROM alpine:latest

Minimierung der Anzahl der Layers

Jede Anweisung in einer Dockerfile erstellt eine neue Layer im Image. Die Minimierung der Anzahl der Layers kann dazu beitragen, die Gesamtgröße des Images zu reduzieren.

## Schlechte Praxis: mehrere RUN-Befehle
RUN apt-get update
RUN apt-get install -y curl
RUN apt-get install -y wget

## Gute Praxis: Kombinieren von RUN-Befehlen
RUN apt-get update \
 && apt-get install -y curl wget

Verwendung von Multi-Stage-Builds

Multi-Stage-Builds ermöglichen es Ihnen, mehrere FROM-Anweisungen in einer einzigen Dockerfile zu verwenden, jede mit einem anderen Basis-Image. Dies kann dazu beitragen, ein kleineres endgültiges Image zu erstellen, indem nur die notwendigen Komponenten enthalten sind.

## Dockerfile
FROM golang:1.16 AS builder
COPY . /app
RUN go build -o /app/myapp

FROM alpine:latest
COPY --from=builder /app/myapp /app/myapp
CMD ["/app/myapp"]

Nutzung der Image-Caching-Mechanismen

Der Image-Caching-Mechanismus von Docker kann dazu beitragen, den Build-Prozess zu optimieren und die Zeit zu verkürzen, die zum Erstellen eines Images benötigt wird. Durch die Wiederverwendung von gecachten Layers kann Docker vermeiden, Teile des Images neu zu erstellen, die sich nicht geändert haben.

Bereinigung nicht verwendeter Docker-Ressourcen

Im Laufe der Zeit kann sich in Ihrer Docker-Umgebung ein nicht verwendeter Speicher an Images, Containern, Netzwerken und Volumes ansammeln, der einen erheblichen Teil des Speicherplatzes einnehmen kann. Die regelmäßige Bereinigung dieser nicht verwendeten Ressourcen kann dazu beitragen, Ihre Docker-Umgebung schlank und effizient zu halten.

## Bereinigung nicht verwendeter Docker-Ressourcen
docker system prune -a

Best Practices für kleinere Docker-Images

Verwendung eines schlanken Basis-Images

Wie bereits erwähnt, kann die Verwendung eines kleineren Basis-Images, wie z. B. alpine oder scratch, die Größe Ihres Docker-Images erheblich reduzieren. Diese schlanken Basis-Images enthalten nur die essentiellen Pakete und Abhängigkeiten, wodurch der Gesamt-Fußabdruck minimiert wird.

## Verwendung eines schlanken Basis-Images
FROM alpine:latest

Vermeiden der Installation unnötiger Pakete

Installieren Sie in Ihrer Dockerfile nur die Pakete, die für den Betrieb Ihrer Anwendung erforderlich sind. Vermeiden Sie die Installation zusätzlicher Tools oder Dienstprogramme, die Sie nicht benötigen, da diese die Größe Ihres Images erhöhen.

## Schlechte Praxis: Installation unnötiger Pakete
RUN apt-get update \
 && apt-get install -y curl wget vim

## Gute Praxis: Installation nur notwendiger Pakete
RUN apt-get update \
 && apt-get install -y curl

Nutzung von Multi-Stage-Builds

Wie im vorherigen Abschnitt erläutert, können Multi-Stage-Builds dazu beitragen, kleinere endgültige Images zu erstellen, indem die Build- und Laufzeitumgebungen getrennt werden.

## Dockerfile mit Multi-Stage-Build
FROM golang:1.16 AS builder
COPY . /app
RUN go build -o /app/myapp

FROM alpine:latest
COPY --from=builder /app/myapp /app/myapp
CMD ["/app/myapp"]

Verwendung von .dockerignore zur Ausschluss unnötiger Dateien

Die Datei .dockerignore ermöglicht es Ihnen, Dateien und Verzeichnisse anzugeben, die vom Docker-Build-Kontext ausgeschlossen werden sollen. Dies kann dazu beitragen, die Größe des Build-Kontexts und folglich die Größe des endgültigen Images zu reduzieren.

## .dockerignore
.git
*.md
Dockerfile

Optimierung der Image-Layers

Optimieren Sie Ihre Dockerfile, indem Sie mehrere RUN-Befehle kombinieren, den Operator && verwenden und unnötige Layers vermeiden. Dies kann dazu beitragen, die Anzahl der Layers in Ihrem Image zu reduzieren, was zu einer kleineren Gesamtgröße führt.

## Schlechte Praxis: mehrere RUN-Befehle
RUN apt-get update
RUN apt-get install -y curl
RUN apt-get install -y wget

## Gute Praxis: Kombinieren von RUN-Befehlen
RUN apt-get update \
 && apt-get install -y curl wget

Regelmäßige Bereinigung nicht verwendeter Ressourcen

Wie bereits erwähnt, kann die regelmäßige Bereinigung nicht verwendeter Docker-Ressourcen wie Images, Container, Netzwerke und Volumes dazu beitragen, Ihre Docker-Umgebung schlank und effizient zu halten.

## Bereinigung nicht verwendeter Docker-Ressourcen
docker system prune -a

Durch die Befolgung dieser Best Practices können Sie die Größe Ihrer Docker-Images effektiv optimieren und so deren Erstellung, Verteilung und Bereitstellung effizienter gestalten.

Zusammenfassung

In diesem umfassenden Tutorial lernen Sie, wie Sie die Größe Ihrer Docker-Images optimieren, indem Sie die Grundlagen von Docker-Images verstehen, verschiedene Techniken zur Reduzierung der Imagegröße erkunden und bewährte Verfahren für die Erstellung kleinerer und effizienterer Container befolgen. Durch die Implementierung der in diesem Leitfaden behandelten Strategien können Sie die Leistung, die Bereitstellung und die allgemeine Verwaltung Ihrer Docker-basierten Anwendungen verbessern.