rh2010 - stock.adobe.com
Fehlersuche in Docker: diese Befehle helfen Ihnen weiter
Container gelten als leichtgewichtige Grundlage für eine flexible Infrastruktur und kommen meistens in Rudeln daher. Ihre große Anzahl erschwert jedoch die Fehlersuche.
Container starten schnell, laufen zuverlässig und belegen im Vergleich zu VMs wenig Ressourcen. Aber sie sind nicht perfekt, und Container-Engines wie Docker enthalten zahlreiche Fehlerquellen. Wenn Probleme auftreten, verkomplizieren die vielen, über die Infrastruktur verteilten Container die Fehlersuche erheblich.
Docker bietet eine Reihe von Tools und Funktionen, die IT-Administratoren dabei helfen, gängige Containerprobleme zu isolieren und zu verstehen. Administratoren verwenden zur Fehlersuche in Containern Docker-Protokolle, Befehle wie pause, inspect, info, stats und events sowie Entrypoint-Überschreibungsprozesse.
Eine effektive Containerfehlerbehebung erfordert jedoch Zeit und Erfahrung. Verwenden Sie die Dokumentation zu Docker, um die gesamte Palette der verfügbaren Befehle zu erhalten, und nehmen Sie sich die Zeit, mit Optionen in einer Testumgebung zu experimentieren, um die nützlichsten Befehle für die Docker-Fehlerbehebung zu entdecken.
Docker-Logs verwenden
Entwickler achten oft darauf, Protokollierungsfunktionen zu integrieren, die wichtige Ereignisse während des Betriebs festhalten – insbesondere Fehler und Warnungen, wenn der Betrieb nicht wie beabsichtigt verläuft. Protokolle sind eine der wichtigsten Quellen für die Fehlerbehebung, die Administratoren zur Verfügung stehen.
Mit dem Befehl log lassen Sie sich in Docker die Verlaufsdatei des Containers anzeigt, die auf dem Standardausgabegerät (stdout) auf dem Docker Host erfasst wurde.
$ docker logs <Containername>
Verwenden Sie den Befehl logs wie oben und fügen Sie den Namen Ihres Containers ein. Administratoren können die Protokollausgabe mit mehreren Optionen anpassen, die sie zwischen dem Befehl und dem Containernamen einfügen:
- --details enthält zusätzliche Attribute für die Protokollausgabe, zum Beispiel Umgebungsvariablen.
- --follow oder -f zeigt eine neue Protokollausgabe an, während der Container ausgeführt wird.
- --since zeigt die Log-Einträge nach dem angegebenen Zeitstempel an.
- --tail oder -n zeigt eine Anzahl (n) von Zeilen vom Ende (tail) des Protokolls an.
- --timestamp oder -t zeigt die Log-Ausgabe zum gewünschten Zeitpunkt an.
- --until zeigt alle Logeinträge bis zum gewünschten Zeitstempel.
Anmerkung: Die Docker-Syntax verwendet zwei Bindestriche vor einem vollständigen Optionsnamen und einen Bindestrich vor einer abgekürzten Option.
Die aufgeführten Befehle helfen Ihnen dabei, den Inhalt der Protokolle einzugrenzen und zu filtern, so dass Sie die benötigten Informationen schnell finden. In unserem Beispiel lassen wir uns nun einen Container namens stevetest anzeigen:
$ docker logs stevetest
Wenn Sie nun nur die Logs drei Sekunden vor einem bestimmten Zeitpunkt sehen möchten, dann verwenden Sie Folgendes:
$ docker logs -f --until=3s stevetest
Protokolle sind auch nach dem Beenden des Containers verfügbar, bis ein Administrator sein Dateisystem entfernt.
Befehle zum Steuern von Containern
Administratoren können fehlerhafte Container mit einer Reihe verschiedener Docker-Konsolenbefehle stoppen, starten, neu starten oder entfernen. Der pause-Befehl hält alle Prozesse in den gewünschten Containern an:
$ docker pause <container 1 name> <container 2 name>
Der Befehl unpause setzt die Prozesse in diesen angegebenen Containern fort:
$ docker unpause <Container 1 Name> <Container 2 Name>
Docker verfügt auch über einen Neustart-Befehl, mit dem Sie Container beenden und neu starten können. Dies ist eine praktische Möglichkeit, abgestürzte oder hängende Container zu reparieren:
$ docker restart <container 1 name> <container 2 name>
Sie können diesen Befehl mit der Option --time oder -t ergänzen, die den Neustart um die angegebene Zahl an Sekunden verlängert. Sie können also unseren Beispielcontainer folgendermaßen neu starten:
$ docker restart stevetest
Wenn Sie möchten, dass Docker vor dem Neustart eine 30-sekündige Pause macht, sieht der Befehl wie folgt aus:
$ docker restart –t30 stevetest
Der Befehl remove (rm) entfernt einen oder mehrere Docker-Container:
$ docker rm <container 1 name> <container 2 name>
Es gibt mehrere Möglichkeiten, um das Entfernen zugehöriger Containerkomponenten zu erzwingen:
- --force oder -f kann das Entfernen eines laufenden Containers erzwingen.
- --link oder -l entfernt bestimmte Links oder Assoziationen zwischen Containern.
- --volumes oder -v entfernt Volumes, die den angegebenen Containern zugeordnet sind.
Der inspect-Befehl
Der Docker-Befehl inspect gibt eine Reihe detaillierter Docker-Containerinformationen zurück. Dazu gehören der Containerstatus, Netzwerkportzuordnungen, Umgebungsvariablenwerte und der Pfad zu den Verlaufsprotokolldateien:
$ docker inspect <container 1 name or ID> <container 2 name or ID>
Docker antwortet mit einer vollständigen Liste von Containerdetails, einschließlich der ID des Containers, Erstellungsdatum und -zeit, seines Pfads, aller Umgebungsvariablen und -werte sowie Netzwerkdetails. Sie können inspect verwenden, um schnell die IP-Adresse des Containers, die Adresse der Medienzugriffssteuerung, den Protokollpfad oder die Portbindungen zu ermitteln.
Mit Optionen können Sie die Ausgabe genauer steuern.
- --format oder -f formatiert die Ausgabe gemäß einer Vorlage.
- --size oder -s zeigt Containerdateigrößen an.
Der info-Befehl
Der Befehl inspect liefert spezifische Containerdetails, doch der Befehl info bietet Einblick in detaillierte Informationen über die Docker-Installation. Der info-Befehl ist besonders praktisch, wenn ein Problem alle Container auf Serverebene betrifft. Er liefert eine Fülle von Details zur Docker-Installation und ihrer Betriebsumgebung. Mit diesen Informationen spüren Sie falsche Pfade, inkompatible Komponentenversionen und unerwünschte Treiber auf.
$ docker info
Die einzige verfügbare Option für diesen Befehl ist --format oder -f, um die Details in einem ausgewählten Go-Format auszugeben. Das Weglassen der Formatierungsoption erzeugt einfach alle Details als Liste.
Die Ausgabe des Docker-Info-Befehls zeigt die Anzahl der laufenden, angehaltenen und gestoppten Container, die Anzahl verfügbarer Images, Speichertreiber, Speichernutzungs- und Verfügbarkeitsmetriken, Besonderheiten für Plug-ins, Betriebssystem und Kernel, CPU- und Speicherdetails, die aktuelle Docker-Serverversion sowie verwendete Ausführungs- und Protokollierungstreiber.
Der stats-Befehl
Die Fehlerbehebung bei Containern kann eine genaue Untersuchung der Ressourcennutzung erfordern. Der Befehl stats streamt automatisch Nutzungsdaten für alle laufenden Container.
$ docker stats <container 1 name> <container 2 name>
Um eine strukturiertere Ausgabe zu erhalten, haben Sie verschiedene Optionen zur Wahl.
- --all oder -a zeigt Statistiken für alle laufenden und gestoppten Container an.
- --format zeigt Daten mit der Go-Formatierung an.
- --no-stream erstellt eine Momentaufnahme des ersten Ergebnisses und keine fortlaufenden Streams.
- --no-trunc schneidet die Ausgabe nicht ab.
Mit der Option --format können Sie die Zahl der ausgegebenen Spalten einschränken. Die standardmäßige Streaming-Ausgabe besteht aus acht verschiedenen Spalten mit vielen Details: Container-ID, Containername, CPU-Zyklen, die der Container verwendet, Prozentsatz des Containerspeicherplatzes, tatsächlicher Speicherverbrauch und Speichergrenzen, ausgetauschte Netzwerkdaten, Datenmenge auf Blockspeicher und Anzahl der Prozesse auf dem Container.
Metriken zur Ressourcennutzung können ein leistungsstarkes Tool zur Fehlerbehebung sein. Container, die übermäßig viele Ressourcen belegen, zu viele Netzwerk- oder Speicher-E/A (Eingabe/Ausgabe, Input/Output) aufweisen oder eine ungewöhnlich hohe Anzahl von Threads generieren, können auf potenzielle Probleme mit der Instanz hinweisen.
Der events-Befehl
Mit dem events-Befehl lassen Sie sich bis zu 1.000 serverbasierte Ereignisse in Echtzeit anzeigen. Diese Ereignisse können aus verschiedenen Quellen stammen:
- Container melden Ereignisse wie attach, destroy, copy, start, stop, pause und rename.
- Images melden Ereignisse wie load, delete, save, tag, push und import.
- Plug-ins melden Ereignisse wie enable, disable, install und remove.
- Volumes melden Ereignisse wie create, mount, unmount und destroy.
- Netzwerke melden Ereignisse wie create, connect, disconnect und destroy.
- Dienste, Konfigurationen, Geheimnisse und Knoten melden Ereignisse wie create, update und remove.
- Daemons melden Ereignisse.
Der Befehl lautet folgendermaßen:
$ docker events
Die für den Ereignisbefehl verfügbaren Optionen sind:
- --filter oder -f filtert die Ausgabe
- --format formatiert die Ausgabe mit den gewünschten Go-Vorlagen.
- --since zeigt Ereignisse an, die seit dem angegebenen Zeitstempel generiert wurden.
- --until zeigt Ereignisse an, bis zum Zeitstempel an.
Sie können mit --filter die Ausgabe auf einen bestimmten Container oder Ereignistyp eingrenzen. Um beispielsweise nach Stoppereignissen zu suchen, verwenden Sie --filter wie folgt:
$ docker events --filter 'event=stop'
Der exec-Befehl
Der Docker exec-Befehl ermöglicht es Administratoren, neue Befehle innerhalb des Standardverzeichnisses eines laufenden Containers auszuführen. Damit exec funktioniert, muss der Befehl ausführbar sein und der Zielcontainer muss aktiv laufen.
Administratoren verwenden routinemäßig den Befehl exec, um Umgebungsvariablen zu prüfen und festzulegen oder Befehlsprivilegien zu vergeben. Die grundlegende Syntax für den Befehl exec lautet wie folgt:
$ docker exec <container command> <command arguments>
Einige Optionen für den Befehl exec sind:
- --detach oder -d zum Ausführen des Befehls im Hintergrund (freistehender Modus).
- --detach-keys zum Überschreiben der Sequenz zum Trennen eines Containers.
- --env oder -e zum Setzen von Umgebungsvariablen.
- --env-file zum Auslesen des Zustands von Umgebungsvariablen.
- --interactive oder -i zum Aktivieren der Standardeingabe (interaktiver Modus).
- --privileged zum Aktivieren erweiterter Privilegien für den angegebenen Befehl.
- --tty oder -t zum Erstellen eines TTY-Modus für die Ausgabe.
- --workdir oder -w zum Einrichten eines Arbeitsverzeichnisses, in dem der neue Befehl ausgeführt werden soll.
Um eine interaktive/TTY-fähige Bash-Shell auf einem Container stevetest auszuführen, würden Sie demnach folgenden Befehl benutzen:
$ docker exec -it stevetest bash
Überschreiben des Entrypoints
Während der Containererstellung generieren Sie stets eine zugehörige Docker-Datei, die alle Argumente und Parameter enthält. Beim Containerstart verwendet der Container den darin angegebenen Entrypoint, um den Container auszuführen.
Administratoren verwenden leistungsstarke Entrypoint- und Docker-Ausführungsbefehle mit dem Flag --entrypoint, um zu ändern, wie der Container gestartet und ausgeführt wird. Es gibt zwei Arten von Einstiegspunkten: das ausführbare Formular in einem Dockerfile, und das Shell-Formular, das wie jeder andere Docker-Befehl ausgeführt werden kann.
Das ausführbare Formular (Dockerfile) verwendet die folgende Syntax:
entrypoint ["executable path/name", "parameter 1", "parameter 2…"]
Die Shell-Form ist ähnlich, lässt jedoch Klammern und Anführungszeichen weg:
entrypoint command, parameter 1, parameter 2…
Die folgende Dockerfile-Zeile veranschaulicht, wie Entrypoint eine Apache-Anwendung in einem Container als Vordergrundprozess ausführen kann:
entrypoint ["/usr/sbin/apache2", "-D", "foreground"]
Über das Dockerfile hinaus können Sie run –entrypoint verwenden, um Einstiegspunkte bei Bedarf zu ändern und den standardmäßigen Docker-Einstiegspunkt zu überschreiben.
Sie können einen Container ausführen und den Einstiegspunkt auf eine Hintergrund-Shell setzen, bevor sie die Apache-Anwendung laden. Dadurch haben Sie Zugang zu Shell-Befehlen, um die fehlerhafte App weiter zu beheben:
$ docker run -d --entrypoint /bin/sh /usr/sbin/apache2