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.