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 ID (l'ID complet, pas celui abrégé qui est généralement affiché) et vous pouvez y accéder comme suit :
/var/lib/docker/containers/ID/ID-json.log
C'est où ils sont stockés, mais comme ils sont au format JSON, ils ne sont pas facilement lisibles, et devoir utiliser l'ID complet du conteneur est ennuyeux. Docker fournit une commande intégrée pour les afficher :
docker logs -f e4bd48ef3103
Ici, le -f
flag gardera l'invite ouverte et « suivra » toute nouvelle entrée dans le fichier. Vous pouvez également --tail
le fichier, ou utilisez --timestamps
pour afficher l'heure du journal, ou utilisez --until
et --since
pour filtrer en fonction du temps.
Si vous utilisez Docker Compose, vous pouvez utiliser la commande log pour afficher facilement tous les journaux :
docker-compose logs
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.
Afficher les journaux des applications à l'intérieur des 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
au fichier journal, et vous pouvez configurer quelque chose de similaire pour vos conteneurs.
RUN ln -sf /dev/stdout /var/log/nginx/access.log && ln -sf /dev/stderr /var/log/nginx/error.log
Mais si vous souhaitez extraire des fichiers spécifiques à l'intérieur d'un conteneur, vous pouvez le faire. Docker fournit le exec -it
commande pour vous permettre d'exécuter n'importe quelle commande dans n'importe quel processus Docker en cours d'exécution. Grâce à 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 la faire précéder de docker exec -it
. Vous pouvez même exécuter /bin/bash
si vous voulez sauter dedans et fouiller.
Une solution plus permanente qui fonctionne mieux avec les services hôtes consiste à utiliser un montage de volume Docker. Vous pouvez lier un répertoire comme /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 le --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: "3.0" services: web: image: nginx:latest ports: - "80:80" volumes: - nginx-logs:/var/log/nginx/ volumes: nginx-logs:
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 du démon Docker
Si vous souhaitez plutôt afficher les journaux spécifiques au service Docker global sur votre serveur, et non à une application conteneurisée spécifique, vous souhaiterez afficher le journalctl
journaux :
sudo journalctl -fu docker.service
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 :
AppDataRoamingDockerlogvmdockerd.log