Überwachen von Docker-Container-Protokollen

0
104

Docker aggregiert automatisch Container-Standardausgabe- und Fehlerströme (stdout/stderr) in Protokoll-Feeds, die vom Docker-Daemon beibehalten werden. Sie können Protokolle einfach überwachen, um zu verstehen, was in Ihren Containern vor sich geht.

Die Protokolle enthalten die Ausgabe, die Sie in Ihrem Terminal sehen würden, wenn sie im interaktiven Modus an einen Container angehängt werden (-it) ). Protokolle sind nur verfügbar, wenn der Vordergrundprozess in Ihrem Container tatsächlich eine Ausgabe ausgibt. Sie sollten sicherstellen, dass Ihre Container Fehler in stderr protokollieren, damit Docker-Befehle sie verfügbar machen können.

Sie können Containerprotokolle jederzeit während des Lebenszyklus eines Containers anzeigen. Wenn ein Container ausgeführt wird, können Sie Protokolle in Echtzeit streamen. Bei gestoppten Containern können Sie auf alle Protokolle zugreifen, die vor der Beendigung erfasst wurden.

Anzeigen von Containerprotokollen

Verwenden Sie das Docker, um Containerprotokolle anzuzeigen Befehl logs:

Docker protokolliert my-container

Ersetzen Sie my-container durch den Namen oder die ID des Containers, den Sie untersuchen möchten. Sie können Docker ps -a verwenden, um die IDs und Namen Ihrer Container abzurufen.

Der Befehl logs druckt die gesamte Protokollausgabe des Containers an Ihr Terminal. Die Ausgabe erfolgt nicht kontinuierlich. Wenn Sie weiterhin neue Protokolle streamen möchten, fügen Sie dem Befehl das Flag –follow hinzu. Dies entspricht der Verwendung von tail -f mit regulären Protokolldateien auf Ihrem Computer.

Anpassen der angezeigten Dateien

Der Docker-Protokollbefehl unterstützt mehrere Flags, mit denen Sie die Ausgabe anpassen können:

  • & # 8211; Zeitstempel & # 8211; Zeigen Sie am Anfang jeder Protokollzeile vollständige Zeitstempel an.
  • & # 8211; bis und – seit & # 8211; Mit diesen Flags können Sie Zeilen abrufen, die während eines bestimmten Zeitraums protokolliert wurden. Übergeben Sie entweder einen vollständigen Zeitstempel (2021-04-30T20: 00: 00Z) oder eine freundliche relative Zeit (z. B. vor 1 Stunde = 1 Stunde).
  • & # 8211; Schwanz & # 8211; Rufen Sie eine bestimmte Anzahl von Zeilen aus dem Protokoll ab. –tail 10 zeigt die letzten zehn vom Container protokollierten Zeilen an.
  • & # 8211; Details & # 8211; Dies ist ein spezielles Flag, das der Protokollausgabe basierend auf den an den Protokollierungstreiber übergebenen Optionen zusätzliche Informationen hinzufügt. Wir werden uns im nächsten Abschnitt mit der Protokollierung von Treibern befassen. Typische Werte, die mit –details angezeigt werden, sind Containerbezeichnungen und Umgebungsvariablen.

Sie können diese Flags kombinieren, um Protokolle in dem von Ihnen gewünschten Format zu erhalten. Die Flags “Bis”, “Seit” und “End” werden nicht wirksam, wenn Sie “Folgen” verwenden, um Protokolldaten kontinuierlich zu streamen.

Docker-Protokollierungstreiber

Docker sammelt und speichert Containerprotokolle mithilfe eines von mehreren Protokollierungstreibern. Sie können den aktiven Protokollierungstreiber für jeden Container festlegen. Wenn kein Protokollierungstreiber angegeben ist, verwendet Docker den JSON-Dateitreiber.

Dieser Treiber speichert Containerprotokolle in einer JSON-Datei. Dieses Format ist ziemlich gut lesbar und kann problemlos von Tools von Drittanbietern verwendet werden. Wenn Sie nicht direkt auf Protokolldateien zugreifen, können Sie durch das Wechseln zum lokalen Treiber Speicherplatz sparen. Es wird ein benutzerdefiniertes Protokollspeicherformat verwendet.

Andere integrierte Protokolltreiber sind syslog (Schreiben in den auf Ihrem Computer ausgeführten Syslog-Daemon), journald (Verwenden einer laufenden journald-Instanz) und fluentd (Verwenden eines fluentd) Daemon). Treiber sind auch für Amazon CloudWatch, Google Cloud Platform, Ereignisverfolgung für Windows und andere Protokollüberwachungslösungen verfügbar.

Docker unterstützt Protokollierungstreiber von Drittanbietern über Plugins. Sie finden Treiber auf Docker Hub. Um einen Plugin-Treiber zu installieren, führen Sie das Docker-Plugin install plugin-name aus. Sie können ihn dann als Protokollierungstreiber als Plugin-Namen referenzieren.

Angeben eines Protokollierungstreibers

Sie Sie können den Protokollierungstreiber für einen Container angeben, indem Sie das Flag –log-driver an Docker run übergeben:

Docker run –log-driver systemd my-image: latest

Sie können den Standardprotokollierungstreiber global ändern, indem Sie Ihre Docker-Dämonkonfiguration aktualisieren. Bearbeiten (oder erstellen) Sie /etc/docker/daemon.json. Setzen Sie den Protokolltreiberschlüssel auf den Namen eines Protokolliertreibers. Docker verwendet diesen Treiber für alle Container, die ohne das Flag –log-driver erstellt wurden.

{& quot; log-driver & quot;: & quot; systemd & quot; }

Viele Protokollierungstreiber verfügen über eigene Konfigurationsoptionen. Diese werden mit dem Container-Flag –log-opts oder mit log-opts in daemon.json festgelegt. Hier ist ein Beispiel, das für den Standard-JSON-Dateitreiber relevant ist. Docker wird angewiesen, Protokolldateien zu drehen, sobald sie größer als 8 MB sind. Es werden immer nur fünf Dateien gespeichert.

Docker-Lauf

Docker-Lauf –log-Treiber json-Datei –log-opts max-size = 8M –log-opts max-file = 5

/etc/docker/daemon.json

{“Protokolltreiber”: “json-Datei”, “Protokoll” -opts & quot;: {& quot; max-size & quot;: & quot; 8M & quot;, & quot; max-file & quot;: 5}}

Treiberlieferungsmodi

Protokolle können entweder im blockierenden oder im nicht blockierenden Modus geliefert werden. Docker blockiert standardmäßig die Zustellung. Protokolle aus dem Container werden sofort an den Fahrer gesendet. Dies garantiert die Protokollzustellung, kann jedoch die Leistung beeinträchtigen. Die Anwendung wartet, bis der Protokollschreibvorgang abgeschlossen ist. Dies kann zu einer spürbaren Verzögerung führen, wenn der Protokollierungstreiber ausgelastet ist.

Im nicht blockierenden Modus schreibt Docker Protokolle in einen speicherinternen Puffer. Der Container muss nicht warten, bis der Protokollierungstreiber den Schreibvorgang abgeschlossen hat. Dies kann die Leistung auf aktiven Computern mit langsamer Speicherung erheblich verbessern.

Der Kompromiss mit dem nicht blockierenden Modus ist die Möglichkeit, dass Protokolle verloren gehen. Dies kann auftreten, wenn Protokolle schneller ausgegeben werden, als der Treiber sie verarbeiten kann. Der speicherinterne Puffer könnte gefüllt werden, wodurch zwischengespeicherte Protokolle gelöscht werden, bevor sie dem Treiber übergeben wurden.

Sie können die nicht blockierende Zustellung aktivieren, indem Sie die Modusprotokollierungsoption entweder mit –log-opts oder daemon.json festlegen. Sie können die Größe des speicherinternen Protokollpuffers mit der Option max-buffer-size festlegen. Wenn Sie diesen Wert auf “Hoch” setzen, wird das Risiko von Protokollverlusten verringert, vorausgesetzt, Sie verfügen über ausreichend RAM.

Docker-Ausführung –log-opt mode = nicht blockierend –log-opt max-buffer-size = 8M my -image: Neueste

Best Practices für die Protokollierung

Ihre Container sollten nach Möglichkeit mit dem Protokollierungssystem von Docker funktionieren. Durch das Senden von Protokollen an stdout und stderr können Docker und andere Tools diese auf standardisierte Weise aggregieren.

Die Protokollausgabe muss keine Zeitstempel enthalten. Die Protokollierungstreiber von Docker zeichnen automatisch den Zeitpunkt auf, zu dem ein Ereignis aufgetreten ist.

Manchmal haben Sie möglicherweise komplexe Protokollierungsanforderungen, die Docker-Protokolle allein nicht erfüllen können. In diesem Fall müssen Sie möglicherweise Ihre eigene Protokollierungslösung in Ihrem Container implementieren. Sie können Protokolle mithilfe eines Docker-Volumes direkt im Dateisystem speichern oder einen externen API-Dienst aufrufen.

Einige Stapel erfordern einen dedizierten Protokollierungscontainer, der sich neben Ihren Anwendungscontainern befindet. Der Protokollierungscontainer, der häufig als “Beiwagen” bezeichnet wird, liest temporäre Protokolldateien, die Ihre Anwendungscontainer in einem gemeinsam genutzten Docker-Volume erstellen. Der Beiwagen verwaltet die Aggregation dieser Protokolle in einem Format, das in einen Protokollüberwachungsdienst hochgeladen werden kann.

Dieser Ansatz kann für komplexere Bereitstellungen hilfreich sein, obwohl das Einrichten und Skalieren schwieriger ist. In der Regel müssen Sie die integrierten Protokollbefehle von Docker nicht sofort nutzen.

Zusammenfassung

Docker verfügt über vielseitige Protokollüberwachungsfunktionen, die von einer Suite bereitgestellt werden von Protokollierungstreibern. Jeder Container kann einen eindeutigen Protokollierungstreiber verwenden, mit dem Sie Protokolle in einem Format speichern können, das den Anforderungen jeder App entspricht.

Protokolle enthalten alles, was von den Standardausgabestreams eines Containers ausgegeben wird. Sie können echo, print, console.log () oder das Äquivalent Ihrer Programmiersprache verwenden, um der Docker-Protokollausgabe Zeilen hinzuzufügen. Protokolle bleiben erhalten, bis Ihr Container mit Docker rm gelöscht wird.