Comment surveiller les journaux de conteneur Docker

0
96

Docker regroupe automatiquement la sortie standard du conteneur et les flux d'erreur (stdout/stderr) dans des 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 afin que les commandes Docker puissent les exposer.

Vous pouvez afficher les journaux de conteneur à tout moment pendant le cycle de vie d'un conteneur. Lorsqu'un conteneur est en cours d'exécution, vous pouvez diffuser des journaux en temps réel. Pour les conteneurs arrêtés, vous pouvez accéder à tous les journaux capturés avant la résiliation.

Affichage des journaux de conteneurs

Pour afficher les journaux de conteneurs, utilisez le docker Commande logs:

docker logs my-container

Remplacez my-container par le nom ou l'ID du conteneur que vous voulez inspecter. Vous pouvez utiliser docker ps -a pour obtenir les identifiants et les noms de vos conteneurs.

La commande logs imprime la totalité du journal du conteneur sur votre terminal. La sortie ne sera pas continue. Si vous souhaitez continuer à diffuser de nouveaux journaux, ajoutez l'indicateur –follow à la commande. Cela équivaut à utiliser tail -f avec des fichiers journaux normaux sur votre machine.

Personnalisation de ce qui est affiché

La commande docker logs prend en charge plusieurs indicateurs qui vous permettent d'ajuster sa sortie:

  • & # 8211; horodatages & # 8211; Afficher les horodatages complets au début de chaque ligne de journal.
  • & # 8211; jusqu'à et –depuis & # 8211; 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 une heure relative amicale (par exemple, il y a 1h = 1 heure).
  • & # 8211; tail & # 8211; Récupère un nombre donné de lignes dans le journal. –tail 10 affichera les dix dernières lignes enregistrées par le conteneur.
  • & # 8211; détails & # 8211; 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. Les valeurs typiques affichées avec –details incluent les étiquettes de conteneur et les variables d'environnement.

Vous pouvez combiner ces indicateurs pour obtenir des journaux au format dont vous avez besoin. Les indicateurs until, since et tail 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 pilote de fichier json.

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, le passage au pilote local 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 (écrire dans le démon syslog exécuté sur votre machine), journald (utiliser une instance journald en cours d'exécution) 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 sous le nom de plugin.

Spécifier un pilote de journalisation

Vous peut spécifier le pilote de journalisation pour un conteneur en passant l'indicateur –log-driver à 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. Modifiez (ou créez) /etc/docker/daemon.json. Définissez la clé du pilote de journal sur le nom d'un pilote de journalisation. Docker utilisera ce pilote pour tous les conteneurs créés sans indicateur –log-driver.

{& quot; log-driver & quot ;: & quot; systemd & quot; }

De nombreux pilotes de journalisation sont livrés avec leurs propres options de configuration. Ceux-ci sont définis à l'aide de l'indicateur de conteneur –log-opts ou log-opts dans daemon.json. Voici un exemple pertinent pour le pilote de fichier json par défaut. Il demande à Docker de faire pivoter les fichiers journaux une fois qu'ils & # 8217; sont supérieurs à 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

{& quot; log-driver & quot ;: & quot; json-file & quot ;, & quot; log -opts & quot ;: {& quot; max-size & quot ;: & quot; 8M & quot ;, & quot; max-file & quot ;: 5}}

Modes de livraison du pilote

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 un 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 des 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 ne soient remis au pilote.

Vous pouvez activer la livraison non bloquante en définissant l'option de journalisation de mode, avec –log-opts ou daemon.json. Vous pouvez définir la taille du tampon de journal en mémoire avec l'option max-buffer-size. La définition de cette valeur élevée réduit le risque de perte de journaux, à condition que vous ayez suffisamment de RAM disponible.

docker run –log-opt mode = non-blocking –log-opt max-buffer-size = 8M my -image:

Bonnes pratiques de journalisation

Vos conteneurs doivent fonctionner avec le système de journalisation de Docker dans la mesure du possible. L'émission 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 que les journaux de docker seuls ne peuvent 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é & # 8220; side-car & # 8221 ;, 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 des 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 fonctionnalités polyvalentes de surveillance des journaux fournies par une suite des 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 à la sortie des journaux du docker. Les journaux sont conservés jusqu'à ce que votre conteneur soit supprimé avec docker rm.