27 Best Practices für den Einsatz von Docker in der Produktion

27.1 Einführung

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.

27.2 Sicherheitsbest Practices

27.2.1 Minimale Basis-Images verwenden

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

27.2.2 Docker Bench for Security

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

27.2.3 Zugriffskontrollen und Berechtigungen

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"]

27.2.4 Secrets Management

Verwenden Sie Docker Secrets zur Verwaltung sensibler Informationen wie Passwörter, API-Schlüssel und Zertifikate.

Beispiel:

  1. Erstellen Sie ein Secret:

    echo "my_secret_password" | docker secret create db_password -
  2. 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

27.3 Performance Best Practices

27.3.1 Ressourcenlimits festlegen

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

27.3.2 Read-Only-Dateisystem

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

27.3.3 Verwenden von Multi-Stage Builds

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"]

27.4 Skalierbarkeit und Orchestrierung

27.4.1 Verwendung von Docker Swarm oder Kubernetes

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:

  1. 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
  2. Deployment starten:

    kubectl apply -f deployment.yaml

27.4.2 Load Balancing und Service Discovery

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.

27.5 Monitoring und Logging

27.5.1 Monitoring-Tools

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

27.5.2 Zentrales Logging

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.