28 Troubleshooting und Debugging in Docker-Umgebungen

28.1 Einführung

In Docker-Umgebungen kann es zu verschiedenen Problemen kommen, die das reibungslose Funktionieren von Containern und Anwendungen beeinträchtigen können. Das Troubleshooting und Debugging solcher Probleme ist eine wichtige Fähigkeit für Administratoren und Entwickler. In diesem Kapitel werden Techniken und Werkzeuge vorgestellt, um häufige Probleme zu identifizieren und zu beheben.

28.2 Grundlagen des Troubleshootings

28.2.1 Überprüfen des Containerstatus

Der erste Schritt beim Troubleshooting ist die Überprüfung des Status der Container.

Befehl:

docker ps -a

Ausgabe:

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                       PORTS               NAMES
a3b74fbdcb98        nginx               "nginx -g 'daemon of…"   2 minutes ago       Up 2 minutes                 0.0.0.0:80->80/tcp  my-container
5f4d5e8bff43        redis               "docker-entrypoint.s…"   5 minutes ago       Exited (0) 3 minutes ago                         my-redis

28.2.2 Überprüfen von Container-Logs

Container-Logs sind eine wertvolle Informationsquelle zur Diagnose von Problemen.

Befehl:

docker logs my-container

Ausgabe:

2024/07/05 10:00:00 [notice] 1#1: using the "epoll" event method
2024/07/05 10:00:00 [notice] 1#1: nginx/1.19.6
2024/07/05 10:00:00 [notice] 1#1: built by gcc 9.3.0 (Alpine 9.3.0)
2024/07/05 10:00:00 [notice] 1#1: OS: Linux 5.4.0-65-generic

28.2.3 Überprüfen des Docker-Daemon-Status

Der Docker-Daemon ist für die Verwaltung von Containern verantwortlich. Ein Blick auf den Status des Daemons kann helfen, systemweite Probleme zu identifizieren.

Befehl:

sudo systemctl status docker

Ausgabe:

● docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2024-07-05 09:00:00 CEST; 1h 10min ago

28.3 Häufige Probleme und Lösungen

28.3.1 Container startet nicht

28.3.1.1 Problem: Fehlende Abhängigkeiten

Symptom: Container startet und beendet sich sofort.

Lösung: Überprüfen Sie die Logs des Containers auf fehlende Abhängigkeiten oder Fehler.

Beispiel:

docker logs my-container

28.3.1.2 Problem: Portkonflikt

Symptom: Fehler beim Starten des Containers aufgrund eines bereits belegten Ports.

Lösung: Überprüfen Sie die Ports und passen Sie die Portkonfiguration an.

Beispiel:

docker run -d -p 8080:80 nginx

28.3.2 Container funktioniert nicht wie erwartet

28.3.2.1 Problem: Falsche Umgebungsvariablen

Symptom: Die Anwendung im Container funktioniert nicht korrekt.

Lösung: Überprüfen und korrigieren Sie die Umgebungsvariablen.

Beispiel:

services:
  web:
    image: myapp
    environment:
      - ENV_VAR=value

28.3.2.2 Problem: Netzwerkprobleme

Symptom: Container können nicht miteinander oder mit externen Diensten kommunizieren.

Lösung: Überprüfen Sie die Netzwerkkonfiguration und stellen Sie sicher, dass die richtigen Netzwerke und Ports verwendet werden.

Beispiel:

docker network ls
docker network inspect my-network

28.3.3 Container-Leistung ist schlecht

28.3.3.1 Problem: Ressourcenbeschränkungen

Symptom: Container läuft langsam oder reagiert nicht.

Lösung: Überprüfen Sie die Ressourcenbeschränkungen und passen Sie sie an.

Beispiel:

docker run -d --name my-container --cpus="2" --memory="1g" myapp

28.3.3.2 Problem: Hohe I/O-Last

Symptom: Hohe I/O-Last beeinträchtigt die Leistung des Containers.

Lösung: Verwenden Sie Docker-Volumes, um die I/O-Last auf den Host zu verlagern.

Beispiel:

docker run -d --name my-container -v my-volume:/app/data myapp

28.4 Debugging-Tools und Techniken

28.4.1 Verwenden von docker exec

Mit docker exec können Sie Befehle in einem laufenden Container ausführen, um Probleme zu diagnostizieren und zu beheben.

Befehl:

docker exec -it my-container /bin/bash

Erklärung: Dieser Befehl öffnet eine interaktive Bash-Shell im laufenden Container.

28.4.2 Netzwerk-Debugging mit docker network

Verwenden Sie Docker-Netzwerkbefehle, um die Netzwerkkonfiguration zu überprüfen und zu debuggen.

Beispiel:

docker network inspect my-network

Ausgabe:

[
    {
        "Name": "my-network",
        "Id": "e4c2f4e5c7f34a8b8f4f8d4e5f4e8c8f",
        "Created": "2024-07-05T10:00:00.000Z",
        "Scope": "local",
        "Driver": "bridge",
        ...
    }
]

28.4.3 Verwenden von docker stats

Mit docker stats können Sie die Ressourcennutzung der Container in Echtzeit überwachen.

Befehl:

docker stats

Ausgabe:

CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
a3b74fbdcb98        my-container        0.05%               12.34MiB / 512MiB     2.41%               1.23kB / 0B         0B / 0B             2

28.4.4 Verwenden von docker inspect

Mit docker inspect können Sie detaillierte Informationen zu Containern und Images abrufen.

Befehl:

docker inspect my-container

Ausgabe:

[
    {
        "Id": "a3b74fbdcb98b11f823eb6764f5bcd8e92a1d15bde5c6852e47a7bc0a27c3d49",
        "Created": "2024-07-05T09:00:00.000Z",
        "Path": "nginx",
        ...
    }
]

Effektives Troubleshooting und Debugging in Docker-Umgebungen erfordert ein gutes Verständnis der Container- und Netzwerkkonfiguration sowie der verfügbaren Diagnosewerkzeuge. Durch die systematische Überprüfung von Containerstatus, Logs und Netzwerkkonfigurationen können die meisten Probleme schnell identifiziert und behoben werden. Mit den hier vorgestellten Techniken und Tools sind Sie gut gerüstet, um Docker-Umgebungen effizient zu verwalten und zu optimieren.