Schritt 1 — Docker- und Container-Konzepte
Docker-Container bündeln alle Abhängigkeiten und Konfigurationen, die für den Betrieb einer Anwendung erforderlich sind, in einem einzigen Paket. Dies ermöglicht:
- die Beseitigung des „Es funktioniert auf meinem Rechner“-Problems
- konsistente Ausführung desselben Images in verschiedenen Umgebungen
- schnelles Starten und Stoppen von Anwendungen
Container basieren auf den Linux-Technologien „Namespaces“ und „cgroups“. Namespaces isolieren Netzwerk, Prozesse und Benutzerbereiche jedes Containers. Cgroups ermöglichen die Ressourcenkontrolle (CPU, RAM, Festplatte).
Schritt 2 — Docker-Installation
Installation unter Ubuntu/Debian:
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Überprüfen Sie die Installation:
docker --version
docker compose version
Stellen Sie sicher, dass der Docker-Dienst aktiv ist:
sudo systemctl status docker
Schritt 3 — Verwaltung von Docker-Images
Docker-Images enthalten das Dateisystem und alle Abhängigkeiten, die für den Betrieb von Containern erforderlich sind.
docker pull nginx:latest
docker images
docker rmi nginx:latest
docker tag nginx:latest meinrepo/nginx:v1
docker save -o nginx.tar nginx:latest
docker load -i nginx.tar
Images bestehen aus mehreren Schichten, was Speicherplatz spart und Build-Zeiten optimiert. Als Best Practice sollten Sie Ihre Dockerfile-Befehle logisch gruppieren und unnötige Pakete entfernen.
Schritt 4 — Verwaltung von Docker-Containern
Container sind laufende Instanzen von Images.
# Container starten
docker run -d --name web -p 8080:80 nginx:latest
# Laufende Container auflisten
docker ps
# Alle Container auflisten
docker ps -a
# Logs anzeigen
docker logs -f web
# In Container einsteigen
docker exec -it web bash
# Container stoppen/starten
docker stop web
docker start web
# Container löschen
docker rm web
Container sind flüchtig (ephemeral). Für persistente Daten sollten Volumes verwendet werden.
Schritt 5 — Volumes und Datenmanagement
Volumes ermöglichen die dauerhafte Speicherung von Daten außerhalb des Containers.
docker volume create meinvol
docker run -d -v meinvol:/daten nginx
docker volume ls
docker volume inspect meinvol
docker volume rm meinvol
Volumes werden standardmäßig unter /var/lib/docker/volumes/ gespeichert.
Ein Beispiel zum Mounten eines lokalen Host-Verzeichnisses:
docker run -d -v /home/benutzer/daten:/daten nginx
Backup eines Volumes:
docker run --rm -v meinvol:/daten -v $(pwd):/backup busybox tar czf /backup/vol_backup.tar.gz /daten
Schritt 6 — Netzwerkmanagement
Docker-Netzwerke ermöglichen die Kommunikation zwischen Containern.
docker network ls
docker network create meinnetz
docker run -d --name app1 --network=meinnetz nginx
docker run -d --name app2 --network=meinnetz nginx
docker exec -it app1 ping app2
Bridge-Modus ist Standard. Benutzerspezifische Netzwerke ermöglichen automatische DNS-Namensauflösung.
Schritt 7 — Docker Compose
Docker Compose erlaubt es, Multi-Container-Anwendungen über eine YAML-Datei zu definieren.
Beispiel docker-compose.yml:
version: '3.9'
services:
web:
image: nginx
ports:
- "80:80"
# Anwendung starten
docker compose up -d
# Status prüfen
docker compose ps
# Logs ansehen
docker compose logs
# Anwendung stoppen
docker compose down
Man kann auch build: anstelle von image: verwenden, um Images aus Dockerfiles zu bauen.
Schritt 8 — Verwendung von Docker Registry
Registries dienen zum Speichern und Verteilen von Docker-Images. Docker Hub ist die Standard-Registry, aber man kann auch eine eigene betreiben.
# Bei Docker Hub anmelden
docker login
# Image taggen und pushen
docker tag nginx:latest meinbenutzer/nginx:v1
docker push meinbenutzer/nginx:v1
Lokale Registry betreiben:
docker run -d -p 5000:5000 --name registry registry:2
docker tag nginx:latest localhost:5000/nginx
docker push localhost:5000/nginx
docker pull localhost:5000/nginx
Schritt 9 — Dockerfile & Multi-Stage Build
Ein Dockerfile definiert, wie ein Docker-Image gebaut wird.
Einfaches Beispiel:
FROM python:3.11-slim
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
CMD ["python", "main.py"]
Image bauen:
docker build -t meineapp:1.0 .
Multi-Stage Build Beispiel:
# Builder-Phase
FROM node:18 AS builder
WORKDIR /build
COPY . .
RUN npm install && npm run build
# Laufzeit-Phase
FROM nginx:alpine
COPY --from=builder /build/dist /usr/share/nginx/html
CMD ["nginx", "-g", "daemon off;"]
Ergebnis: kleinere Images und bessere Performance.
Schritt 10 — Orchestrierung (Swarm vs Kubernetes)
Orchestrierungs-Tools verwalten mehrere Container und Hosts. Beliebte Optionen sind Docker Swarm und Kubernetes.
Docker Swarm:
docker swarm init
docker service create --replicas 3 --name web nginx
Kubernetes:
kubectl apply -f deployment.yaml
kubectl get pods
kubectl scale deployment web --replicas=5
Swarm ist einfacher, aber Kubernetes ist leistungsfähiger und flexibler.
Schritt 11 — Sicherheits-Best-Practices
- Vermeide root-Rechte im Container
- Verwende minimale Basis-Images (z. B. alpine)
- Setze Ressourcen-Limits (CPU, RAM)
- Scanne Images regelmäßig (z. B. Trivy)
- Halte Docker aktuell
- Vermeide feste Secrets im Dockerfile
Image-Scan mit Trivy:
trivy image meineapp:1.0
Schritt 12 — Monitoring & Logging
Verwende eingebaute Docker-Kommandos oder integriere Tools:
Logs anzeigen:
docker logs meineapp
Monitoring-Tools:
- Prometheus
- Grafana
- cAdvisor
- ELK Stack / Loki
Beispiel Prometheus + Grafana:
- Verwende node-exporter & cadvisor als Exporter
- Visualisiere Metriken in Grafana-Dashboards
Schritt 13 — Praxisbeispiel: Flask App
Projektstruktur:
app/
├── main.py
├── requirements.txt
└── Dockerfile
main.py:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hallo von Docker!"
requirements.txt:
flask
Dockerfile:
FROM python:3.11-slim
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
CMD ["python", "main.py"]
Build & Run:
docker build -t flask-app .
docker run -d -p 5000:5000 flask-app
Rufe http://localhost:5000 auf, um die App zu testen.
Fazit
In diesem Leitfaden haben Sie Schritt für Schritt gelernt, wie Sie mit Docker und Container-Technologien arbeiten. Von der Verwaltung von Images und Containern über Netzwerke und Volumes bis hin zu Multi-Container-Orchestrierung und Sicherheit — Sie sind jetzt in der Lage, eigene Anwendungen zu dockerisieren und produktionsbereit bereitzustellen.
Nächste Schritte
- Grundlagen von Kubernetes erlernen
- Helm Charts erkunden
- CI/CD-Pipelines mit Jenkins oder GitHub Actions implementieren
- Monitoring mit Prometheus und Grafana einrichten