24 Vertiefung in Docker-Container und Docker-Images

24.1 Einführung

In diesem Kapitel wird auf fortgeschrittene Konzepte und Techniken im Umgang mit Docker-Containern und Docker-Images eingegangen. Wir betrachten die Verwaltung und Optimierung von Images und Containern sowie die Verwendung von erweiterten Docker-Features.

24.2 Fortgeschrittene Docker-Container-Verwaltung

24.2.1 Ressourcenbeschränkungen für Container

Docker ermöglicht es, die Ressourcen (CPU, RAM) eines Containers zu begrenzen, um sicherzustellen, dass kein Container zu viele Ressourcen verbraucht.

Beispiel: Container mit CPU- und Speicherbeschränkung starten

Befehl:

docker run -d --name limited-container --cpus="1.5" --memory="512m" nginx

Erklärung: Dieser Befehl startet einen Container namens limited-container mit einer CPU-Beschränkung von 1,5 CPUs und einem maximalen Speicher von 512 MB.

24.2.2 Container-Neustart-Richtlinien

Docker bietet verschiedene Richtlinien zum Neustarten von Containern, um die Verfügbarkeit und Stabilität zu gewährleisten.

Beispiel: Container mit Neustart-Richtlinie starten

Befehl:

docker run -d --name restart-container --restart=always nginx

Erklärung: Dieser Befehl startet einen Container namens restart-container mit der Neustart-Richtlinie always, wodurch der Container immer neu gestartet wird, wenn er gestoppt oder beendet wird.

24.2.3 Namensräume und Cgroups

Docker verwendet Linux-Namensräume (Namespaces) und Control Groups (Cgroups) zur Isolation und Ressourcenverwaltung.

Namespaces: Isolieren die Ressourcen, die ein Prozess sehen kann (z.B. PID, Netzwerk, Mounts). Cgroups: Verwalten und begrenzen die Ressourcen, die ein Prozess nutzen kann (z.B. CPU, Speicher).

24.3 Fortgeschrittene Docker-Image-Verwaltung

24.3.1 Optimierung von Docker-Images

Optimierte Docker-Images sind kleiner und schneller zu erstellen und zu starten. Best Practices beinhalten das Minimieren der Schichten und das Verwenden von schlanken Basis-Images.

Beispiel: Optimiertes Dockerfile

Datei: Dockerfile

# Basis-Image
FROM node:14-alpine

# Arbeitsverzeichnis setzen
WORKDIR /app

# Abhängigkeiten kopieren und installieren
COPY package*.json ./
RUN npm install

# Anwendungsdateien kopieren
COPY . .

# Port freigeben
EXPOSE 3000

# Startbefehl festlegen
CMD ["node", "app.js"]

Erklärung: Das obige Dockerfile verwendet das schlanke node:14-alpine Basis-Image und minimiert die Schichten durch das Kopieren und Installieren der Abhängigkeiten in einem Schritt.

24.3.2 Mehrstufige Builds

Mehrstufige Builds ermöglichen es, schlanke und effiziente Docker-Images zu erstellen, indem unnötige Build-Artefakte aus dem endgültigen Image entfernt werden.

Beispiel: Dockerfile mit mehrstufigem Build

Datei: Dockerfile

# Build-Stage
FROM maven:3.6.3-jdk-11 as build
WORKDIR /app
COPY . .
RUN mvn clean package

# Run-Stage
FROM openjdk:11-jre-slim
WORKDIR /app
COPY --from=build /app/target/myapp.jar .
EXPOSE 8080
CMD ["java", "-jar", "myapp.jar"]

Erklärung: Das obige Dockerfile verwendet zwei Stages: eine Build-Stage, die das Maven-Image verwendet, um das Projekt zu bauen, und eine Run-Stage, die das schlanke OpenJDK-Image verwendet, um die Anwendung auszuführen.

24.3.3 Docker-Image-Tagging

Tagging hilft bei der Versionierung und Verwaltung von Docker-Images. Es ist eine gute Praxis, Images mit spezifischen Tags zu versehen, anstatt nur latest zu verwenden.

Beispiel: Image mit Tag erstellen

Befehl:

docker build -t myapp:1.0 .

Erklärung: Dieser Befehl erstellt ein Docker-Image mit dem Tag 1.0.

24.3.4 Docker-Image-Cache verwenden

Der Docker-Cache kann den Build-Prozess beschleunigen, indem zuvor erstellte Schichten wiederverwendet werden.

Befehl:

docker build -t myapp:1.0 --build-arg CACHEBUST=$(date +%s) .

Erklärung: Der --build-arg CACHEBUST=$(date +%s) Trick invalidiert den Cache, was nützlich sein kann, wenn man sicherstellen möchte, dass bestimmte Schritte immer neu ausgeführt werden.

Das Verständnis und die Anwendung fortgeschrittener Techniken zur Verwaltung von Docker-Containern und -Images ist entscheidend für die Optimierung der Leistung und Effizienz von Container-basierten Anwendungen. Durch die Nutzung von Ressourcenbeschränkungen, Neustart-Richtlinien, Namensräumen, Cgroups, optimierten Dockerfiles, mehrstufigen Builds und effektivem Tagging können Docker-Anwendungen besser verwaltet und skaliert werden. Im nächsten Kapitel wird die Datenverwaltung in Docker mit Volumes und Bind Mounts behandelt.