Où Docker conserve-t-il les fichiers journaux ?

0
183

Le débogage de la plupart des programmes Linux implique généralement la vérification des fichiers journaux, ce qui peut être un processus complexe. Cependant, lors de l'exécution dans un environnement conteneurisé sous Docker, vous devrez utiliser des outils plus spécifiques pour déboguer les applications en production.

Où sont stockés les journaux ?

La réponse simple est que Docker stocke les journaux de conteneur dans son emplacement de stockage principal, /var/lib/docker/. Chaque conteneur a un journal spécifique à son identifiant (l'identifiant complet, pas le raccourci qui est généralement affiché) et vous pouvez y accéder comme ceci :

/var/lib/docker/containers/ID/ID -json.log

C'est là qu'ils sont stockés, mais comme ils sont au format JSON, ils ne sont pas facilement lisibles et l'utilisation de l'ID de conteneur complet est énervant. Docker fournit une commande intégrée pour les afficher :

docker logs -f e4bd48ef3103

Ici, l'indicateur -f gardera l'invite ouverte et “suivre” toute nouvelle entrée dans le fichier. Vous pouvez également –taille le fichier, ou utiliser –timestamps pour afficher l'heure du journal, ou utiliser –until et -since pour filtrer en fonction de l'heure.

Si vous utilisez Docker Compose, vous pouvez utiliser la commande log pour afficher facilement tous les journaux :

docker-compose logs Publicité

Cependant, une chose que vous remarquerez est qu'il s'agit de STDOUT et STDERR, ce qui est utile pour beaucoup de choses, mais ne vous montre que la sortie de la console du point d'entrée spécifié par “CMD” dans le fichier Docker. De nombreuses applications ont leurs propres systèmes de journalisation dédiés, qui se connectent souvent à des fichiers tels que /var/log/nginx/access.log. L'accès à des journaux comme celui-ci est toujours possible du côté hôte via Docker.

Affichage des journaux à partir d'applications à l'intérieur de conteneurs

Selon le conteneur, cela peut ne pas être nécessaire. Par exemple, le conteneur NGINX par défaut est configuré pour envoyer ses journaux Docker à STDOUT afin de faciliter la vérification des journaux. Il le fait avec un lien symbolique de /dev/stdout vers le fichier journal, et vous pouvez configurer quelque chose de similaire pour vos conteneurs.

RUN ln -sf /dev/stdout /var/log/nginx/access.log &amp ;& ln -sf /dev/stderr /var/log/nginx/error.log

Mais, si vous voulez extraire des fichiers spécifiques à l'intérieur d'un conteneur, vous pouvez le faire. Docker fournit la commande exec -it pour vous permettre d'exécuter n'importe quelle commande dans n'importe quel processus Docker en cours d'exécution. En utilisant cela, vous pouvez suivre un fichier journal dans un conteneur Docker :

docker exec -it e4bd48ef3103 tail -f log.txt

Comme cela vous permet d'exécuter n'importe quelle commande, vous pouvez utiliser journalctl ou toute autre stratégie de débogage de votre choix, à condition de le faire précéder de docker exec -it. Vous pouvez même exécuter /bin/bash si vous souhaitez vous déplacer.

Une solution plus permanente qui fonctionne mieux avec les services hôtes consiste à utiliser un support de volume Docker. Vous pouvez lier un répertoire tel que /var/log/nginx à un volume visible depuis l'hôte. Tout d'abord, créez un nouveau volume :

docker volume create nginx-logs

Et exécutez le conteneur avec –mount :

docker run -d –name devtest –mount source=nginx-logs,target=/var/log/nginx nginx:latest

Si vous utilisez Docker Compose, le processus peut être automatisé :

version : services “3.0” : Web : image : nginx:derniers ports : – volumes “80:80” : – nginx-logs:/var/log/nginx/volumes : nginx-logs : publicité

De cette façon, les fichiers journaux seront directement ingérables par tous les services d'agrégation de journaux sur la machine hôte.

Affichage des journaux Docker Daemon

< p>Si vous souhaitez plutôt afficher les journaux spécifiques à l'ensemble du service Docker sur votre serveur, et non à une application conteneurisée spécifique, vous souhaiterez afficher les journaux journalctl :

sudo journalctl -fu docker.service < p>C'est là qu'il est stocké sur la plupart des systèmes, mais à un endroit différent sur certains :

  • Amazon Linux : /var/log/docker
  • CentOS/RHEL : /var/log/messages | grep docker
  • macOS : ~/Library/Containers/com.docker.docker/Data/log/vm/dockerd.log
  • Windows : AppDataRoamingDockerlogvm dockerd.log