Szenariobasierte und Fehlerbehebungsfragen
Ihr Docker-Container läuft, aber Ihre Anwendung darin ist nicht erreichbar. Was wären die ersten Schritte zur Fehlerbehebung?
Antwort:
Überprüfen Sie zuerst docker logs <container_id> auf Anwendungsfehler. Verifizieren Sie dann die Port-Mappings mit docker ps, um sicherzustellen, dass der Host-Port korrekt freigegeben ist. Betreten Sie schließlich den Container mit docker exec -it <container_id> bash und prüfen Sie, ob der Anwendungsprozess läuft und auf dem erwarteten Port lauscht (z. B. netstat -tulnp).
Ein Docker-Container startet sofort nach dem Start immer wieder neu. Was könnten die häufigsten Ursachen sein und wie würden Sie das untersuchen?
Antwort:
Häufige Ursachen sind ein Fehler im Entrypoint-Skript der Anwendung, eine fehlende Abhängigkeit oder eine unbehandelte Ausnahme, die zum Beenden des Prozesses führt. Ich würde docker logs <container_id> verwenden, um die Ausgabe vor dem Absturz zu sehen, und docker inspect <container_id>, um RestartCount und ExitCode zu überprüfen.
Sie versuchen, ein Docker-Image zu erstellen, aber es schlägt während der RUN-Anweisung mit einem Fehler "command not found" fehl. Wie debuggen Sie das?
Antwort:
Das bedeutet normalerweise, dass der Befehl im Basis-Image nicht verfügbar ist oder in einem vorherigen RUN-Schritt nicht korrekt installiert wurde. Ich würde echo-Anweisungen vor dem fehlschlagenden Befehl hinzufügen, um Pfade zu überprüfen, oder den RUN-Befehl vorübergehend in sh -c 'set -x; <original_command>' ändern, um Details zur Befehlsausführung zu sehen. Alternativ würde ich bis zur fehlschlagenden Schicht bauen und dann dieses Zwischen-Image mit docker run ausführen, um interaktiv zu debuggen.
Ihre Docker-Image-Größe ist übermäßig groß. Welche Strategien würden Sie anwenden, um sie zu reduzieren?
Antwort:
Ich würde Multi-Stage-Builds verwenden, um Build-Zeit-Abhängigkeiten von Laufzeit-Artefakten zu trennen. Ich würde auch ein kleineres Basis-Image wählen (z. B. Alpine), unnötige Dateien und Caches entfernen und RUN-Befehle mit && kombinieren, um die Anzahl der Layer zu minimieren. Die Verwendung von .dockerignore, um irrelevante Dateien auszuschließen, ist ebenfalls entscheidend.
Sie müssen Daten zwischen mehreren Docker-Containern austauschen. Was sind Ihre Optionen und wann würden Sie jede wählen?
Antwort:
Optionen sind Docker Volumes, Bind Mounts und gemeinsamer Netzwerkspeicher. Docker Volumes werden für persistente Daten und die Verwaltung des Datenlebenszyklus bevorzugt, insbesondere für Datenbanken. Bind Mounts sind gut für die Entwicklung und ermöglichen es, dass Änderungen an Host-Dateien sofort reflektiert werden. Gemeinsamer Netzwerkspeicher (wie NFS) ist für verteilte Anwendungen gedacht, die einen gemeinsamen Zugriff über mehrere Hosts hinweg benötigen.
Ihr Docker-Container verbraucht zu viel CPU/Speicher. Wie würden Sie den Schuldigen identifizieren und das Problem beheben?
Antwort:
Ich würde docker stats verwenden, um die Echtzeit-Ressourcennutzung zu überwachen. Wenn ein bestimmter Container das Problem ist, würde ich docker exec verwenden, um ihn zu betreten und Tools wie top oder htop zu verwenden, um den Prozess zu identifizieren. Die Behebung umfasst die Optimierung der Anwendung, das Festlegen von Ressourcenlimits (--cpus, --memory) während docker run oder das Skalieren des Dienstes.
Sie haben Ihr Docker-Image aktualisiert, aber docker run startet immer noch die alte Version. Was passiert?
Antwort:
Das bedeutet normalerweise, dass das von Ihnen verwendete Image-Tag (z. B. myimage:latest) lokal nicht aktualisiert wurde. Ich würde zuerst docker pull myimage:latest ausführen, um sicherzustellen, dass das neueste Image heruntergeladen wird. Wenn das Problem weiterhin besteht, überprüfen Sie die Image-ID mit docker images, um zu bestätigen, dass Sie das richtige Image ziehen.
Wie stellen Sie sicher, dass Ihre Docker-Container automatisch neu gestartet werden, wenn der Docker-Daemon selbst neu gestartet wird oder die Host-Maschine neu bootet?
Antwort:
Ich würde eine Neustartrichtlinie (restart policy) beim Ausführen des Containers verwenden, wie z. B. --restart unless-stopped oder --restart always. unless-stopped startet den Container neu, es sei denn, er wurde explizit gestoppt, während always ihn immer neu startet, unabhängig von seinem vorherigen Zustand, auch wenn er manuell gestoppt wurde.
Sie haben Netzwerkverbindungsprobleme zwischen zwei Docker-Containern auf demselben Host. Welche Schritte würden Sie zur Diagnose unternehmen?
Antwort:
Überprüfen Sie zuerst, ob beide Container im selben Docker-Netzwerk sind, indem Sie docker inspect <container_id> verwenden. Versuchen Sie dann, einen Container vom anderen aus mit seinem Containernamen oder seiner IP-Adresse anzupingen. Überprüfen Sie Firewall-Regeln auf dem Host und innerhalb der Container und stellen Sie sicher, dass keine Port-Konflikte bestehen, wenn sie Ports freigeben.
Ihr Docker-Container läuft, aber Sie können in ein bestimmtes Verzeichnis darin nicht schreiben. Was könnte das Problem sein?
Antwort:
Dies ist oft ein Berechtigungsproblem. Ich würde docker exec in den Container ausführen und die Eigentümerschaft und Berechtigungen des Verzeichnisses mit ls -ld <directory> überprüfen. Der Benutzer, der die Anwendung innerhalb des Containers ausführt, hat möglicherweise keine Schreibberechtigung. Das Anpassen der Berechtigungen mit chmod oder chown im Dockerfile oder im Entrypoint-Skript kann dies beheben.