GNU/Linux >> LINUX-Kenntnisse >  >> Panels >> Docker

Vollständiger Anfängerleitfaden für die Docker-Protokollierung

Kenntnisse über die Protokollierung mit Docker können für die tägliche Systemadministration sehr hilfreich sein, sei es bei der Fehlerbehebung oder der grundlegenden Überwachung. Ohne das Verfolgen von Protokollen auf Docker wäre es viel schwieriger, Probleme bei der Untersuchung von Anomalien zu beheben.

In diesem Artikel werden einige wichtige Informationen zu diesem Bereich untersucht, um das Verständnis zu erleichtern, wie Docker-bezogene Protokolldateien auf Ihrem Linux-System verwaltet werden.

Lassen Sie mich mit der Erforschung der grundlegendsten Teile beginnen und nach und nach auf einige Besonderheiten eingehen.

So zeigen Sie Docker-Protokolle an

Sie können die docker logs verwenden Befehl, um abzurufen, was mit dem Dienst in einem laufenden Container vor sich geht.

Die Syntax ist einfach:

docker logs container_name_or_ID

Wahrscheinlich wissen Sie bereits, dass Sie das docker ps verwenden können Befehl, um den Namen und die ID des laufenden Containers anzuzeigen.

Nehmen wir ein reales Beispiel. Ich habe Nextcloud mit Docker bereitgestellt. Wenig überraschend heißt der Container nextcloud.

Sehen Sie sich nun die Protokolle des Containers mit dem Namen nextcloud an , verwenden Sie:

docker logs nextcloud

Hier ist eine gekürzte Version der Ausgabe des obigen Befehls:

172.18.0.2 - - [23/Jul/2021:19:36:09 +0000] "HEAD /.env HTTP/1.1" 302 1571 "-" "python-requests/2.26.0"
172.18.0.2 - - [23/Jul/2021:19:49:52 +0000] "HEAD /c99.php HTTP/1.1" 302 1565 "-" "python-requests/2.26.0"
172.18.0.2 - - [24/Jul/2021:16:25:23 +0000] "HEAD /backup.tar HTTP/1.1" 302 1571 "-" "python-requests/2.26.0"
172.18.0.2 - - [24/Jul/2021:16:25:24 +0000] "HEAD /backup.zip HTTP/1.1" 302 1569 "-" "python-requests/2.26.0"
172.18.0.2 - - [25/Jul/2021:20:36:01 +0000] "GET / HTTP/1.1" 302 1590 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko; compatible; BW/1.1; bit.ly/2W6Px8S) Chrome/84.0.4147.105 Safari/537.36"
172.18.0.2 - - [25/Jul/2021:20:36:07 +0000] "GET /custom_apps/richdocumentscode/proxy.php?req=/hosting/capabilities HTTP/1.1" 200 721 "-" "Nextcloud Server Crawler"
172.18.0.2 - - [25/Jul/2021:20:36:04 +0000] "GET /login HTTP/1.1" 200 7501 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko; compatible; BW/1.1; bit.ly/2W6Px8S) Chrome/84.0.4147.105 Safari/537.36"

Zu viele Protokolle? Das Gute ist, dass es verschiedene Optionen gibt, die das Anzeigen von Docker-Protokollen viel einfacher machen, genau wie Protokolle in Linux.

Tail-Docker-Protokolle, um nur eine bestimmte Anzahl von Zeilen anzuzeigen

Der Docker-Protokollbefehl hat --tail Attribut, das ähnlich wie der tail-Befehl verwendet werden kann.

Das heißt, Sie können es verwenden, um nur eine bestimmte Anzahl von Zeilen von Docker-Protokollen vom Ende anzuzeigen.

Um beispielsweise die letzten 50 Zeilen eines Containers anzuzeigen, können Sie Folgendes verwenden:

docker logs --tail 50 container_name_or_ID

Sie können den obigen Befehl auch auf diese Weise verwenden

docker logs -n=50 container_name_or_ID

Anzeigen von Docker-Protokollen in Echtzeit in einem Live-Container

Sie können die Containerprotokolle vollständig in Echtzeit anzeigen. Um den Protokollen zu „folgen“, verwenden Sie den --follow oder das -f Attribut.

docker logs -f container_name_or_ID

Wenn Sie Docker-Protokolle mit der Follow-Option ausführen, werden Sie feststellen, dass die neuen Protokollzeilen im Laufe der Zeit aus dem Container gemeldet werden.

Zum Beenden können Sie einfach Strg+C verwenden Tastenkombination und kehren Sie zur Terminal-Eingabeaufforderung zurück.

Die meisten Optionen in den docker logs Unterbefehl kann kombiniert werden, um ein gewünschtes Ergebnis zu erzielen.

Beispiel:docker logs -f wird den Bildschirm von Anfang an mit allen Protokollen überfluten. Das würdest du nicht wollen. Was Sie tun können, ist, beide tail zu kombinieren und follow Optionen wie diese:

docker logs -f --tail 20 container_name_or_ID

Der obige Befehl zeigt die letzten 20 Zeilen der Protokolle und verfolgt dann die Protokolle in Echtzeit.

Beim Aktualisieren Ihrer App-Container mit Skalierung kann der obige Befehl sehr hilfreich sein, bevor Sie einen älteren Container entfernen.

Zeitstempel in Docker-Protokollen anzeigen

Wenn Sie auch den Zeitstempel der Log-Einträge sehen möchten, können Sie das -t verwenden Möglichkeit.

docker logs -t container_name_or_ID

Dies kann leicht mit anderen Optionen wie --follow kombiniert werden und --tail .

Der folgende Befehl zeigt die letzten 10 Zeilen der Protokolldatei eines bestimmten Containers mit jeweils angehängten Zeitstempeln

docker logs -n=10 -t container_name_or_ID

Anzeigen von Docker-Protokollen in einem bestimmten Zeitraum

Wenn Sie ein Problem untersuchen, kann Zeit ein kritischer Faktor sein, in diesem Fall --since und --until Flaggen könnten sich als sehr hilfreich erweisen.

Wenn Sie beispielsweise ein Problem untersuchen, das in den letzten 24 Stunden aufgetreten ist, zeigt der folgende Befehl den protokollierten Inhalt dessen, was nur während dieser Zeit passiert ist:

docker logs --since 1440m -t container_name_or_ID

1440m im obigen Befehl bedeutet 24×60 Minuten. Hinzufügen des -t oder die --timestamps flag stellt sicher, dass die gemeldeten Zeilen mit einem Zeitstempel gekennzeichnet werden, damit Sie Vorfälle oder Fehler noch einfacher nachvollziehen können. Ich würde vorschlagen, es hinzuzufügen, wenn Sie einen Container anfragen.

Wenn Sie die Protokolldetails nach den ersten 24 Stunden nach Beginn der Bereitstellung benötigen, lautet der entsprechende Befehl:

docker logs --until 1440m -t nextcloud

Abgesehen von der Angabe der Zeit in Minuten können die beiden obigen Flags auch mit einem bestimmten Zeitstempel verwendet werden, der -t ist erzeugt. Das Format ist wie 2021-07-28T06:20:00 .

docker logs --since 2021-07-28 -t container_name_or_ID

Der obige Befehl zeigt die Protokolle vom 28. Juli 2021 an.

Eine vollständige Übersicht über Docker-Protokolle finden Sie auch auf der Manpage mit man docker-logs.

Zugriff auf Docker-Protokolle aus dem Container heraus

In einigen interessanten Anwendungsfällen möchten Sie möglicherweise einen hybriden Ansatz wählen, bei dem Sie von innerhalb der Container auf die anwendungsspezifischen Protokolle zugreifen.

Dazu geben Sie den Docker-Container ein:

docker exec -it container_name_or_ID sh

Und dann können Sie die regulären Linux-Tools verwenden, um anwendungsbezogene Protokolle abzurufen. Ein Ansatz wäre, die Prozess-ID des gewünschten Dienstes mit dem Befehl ps abzurufen:

ps aux

Einzelheiten zu diesem Vorgang abrufen:

cat /proc/PID_of_process/fd/1

Docker-Systemdienstprotokolle

Wenn Sie die Protokolle des Docker-Dienstes selbst auf dem Host sehen möchten, können Sie journalctl verwenden, wenn Sie Ubuntu 16.04 oder höher verwenden:

sudo journalctl -u docker
So verwenden Sie den Befehl „journalctl“ zum Analysieren von Protokollen in LinuxAnfängerleitfaden zur Verwendung von journalctl-Befehlen zum Anzeigen, Filtern und Analysieren von Journalprotokollen in Linux. Linux-HandbuchAbhishek Prakash

Wo werden Docker-Protokolle gespeichert?

Sie sollten die Docker-Protokolle in /var/lib/docker/containers finden Verzeichnis auf dem Hostsystem. Dieses Verzeichnis enthält die Protokolldateien, die sich auf alle Container in ihren einzelnen Verzeichnissen beziehen. Sie können die Verzeichnisse anhand der Container-ID identifizieren.

Ich habe das docker ps verwendet um diesen 70f19fde9076 zu finden ist die Container-ID des Nextcloud-Containers.

Wenn ich in das Verzeichnis schaue, in dem Docker-Protokolle gespeichert sind:

[email protected]:~$ sudo ls -lh /var/lib/docker/containers

total 16K
drwx------ 4 root root 4.0K Jul 27 18:48 0efe12b28562c42619e533ad5f524d56740a7a3739d9e082c758bac95ae2a46f
drwx------ 4 root root 4.0K Jul 27 18:57 12c55f365f93ecb7f91e40bc130ddc2409216a61bbb244cd045a22b4513416d3
drwx------ 4 root root 4.0K Jul 27 18:58 70f19fde907672b9a6e5ff3b7db0c9ecbcb68d419712cb04d03d77694cd2ca4e
drwx------ 4 root root 4.0K Jul 27 18:57 a436399ef16a3efc0a909b9c3f725938e595e0b8fd34644b13f28b2c9bcb4ed7

Derzeit werden vier Container ausgeführt, und Sie können sehen, dass der dritte mit dem übereinstimmt, den wir untersuchen müssen (er beginnt mit 70f19fde9076 ).

Wenn Sie den Inhalt dieses Verzeichnisses überprüfen, können Sie sehen, dass sich unsere Protokolldatei genau dort befindet!

[email protected]:~$ sudo ls -lh /var/lib/docker/containers/70f19fde907672b9a6e5ff3b7db0c9ecbcb68d419712cb04d03d77694cd2ca4e

total 192K
-rw-r----- 1 root root 150K Jul 27 18:58 70f19fde907672b9a6e5ff3b7db0c9ecbcb68d419712cb04d03d77694cd2ca4e-json.log
drwx------ 2 root root 4.0K Jul 19 17:10 checkpoints
-rw------- 1 root root 5.5K Jul 27 18:58 config.v2.json
-rw-r--r-- 1 root root 1.5K Jul 27 18:58 hostconfig.json
-rw-r--r-- 1 root root   13 Jul 27 18:58 hostname
-rw-r--r-- 1 root root  198 Jul 27 18:58 hosts
drwx------ 3 root root 4.0K Jul 19 17:10 mounts
-rw-r--r-- 1 root root   79 Jul 27 18:58 resolv.conf
-rw-r--r-- 1 root root   71 Jul 27 18:58 resolv.conf.hash

Daher ist die entsprechende Protokolldatei 70f19fde907672b9a6e5ff3b7db0c9ecbcb68d419712cb04d03d77694cd2ca4e-json.log Das ist dieselbe Datei, die Sie gelesen haben, als ich die docker logs ausgeführt habe Befehl am Anfang.

Lassen Sie mich das schnell überprüfen:

[email protected]:~$ sudo cat /var/lib/docker/containers/70f19fde907672b9a6e5ff3b7db0c9ecbcb68d419712cb04d03d77694cd2ca4e/70f19fde907672b9a6e5ff3b7db0c9ecbcb68d419712cb04d03d77694cd2ca4e-json.log

{"log":"172.18.0.2 - - [23/Jul/2021:19:36:09 +0000] \"HEAD /.env HTTP/1.1\" 302 1571 \"-\" \"python-requests/2.26.0\"\n","stream":"stdout","time":"2021-07-23T19:36:09.837857567Z"}
{"log":"172.18.0.2 - - [23/Jul/2021:19:49:52 +0000] \"HEAD /c99.php HTTP/1.1\" 302 1565 \"-\" \"python-requests/2.26.0\"\n","stream":"stdout","time":"2021-07-23T19:49:52.996108799Z"}
{"log":"172.18.0.2 - - [24/Jul/2021:16:25:23 +0000] \"HEAD /backup.tar HTTP/1.1\" 302 1571 \"-\" \"python-requests/2.26.0\"\n","stream":"stdout","time":"2021-07-24T16:25:23.445225166Z"}
{"log":"172.18.0.2 - - [24/Jul/2021:16:25:24 +0000] \"HEAD /backup.zip HTTP/1.1\" 302 1569 \"-\" \"python-requests/2.26.0\"\n","stream":"stdout","time":"2021-07-24T16:25:24.772881041Z"}
{"log":"172.18.0.2 - - [25/Jul/2021:20:36:01 +0000] \"GET / HTTP/1.1\" 302 1590 \"-\" \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko; compatible; BW/1.1; bit.ly/2W6Px8S) Chrome/84.0.4147.105 Safari/537.36\"\n","stream":"stdout","time":"2021-07-25T20:36:03.678967877Z"}
{"log":"172.18.0.2 - - [25/Jul/2021:20:36:07 +0000] \"GET /custom_apps/richdocumentscode/proxy.php?req=/hosting/capabilities HTTP/1.1\" 200 721 \"-\" \"Nextcloud Server Crawler\"\n","stream":"stdout","time":"2021-07-25T20:36:07.404618408Z"}
{"log":"172.18.0.2 - - [25/Jul/2021:20:36:04 +0000] \"GET /login HTTP/1.1\" 200 7501 \"-\" \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko; compatible; BW/1.1; bit.ly/2W6Px8S) Chrome/84.0.4147.105 Safari/537.36\"\n","stream":"stdout","time":"2021-07-25T20:36:07.619020402Z"}

Die Protokollinhalte sind die gleichen, aber da ich die Protokolldatei direkt vom Host lese, hat dies im Vergleich zu den docker logs viel Fachjargon zuvor verwendeter Befehl.

Aktivieren der Protokollrotation für Docker (JSON)

Standardmäßig ist für JSON-Datei-basierte Protokollierung die Protokollrotation auf Docker deaktiviert.

Dies kann ein Problem mit dem Speicherplatz darstellen, wenn die Protokolldateien größer werden. Unsere Docker-basierte Ghost-Instanz verzeichnete eine Größe der Protokolldateien von bis zu 20 GB. Sie sollten eine solche Situation vermeiden, indem Sie die Protokollrotation aktivieren.

Um die Protokollrotation für Docker zu aktivieren, bearbeiten Sie /etc/docker/daemon.json Datei:

sudo nano /etc/docker/daemon.json

Hängen Sie die folgenden Zeilen an und speichern Sie die Datei:

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3" 
  }
}

Starten Sie den Docker-Daemon neu:

sudo systemctl restart docker

Das obige Setup ist natürlich relevant für eine generische Docker-Installation, bei der standardmäßig JSON-Protokollierung eingestellt ist. Beachten Sie also, dass jeder andere Protokollierungsmechanismus (unten aufgeführt) seine eigene Art der Implementierung der Rotation hat.

Ein kurzes Wort zur Protokollierung von Treibern

Haben Sie „json“ im Protokolldateinamen von früher bemerkt? Das liegt daran, dass JSON File der standardmäßige Protokollierungstreiber in Docker ist.

Neben JSON stehen auch viele andere Protokollierungsmechanismen zur Auswahl:

  • Lokale Datei
  • Logeinträge
  • Erweitertes Graylog-Format (GELF)
  • Syslog
  • Amazon Cloudwatch-Protokolle (AWS)
  • Ereignisverfolgung in Windows (ETW)
  • Fließend
  • Google Cloud-Projektprotokolle (GCP)
  • Journal
  • Splunk
  • Logstash

Für umfangreiche Bereitstellungen ist GELF , AWS , GCP und Fluentd werden empfohlen, da sie einen zentralisierten Ansatz implementieren. Aber im kleinen Maßstab JSON macht den Job gut, während Local , Syslog und Zeitschrift sind auch gut geeignet. Syslog und Logstash sind besonders hilfreich, wenn eine komplexe Protokollanalyse erforderlich wird. ETW ist Windows-spezifisch, während Splunk konzentriert sich auf Remote-Logging.

Ab Docker Engine 20.10 wurde eine neue Funktion namens „Dual-Logging“ eingeführt, die sicherstellt, dass die docker logs ausgeführt werden Befehl sowie das Durchführen einer Protokollrotation unabhängig vom aktiven Protokollierungstreiber.

Zusammenfassung

In diesem Artikel habe ich mit den Grundlagen zum Anzeigen der Protokolle für jeden Docker-Container begonnen, sowohl auf Container- als auch auf Hostsystemebene. Ich habe Ihnen auch gezeigt, wie Sie den physischen Speicherort containerspezifischer Protokolldateien finden, die sich auf Ihrem Hostsystem befinden. Ich habe Ihnen kurz gezeigt, wie Sie die Protokolle für den Docker-Dienst auf dem Host selbst überprüfen können.

Später habe ich die Protokollierung von Treibern mit Schwerpunkt auf dem Standardmechanismus besprochen und auch die neue doppelte Protokollierungsfunktion hervorgehoben.

Ich hoffe, diese Hinweise helfen Ihnen bei Ihren täglichen Beobachtungs- oder Lernaktivitäten. Weitere Gedanken und Vorschläge sind mehr als willkommen! Bitte teilen Sie sie im Kommentarbereich unten.


Docker
  1. So führen Sie Nginx in einem Docker-Container aus:Eine Schritt-für-Schritt-Anleitung

  2. Eine Anleitung für Anfänger zum gawk

  3. Richten Sie MongoDB auf Docker ein

  4. Der vollständige Leitfaden für Anfänger zu LVM unter Linux

  5. Vollständiger Leitfaden zum Selbsthosten von Rocket.Chat mit Docker

Vollständige Anleitung zum Entfernen von Docker-Images

Anfängerleitfaden zur Docker-Neustartrichtlinie

Anfängerhandbuch zum Analysieren von Protokollen unter Linux mit dem Befehl journalctl

Vollständiger Leitfaden für Anfänger zur Kubernetes-Cluster-Bereitstellung auf CentOS (und anderen Linux)

Vollständiger Leitfaden für selbsthostendes Ghost-CMS mit Docker

Einsteigerleitfaden für die Docker-Welt