GNU/Linux >> Tutoriels Linux >  >> Panels >> Docker

Guide complet du débutant sur la journalisation Docker

Des connaissances sur la journalisation avec Docker peuvent être très utiles pour les activités quotidiennes d'administration système, qu'il s'agisse de dépannage ou de surveillance de base. Sans suivi des journaux sur Docker, il serait beaucoup plus difficile d'atténuer les problèmes lors de l'examen des anomalies.

Cet article explore des informations importantes sur ce domaine pour faciliter la compréhension de la gestion des fichiers journaux associés à Docker sur votre système Linux.

Permettez-moi de commencer par explorer les parties les plus élémentaires et d'approfondir progressivement certains détails.

Comment afficher les journaux Docker

Vous pouvez utiliser les docker logs commande pour récupérer tout ce qui se passe avec le service dans un conteneur en cours d'exécution.

La syntaxe est simple :

docker logs container_name_or_ID

Vous savez probablement déjà que vous pouvez utiliser le docker ps pour afficher le nom et l'ID des conteneurs en cours d'exécution.

Prenons un exemple concret. J'ai déployé Nextcloud avec Docker. Le conteneur s'appelle nextcloud, sans surprise.

Maintenant, pour afficher les logs du conteneur nommé nextcloud , utilisez :

docker logs nextcloud

Voici une version tronquée du résultat de la commande ci-dessus :

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"

Trop de logs ? La bonne chose est qu'il existe diverses options qui facilitent l'affichage des journaux Docker, tout comme les journaux sous Linux.

Journaux Tail Docker pour afficher uniquement un certain nombre de lignes

La commande Docker logs a --tail attribut qui peut être utilisé d'une manière similaire à la commande tail.

Ce qui signifie que vous pouvez l'utiliser pour n'afficher qu'un certain nombre de lignes de journaux Docker à partir de la fin.

Par exemple, pour afficher les 50 dernières lignes d'un conteneur, vous pouvez utiliser :

docker logs --tail 50 container_name_or_ID

Vous pouvez également utiliser la commande ci-dessus de cette manière

docker logs -n=50 container_name_or_ID

Afficher les journaux Docker en temps réel sur un conteneur en direct

Vous pouvez totalement visualiser les journaux du conteneur en temps réel. Pour "suivre" les logs, utilisez le --follow ou le -f attribut.

docker logs -f container_name_or_ID

Lorsque vous exécutez les journaux docker avec l'option follow, vous remarquerez que les nouvelles lignes de journal seront signalées à partir du conteneur au fil du temps.

Pour quitter, vous pouvez simplement utiliser le Ctrl+C combinaison de touches et revenez à l'invite du terminal.

La plupart des options dans les docker logs la sous-commande peut être combinée pour produire le résultat souhaité.

Par exemple, docker logs -f va inonder l'écran avec tous les journaux depuis le début. Vous ne voudriez pas ça. Ce que vous pouvez faire est de combiner les deux tail et follow des options comme celle-ci :

docker logs -f --tail 20 container_name_or_ID

La commande ci-dessus affichera les 20 dernières lignes des journaux, puis suivra les journaux en temps réel.

Lors de la mise à jour de vos conteneurs d'application avec mise à l'échelle, la commande ci-dessus peut être très utile avant de supprimer un conteneur plus ancien.

Afficher l'horodatage dans les journaux Docker

Si vous souhaitez également voir l'horodatage des entrées de journal, vous pouvez utiliser le -t option.

docker logs -t container_name_or_ID

Cela peut facilement être combiné avec d'autres options comme --follow et --tail .

La commande ci-dessous affichera les 10 dernières lignes du fichier journal d'un conteneur donné avec des horodatages attachés à chacun d'eux

docker logs -n=10 -t container_name_or_ID

Affichage des journaux Docker dans une période de temps spécifiée

Lorsque vous enquêtez sur un problème, le temps peut être un facteur critique, auquel cas le --since et --until les drapeaux pourraient s'avérer très utiles.

Par exemple, si vous enquêtez sur un problème qui s'est produit au cours des dernières 24 heures, la commande suivante affichera le contenu consigné de tout ce qui s'est passé uniquement pendant cette période :

docker logs --since 1440m -t container_name_or_ID

1440m dans la commande ci-dessus désigne 24 × 60 minutes. Ajout du -t ou le --timestamps flag garantit que les lignes signalées sont étiquetées avec un horodatage pour vous permettre de comprendre encore plus facilement les incidents ou les erreurs. Je suggérerais de l'ajouter lors de la demande d'un conteneur.

De même, si vous avez besoin des détails du journal après les premières 24 heures de lancement du déploiement, la commande équivalente serait :

docker logs --until 1440m -t nextcloud

Outre la spécification du temps en minutes, les deux drapeaux ci-dessus peuvent également être utilisés avec un horodatage spécifique que -t génère. Le format est comme 2021-07-28T06:20:00 .

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

La commande ci-dessus affichera les journaux du 28 juillet 2021.

Pour un aperçu complet des journaux de docker, vous pouvez également consulter sa page de manuel avec man docker-logs.

Accéder aux journaux Docker depuis le conteneur

Dans certains cas d'utilisation intéressants, vous pouvez opter pour une approche hybride, où vous accédez aux journaux spécifiques à l'application depuis les conteneurs.

Pour cela, vous entrez dans le conteneur Docker :

docker exec -it container_name_or_ID sh

Et ensuite, vous pouvez utiliser les outils Linux habituels pour obtenir les journaux liés aux applications. Une approche consisterait à obtenir l'ID de processus du service souhaité à l'aide de la commande ps :

ps aux

Obtenez les détails de ce processus :

cat /proc/PID_of_process/fd/1

Journaux des services du système Docker

Si vous souhaitez voir les journaux du service Docker lui-même sur l'hôte, vous pouvez utiliser journalctl si vous êtes sur Ubuntu 16.04 ou version ultérieure :

sudo journalctl -u docker
Comment utiliser la commande journalctl pour analyser les journaux dans LinuxGuide du débutant sur l'utilisation des commandes journalctl pour afficher, filtrer et analyser les journaux de journal sous Linux. Manuel LinuxAbhishek Prakash

Où sont stockés les journaux Docker ?

Vous devriez trouver les logs docker dans /var/lib/docker/containers répertoire sur le système hôte. Ce répertoire contient les fichiers journaux liés à tous les conteneurs dans leurs répertoires individuels. Vous pouvez identifier les répertoires avec l'ID du conteneur.

J'ai utilisé le docker ps pour trouver que 70f19fde9076 est l'ID de conteneur du conteneur Nextcloud.

Si je regarde dans le répertoire où sont stockés les logs docker :

[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

Il y a actuellement quatre conteneurs en cours d'exécution, et vous pouvez voir que le troisième correspond à celui que nous devons examiner (il commence par 70f19fde9076 ).

Si vous vérifiez le contenu de ce répertoire, vous pouvez voir que notre fichier journal se trouve juste là !

[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

Par conséquent, le fichier journal correspondant est 70f19fde907672b9a6e5ff3b7db0c9ecbcb68d419712cb04d03d77694cd2ca4e-json.log qui est le même fichier que vous lisiez lorsque j'ai exécuté les docker logs commande au début.

Permettez-moi de vérifier rapidement que :

[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"}

Le contenu du journal est le même, mais comme je lis le fichier journal directement depuis l'hôte, cela contient beaucoup de jargon par rapport aux docker logs commande utilisée précédemment.

Activation de la rotation des journaux pour Docker (JSON)

Par défaut, pour la journalisation basée sur les fichiers JSON, la rotation des journaux sur Docker est désactivée.

Cela peut poser un problème d'espace disque si la taille des fichiers journaux augmente. Notre instance Ghost basée sur Docker a vu ses fichiers journaux atteindre 20 Go. Vous voudriez éviter une telle situation en activant la rotation des journaux.

Pour activer la rotation des journaux pour Docker, modifiez le /etc/docker/daemon.json fichier :

sudo nano /etc/docker/daemon.json

Ajoutez les lignes suivantes et enregistrez le fichier :

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

Redémarrez le démon Docker :

sudo systemctl restart docker

La configuration ci-dessus est bien sûr pertinente pour une installation Docker générique, pour laquelle la journalisation JSON est définie par défaut. Notez donc que tous les autres mécanismes de journalisation (énumérés ci-dessous) ont leur propre façon d'implémenter la rotation.

Un mot rapide sur les pilotes de journalisation

Avez-vous remarqué "json" dans le nom du fichier journal plus tôt ? C'est parce que le fichier JSON est le pilote de journalisation par défaut sur Docker.

Outre JSON, il existe de nombreux autres mécanismes de journalisation parmi lesquels choisir :

  • Fichier local
  • Logentries
  • Format étendu Graylog (GELF)
  • Syslog
  • Journaux Amazon Cloudwatch (AWS)
  • Suivi des événements dans Windows (ETW)
  • Courant
  • Journaux de projet Google Cloud (GCP)
  • Journal
  • Splunk
  • Logstash

Pour les déploiements à grande échelle, GELF , AWS , GCP et Fluentd sont recommandés car ils mettent en œuvre une approche centralisée. Mais pour une petite échelle, JSON fait très bien le travail, tandis que Local , Syslog et Journal conviennent également tout à fait. Syslog et Logstash sont particulièrement utiles si une analyse complexe des journaux devient une exigence. ETW est spécifique à Windows, alors que Splunk se concentre sur la journalisation à distance.

À partir de Docker Engine 20.10, une nouvelle fonctionnalité appelée "double journalisation" a été introduite qui garantit l'exécution des docker logs commande ainsi que la rotation des journaux quel que soit le pilote de journalisation en vigueur.

Résumé

Dans cet article, j'ai commencé par les bases de l'affichage des journaux pour n'importe quel conteneur Docker, à la fois au niveau du conteneur et du système hôte. Je vous ai également montré comment localiser l'emplacement physique des fichiers journaux spécifiques au conteneur résidant sur votre système hôte. Je vous ai brièvement montré comment vérifier les journaux du service Docker sur l'hôte lui-même.

Plus tard, j'ai discuté des pilotes de journalisation en mettant l'accent sur le mécanisme par défaut et j'ai également mis en évidence la nouvelle fonctionnalité de journalisation double.

J'espère que ces conseils vous aideront dans vos activités quotidiennes de surveillance ou d'apprentissage. Toutes les pensées et suggestions sont plus que bienvenues! Veuillez les partager dans la section des commentaires ci-dessous.


Docker
  1. Comment exécuter Nginx dans un conteneur Docker :un guide étape par étape

  2. Un guide du débutant pour rester bouche bée

  3. Configurer MongoDB sur Docker

  4. Un guide rapide pour utiliser Docker Compose

  5. Le guide complet du débutant sur LVM sous Linux

Guide complet pour supprimer les images Docker

Guide du débutant sur la politique de redémarrage de Docker

Guide du débutant pour analyser les journaux sous Linux avec la commande journalctl

Guide complet du débutant sur le déploiement du cluster Kubernetes sur CentOS (et autres Linux)

Guide complet de l'auto-hébergement de Ghost CMS avec Docker

Guide du débutant sur le monde Docker