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.
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.
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.
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).
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.
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.
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
.
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.