Der Einsatz von Docker in Produktionsumgebungen erfordert besondere Aufmerksamkeit, um Sicherheit, Performance und Skalierbarkeit zu gewährleisten. In diesem Kapitel werden bewährte Methoden und Empfehlungen vorgestellt, die Ihnen helfen, Docker sicher und effizient in der Produktion einzusetzen.
Verwenden Sie möglichst kleine und schlanke Basis-Images, um die Angriffsfläche zu minimieren und die Sicherheit zu erhöhen.
Beispiel:
FROM alpine:3.12
Verwenden Sie Docker Bench for Security
, ein Skript zur
Überprüfung von Docker-Installationen gegen Best Practices für
Sicherheit.
Befehl:
docker run -it --net host --pid host --cap-add audit_control --security-opt apparmor=unconfined --security-opt seccomp=unconfined --label docker_bench_security docker/docker-bench-security
Vermeiden Sie die Ausführung von Containern als Root-Benutzer und verwenden Sie stattdessen benutzerdefinierte Benutzer und Gruppen.
Beispiel:
FROM node:14-alpine
# Erstellen Sie einen Benutzer und eine Gruppe
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
# Wechseln Sie zu dem neuen Benutzer
USER appuser
WORKDIR /app
COPY . .
CMD ["node", "app.js"]
Verwenden Sie Docker Secrets zur Verwaltung sensibler Informationen wie Passwörter, API-Schlüssel und Zertifikate.
Beispiel:
Erstellen Sie ein Secret:
echo "my_secret_password" | docker secret create db_password -
Verwenden Sie das Secret in einem Service:
version: '3.1'
services:
db:
image: mysql:5.7
secrets:
- db_password
environment:
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_password
secrets:
db_password:
external: true
Setzen Sie Ressourcenbeschränkungen für Container, um eine gleichmäßige Verteilung der Ressourcen zu gewährleisten und Ressourcenkonflikte zu vermeiden.
Beispiel:
docker run -d --name my-container --cpus="1.5" --memory="512m" nginx
Verwenden Sie schreibgeschützte Dateisysteme, um die Sicherheit zu erhöhen und ungewollte Änderungen an Dateien zu verhindern.
Beispiel:
docker run -d --name my-container --read-only nginx
Optimieren Sie Ihre Docker-Images durch die Verwendung von Multi-Stage Builds, um unnötige Dateien und Abhängigkeiten aus dem endgültigen Image zu entfernen.
Beispiel:
# 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"]
Für die Orchestrierung und Verwaltung von Multi-Container-Anwendungen in Produktionsumgebungen sollten Sie Docker Swarm oder Kubernetes verwenden.
Docker Swarm:
docker swarm init
docker stack deploy -c docker-compose.yml myapp
Kubernetes:
Deployment-Datei erstellen (deployment.yaml):
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:latest
ports:
- containerPort: 8080
Deployment starten:
kubectl apply -f deployment.yaml
Verwenden Sie integrierte Load-Balancing- und Service-Discovery-Mechanismen von Docker Swarm oder Kubernetes, um den Datenverkehr gleichmäßig zu verteilen und Dienste automatisch zu entdecken.
Verwenden Sie Monitoring-Tools wie Prometheus, Grafana und cAdvisor, um die Leistung und den Zustand Ihrer Container zu überwachen.
Beispiel: cAdvisor starten
docker run -d --name=cadvisor -p 8080:8080 --volume=/:/rootfs:ro --volume=/var/run:/var/run:rw --volume=/sys:/sys:ro --volume=/var/lib/docker/:/var/lib/docker:ro --volume=/dev/disk/:/dev/disk:ro google/cadvisor:latest
Richten Sie zentrales Logging mit Tools wie ELK Stack (Elasticsearch, Logstash, Kibana) oder Fluentd ein, um Logs von allen Containern zu sammeln und zu analysieren.
Beispiel: Logtreiber konfigurieren
version: '3.1'
services:
myapp:
image: myapp:latest
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
Das Befolgen von Best Practices für den Einsatz von Docker in der Produktion ist entscheidend, um Sicherheit, Performance und Skalierbarkeit zu gewährleisten. Durch den Einsatz von Sicherheitsmechanismen, Ressourcenbeschränkungen, Orchestrierungstools und Monitoring-Tools können Sie sicherstellen, dass Ihre Docker-Umgebungen robust und effizient sind. Im nächsten Kapitel wird Troubleshooting und Debugging in Docker-Umgebungen behandelt.