Comment surveiller les journaux de conteneurs Docker –
Docker agrège automatiquement la sortie standard du conteneur et les flux d’erreur (stdout
/stderr
) dans les flux de journaux qui sont conservés par le démon Docker. Vous pouvez facilement surveiller les journaux pour comprendre ce qui se passe dans vos conteneurs.
Les journaux contiennent la sortie que vous verriez dans votre terminal lorsqu’il est attaché à un conteneur en mode interactif (-it
). Les journaux ne seront disponibles que si le processus de premier plan dans votre conteneur émet réellement une sortie. Vous devez vous assurer que vos conteneurs consignent les erreurs dans stderr
les commandes Docker peuvent donc les exposer.
Vous pouvez afficher les journaux de conteneur à tout moment au cours du cycle de vie d’un conteneur. Lorsqu’un conteneur est en cours d’exécution, vous pouvez diffuser les journaux en temps réel. Pour les conteneurs arrêtés, vous pouvez accéder à tous les journaux capturés avant la résiliation.
Sommaire
Affichage des journaux de conteneur
Pour afficher les journaux de conteneur, utilisez le docker logs
commander:
docker logs my-container
Remplacer my-container
avec le nom ou l’ID du conteneur que vous souhaitez inspecter. Vous pouvez utiliser docker ps -a
pour obtenir les identifiants et les noms de vos conteneurs.
le logs
La commande imprime l’intégralité de la sortie du journal du conteneur sur votre terminal. La sortie ne sera pas continue. Si vous souhaitez continuer à diffuser de nouveaux journaux, ajoutez le --follow
drapeau à la commande. Cela équivaut à utiliser tail -f
avec des fichiers journaux réguliers sur votre machine.
Personnalisation de ce qui est affiché
le docker logs
La commande prend en charge plusieurs indicateurs qui vous permettent d’ajuster sa sortie:
- –Horodateurs – Afficher les horodatages complets au début de chaque ligne de journal.
- –Jusqu’à et
--since
– Ces indicateurs vous permettent de récupérer les lignes enregistrées pendant une période donnée. Soit passer un horodatage complet (2021-04-30T20:00:00Z
) ou un temps relatif amical (par exemple1h
= Il y a 1 heure). - -queue – Récupère un nombre donné de lignes dans le journal.
--tail 10
affichera les dix dernières lignes enregistrées par le conteneur. - -des détails – Il s’agit d’un indicateur spécial qui ajoute des informations supplémentaires à la sortie du journal, en fonction des options transmises au pilote de journalisation. Nous examinerons les pilotes de journalisation dans la section suivante. Valeurs typiques affichées avec
--details
inclure des étiquettes de conteneur et des variables d’environnement.
Vous pouvez combiner ces indicateurs pour obtenir les journaux au format souhaité. le until
, since
et tail
les indicateurs ne prendront pas effet si vous utilisez follow
pour diffuser en continu les données du journal.
Pilotes de journalisation Docker
Docker collecte et stocke les journaux de conteneur à l’aide de l’un des nombreux pilotes de journalisation. Vous pouvez définir le pilote de journalisation actif pour chaque conteneur. Lorsqu’aucun pilote de journalisation n’est spécifié, Docker utilise le json-file
conducteur.
Ce pilote stocke les journaux de conteneur dans un fichier JSON. Ce format est assez lisible par l’homme et peut être facilement utilisé par des outils tiers. Si vous n’allez pas accéder directement aux fichiers journaux, passez au local
Le pilote vous fera économiser de l’espace de stockage. Il utilise un format de stockage de journal personnalisé.
Les autres pilotes de journal intégrés incluent syslog
(écrivez au syslog
démon fonctionnant sur votre machine), journald
(utilisez une course journald
instance) et fluentd
(pour utiliser un fluentd
démon). Des pilotes sont également disponibles pour Amazon CloudWatch, Google Cloud Platform, Event Tracing pour Windows et d’autres solutions de surveillance des journaux.
Docker prend en charge les pilotes de journalisation tiers via des plugins. Vous pouvez trouver des pilotes sur Docker Hub. Pour installer un pilote de plugin, exécutez docker plugin install plugin-name
. Vous pourrez alors le référencer en tant que pilote de journalisation comme plugin-name
.
Spécification d’un pilote de journalisation
Vous pouvez spécifier le pilote de journalisation pour un conteneur en passant le --log-driver
drapeau à docker run
:
docker run --log-driver systemd my-image:latest
Vous pouvez modifier globalement le pilote de journalisation par défaut en mettant à jour la configuration de votre démon Docker. Modifier (ou créer) /etc/docker/daemon.json
. Met le log-driver
clé du nom d’un pilote de journalisation. Docker utilisera ce pilote pour tous les conteneurs créés sans --log-driver
drapeau.
{ "log-driver": "systemd" }
De nombreux pilotes de journalisation sont livrés avec leurs propres options de configuration. Celles-ci sont définies à l’aide du --log-opts
drapeau de conteneur, ou log-opts
dans daemon.json
. Voici un exemple correspondant à la valeur par défaut json-file
conducteur. Il demande à Docker de faire pivoter les fichiers journaux une fois qu’ils dépassent 8 Mo. Seuls cinq fichiers seront conservés à tout moment.
docker run
docker run --log-driver json-file --log-opts max-size=8M --log-opts max-file=5
/etc/docker/daemon.json
{ "log-driver": "json-file", "log-opts": { "max-size": "8M", "max-file": 5 } }
Modes de livraison du chauffeur
Les journaux peuvent être livrés en mode bloquant ou non bloquant. Docker bloque par défaut la livraison. Les journaux du conteneur seront immédiatement envoyés au chauffeur. Cela garantit la livraison des journaux mais pourrait avoir un impact sur les performances. L’application attendra la fin de l’écriture du journal. Cela peut entraîner un retard perceptible si le pilote de journalisation est occupé.
En mode non bloquant, Docker écrit les journaux dans une mémoire tampon en mémoire. Le conteneur n’a pas besoin d’attendre que le pilote de journalisation termine son écriture. Cela peut considérablement améliorer les performances sur les machines actives avec un stockage lent.
Le compromis avec le mode non bloquant est la possibilité de perdre des journaux. Cela peut se produire lorsque les journaux sont émis plus rapidement que le pilote ne peut les traiter. Le tampon en mémoire peut être rempli, ce qui entraîne l’effacement des journaux mis en cache avant qu’ils n’aient été remis au pilote.
Vous pouvez activer la diffusion non bloquante en définissant le mode
option de journalisation, soit avec --log-opts
ou alors daemon.json
. Vous pouvez définir la taille du tampon de journal en mémoire avec le max-buffer-size
option. La définition de cette valeur élevée réduit le risque de perte de journaux, à condition que vous disposiez de suffisamment de RAM.
docker run --log-opt mode=non-blocking --log-opt max-buffer-size=8M my-image:latest
Meilleures pratiques de journalisation
Vos conteneurs doivent fonctionner avec le système de journalisation de Docker dans la mesure du possible. Emission de journaux vers stdout
et stderr
permet à Docker et à d’autres outils de les agréger de manière standardisée.
La sortie du journal n’a pas besoin d’inclure des horodatages. Les pilotes de journalisation de Docker enregistreront automatiquement l’heure à laquelle un événement s’est produit.
Parfois, vous pouvez avoir des exigences de journalisation complexes qui docker logs
seul ne peut pas satisfaire. Si tel est le cas, vous devrez peut-être implémenter votre propre solution de journalisation dans votre conteneur. Vous pouvez stocker les journaux directement sur le système de fichiers, à l’aide d’un volume Docker, ou appeler un service d’API externe.
Certaines piles nécessitent un conteneur de journalisation dédié qui se trouve à côté de vos conteneurs d’application. Le conteneur de journalisation, souvent appelé «side-car», lit les fichiers journaux temporaires que vos conteneurs d’application créent dans un volume Docker partagé. Le side-car gère l’agrégation de ces journaux dans un format qui peut être téléchargé vers un service de surveillance des journaux.
Cette approche peut être utile pour les déploiements plus complexes, bien qu’elle soit plus délicate à configurer et à mettre à l’échelle. Cela vous laisse généralement sans la commodité immédiate des commandes de journal intégrées de Docker.
Résumé
Docker dispose de capacités polyvalentes de surveillance des journaux fournies par une suite de pilotes de journalisation. Chaque conteneur peut utiliser un pilote de journalisation unique, vous permettant de stocker les journaux dans un format adapté aux exigences de chaque application.
Les journaux incluent tout ce qui est émis par les flux de sortie standard d’un conteneur. Vous pouvez utiliser echo
, print
, console.log()
ou l’équivalent de votre langage de programmation pour ajouter des lignes au docker logs
production. Les journaux sont conservés jusqu’à ce que votre conteneur soit supprimé avec docker rm
.