Docker aggregiert automatisch die Standardausgabe- und Fehlerströme (stdout/stderr) des Containers in Protokoll-Feeds, die vom Docker-Daemon beibehalten werden.
Docker fasst die Standardausgabe- und Fehlerströme ( stdout/ stderr) von Containern automatisch in Protokoll-Feeds zusammen, die vom Docker-Daemon gespeichert werden. Sie können Protokolle problemlos ü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 angeschlossen sind (
). Protokolle sind nur verfügbar, wenn der Vordergrundprozess in Ihrem Container tatsächlich eine Ausgabe ausgibt. Sie sollten sicherstellen, dass Ihre Container Fehler protokollieren, damit stderr Docker-Befehle sie anzeigen 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.
Containerprotokolle anzeigen
Um Containerprotokolle anzuzeigen , verwenden Sie den docker logsfolgenden Befehl:
Ersetzen Sie es my-containerdurch den Namen oder die ID des Containers, den Sie überprüfen möchten. Sie können es verwenden, dockers ps -aum die IDs und Namen Ihrer Container abzurufen.
Der logsBefehl druckt die gesamte Protokollausgabe des Containers auf Ihr Terminal. Die Ausgabe ist nicht kontinuierlich. Wenn Sie weiterhin neue Protokolle streamen möchten, fügen Sie dem –followBefehl das Flag hinzu. Dies entspricht der Verwendung tail -fmit regulären Protokolldateien auf Ihrem Computer.
Anpassen der angezeigten Inhalte
Der docker logsBefehl unterstützt mehrere Flags, mit denen Sie seine Ausgabe anpassen können:
- –timestamps – Zeigt am Anfang jeder Protokollzeile vollständige Zeitstempel an.
- –until und–since – 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 benutzerfreundliche relative Zeitangabe (z. B. 1h= vor 1 Stunde).
- –tail – Ruft eine bestimmte Anzahl Zeilen aus dem Protokoll ab. –tail 10Zeigt die letzten zehn vom Container protokollierten Zeilen an.
- –details – Dies ist ein spezielles Flag, das der Protokollausgabe zusätzliche Informationen hinzufügt, basierend auf den an den Protokolltreiber übergebenen Optionen. Wir werden uns Protokolltreiber im nächsten Abschnitt ansehen. Typische angezeigte Werte sind –detailsContainerbezeichnungen und Umgebungsvariablen.
Sie können diese Flags kombinieren, um Protokolle im gewünschten Format zu erhalten. Die Flags until, sinceund tailhaben keine Wirkung, wenn Sie followzum kontinuierlichen Streamen von Protokolldaten verwenden.
Docker-Protokollierungstreiber
Docker sammelt und speichert Containerprotokolle mithilfe eines von mehreren Protokollierungstreibern . Sie können den aktiven Protokollierungstreiber für jeden Container einzeln festlegen. Wenn kein Protokollierungstreiber angegeben ist, verwendet Docker den json-fileTreiber.
Dieser Treiber speichert Containerprotokolle in einer JSON-Datei. Dieses Format ist für Menschen relativ gut lesbar und kann problemlos von Drittanbieter-Tools verwendet werden. Wenn Sie nicht direkt auf Protokolldateien zugreifen, localkönnen Sie durch die Umstellung auf den Treiber Speicherplatz sparen. Er verwendet ein benutzerdefiniertes Protokollspeicherformat.
Zu den weiteren integrierten Protokolltreibern gehören syslog(Schreiben in den syslogDaemon, der auf Ihrem Computer ausgeführt wird), journald(Verwenden einer ausgeführten journaldInstanz) und fluentd(Verwenden eines fluentdDaemons). Treiber sind auch für Amazon CloudWatch, Google Cloud Platform, Event Tracing für Windows und andere Protokollüberwachungslösungen verfügbar.
Docker unterstützt Protokollierungstreiber von Drittanbietern über Plugins. Treiber finden Sie auf Docker Hub. Um einen Plugin-Treiber zu installieren, führen Sie aus docker plugin install plugin-name. Sie können ihn dann als Protokollierungstreiber referenzieren plugin-name.
Angeben eines Protokollierungstreibers
Sie können den Protokollierungstreiber für einen Container angeben, indem Sie das –log-driverFlag an Folgendes übergeben dockers run:
Sie können den Standardprotokollierungstreiber global ändern, indem Sie Ihre Docker-Daemon-Konfiguration aktualisieren. Bearbeiten (oder erstellen) /etc/docker/daemon.json. Legen Sie den log-driverSchlüssel auf den Namen eines Protokollierungstreibers fest. Docker verwendet diesen Treiber für alle Container, die ohne –log-driverFlag erstellt wurden.
Viele Protokollierungstreiber verfügen über eigene Konfigurationsoptionen. Diese werden mit dem –log-optsContainer-Flag oder log-optsin festgelegt daemon.json. Hier ist ein Beispiel für den Standardtreiber json-file. Es weist Docker an, Protokolldateien zu rotieren, sobald sie größer als 8 MB sind. Es werden immer nur fünf Dateien beibehalten.
docker run
/etc/docker/daemon.json
Treiber-Liefermodi
Protokolle können entweder im blockierenden oder im nicht blockierenden Modus übermittelt werden. Docker verwendet standardmäßig die blockierende Übermittlung. Protokolle aus dem Container werden sofort an den Treiber gesendet. Dies garantiert die Protokollübermittlung, kann jedoch die Leistung beeinträchtigen. Die Anwendung wartet, bis das Schreiben des Protokolls abgeschlossen ist. Dies kann zu einer spürbaren Verzögerung führen, wenn der Protokolltreiber beschäftigt ist.
Im nicht blockierenden Modus schreibt Docker Protokolle in einen Puffer im Arbeitsspeicher. Der Container muss nicht warten, bis der Protokolltreiber seinen Schreibvorgang abgeschlossen hat. Dies kann die Leistung auf aktiven Maschinen mit langsamem Speicher erheblich verbessern.
Der Nachteil des nicht blockierenden Modus ist die Möglichkeit verlorener Protokolle. Dies kann passieren, wenn Protokolle schneller ausgegeben werden, als der Treiber sie verarbeiten kann. Der Puffer im Arbeitsspeicher könnte gefüllt sein, wodurch zwischengespeicherte Protokolle gelöscht werden, bevor sie an den Treiber übergeben werden.
Sie können die nicht blockierende Übermittlung aktivieren mode, indem Sie die Protokollierungsoption entweder mit –log-optsoder festlegen daemon.json. Mit der Option können Sie die Größe des Protokollpuffers im Arbeitsspeicher festlegen max-buffer-size. Wenn Sie diesen hohen Wert festlegen, verringert sich das Risiko verlorener Protokolle, vorausgesetzt, Sie haben ausreichend RAM zur Verfügung.
Bewährte Methoden für die Protokollierung
Ihre Container sollten, soweit möglich, mit dem Protokollierungssystem von Docker funktionieren. Durch die Ausgabe von Protokollen an stdoutDocker stderrund andere Tools können diese auf standardisierte Weise aggregiert werden.
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 logsallein nicht erfüllt werden können. In diesem Fall müssen Sie möglicherweise Ihre eigene Protokollierungslösung in Ihrem Container implementieren. Sie können Protokolle direkt im Dateisystem speichern, ein Docker-Volume verwenden oder einen externen API-Dienst aufrufen AirTag.
Einige Stacks erfordern einen dedizierten Protokollcontainer, der neben Ihren Anwendungscontainern sitzt. Der Protokollcontainer, oft auch „Sidecar“ genannt, liest temporäre Protokolldateien, die Ihre Anwendungscontainer in einem gemeinsam genutzten Docker-Volume erstellen. Der Sidecar übernimmt die Aggregation dieser Protokolle in ein Format, das in einen Protokollüberwachungsdienst hochgeladen werden kann.
Dieser Ansatz kann für komplexere Bereitstellungen nützlich sein, ist jedoch schwieriger einzurichten und zu skalieren. Normalerweise fehlt Ihnen dabei der unmittelbare Komfort der integrierten Protokollbefehle von Docker.
Zusammenfassung
Docker verfügt über vielseitige Protokollüberwachungsfunktionen, die durch eine Reihe von Protokollierungstreibern bereitgestellt werden. Jeder Container kann einen eindeutigen Protokollierungstreiber verwenden, sodass Sie Protokolle in einem Format speichern können, das den Anforderungen jeder App entspricht.
Protokolle enthalten alles, was von den Standardausgabeströmen eines Containers ausgegeben wird. Sie können echo, printoder console.log()das Äquivalent Ihrer Programmiersprache verwenden, um der docker logsAusgabe Zeilen hinzuzufügen. Protokolle bleiben erhalten, bis Ihr Container mit gelöscht wird docker rm.