Les conteneurs Docker de longue durée peuvent rapidement accumuler un grand nombre de lignes de journal. Ceux-ci consomment de la capacité de stockage et réduisent les performances en accédant et en filtrant les données. Alors que Docker inclut des outils intégrés pour afficher les journaux, il n’existe aucun mécanisme intégré pour les nettoyer.
Dans cet article, vous apprendrez à effacer les journaux des conteneurs Docker en cours d’exécution, sans les redémarrer ni les remplacer. Vous découvrirez également certaines techniques permettant de gérer plus efficacement des enregistrements volumineux tout en conservant les anciennes données.
Sommaire
comprendre le problème
Docker collecte les journaux de la sortie standard et les flux d’erreurs des processus de premier plan du conteneur. Les docker logs
La commande est utilisée pour récupérer ces enregistrements, mais elle ne permet pas de supprimer les anciennes lignes.
Docker prend en charge de nombreux pilotes de registre différents, il n’est donc pas possible de fournir un mécanisme de nettoyage standardisé. Cet article se concentre sur la norme json-file
log handler, où les lignes de journal sont stockées dans un fichier JSON sur le système de fichiers hôte de votre conteneur. Consultez la documentation de votre contrôleur de stockage si vous devez nettoyer les journaux transmis à un hôte distant.
Les fichiers journaux créés par le json-file
contrôleur sont stockés sous le /var/lib/docker/containers
annuaire. Chaque conteneur obtient son propre fichier journal qui est utilisé tout au long de sa durée de vie. Il n’y a pas de rotation des journaux configurée par défaut.
La simple suppression du fichier journal n’est pas une solution efficace. Docker s’attend à ce que le fichier soit disponible en permanence et ne le recréera pas automatiquement s’il est supprimé. C’est plus sûr Bien sûr le contenu du registre existant pour éviter d’affecter les écritures en cours.
Découvrez le chemin du fichier journal
Recherchez d’abord le chemin d’accès au fichier journal de votre conteneur cible. Vous pouvez récupérer le chemin du fichier journal pour un conteneur appelé my-app
en exécutant la commande suivante :
$ docker inspect --format="{{.LogPath}}" my-app /var/lib/containers/1380d936...-json.log
Effacer le fichier journal
Vous pouvez effacer le contenu du journal sans le supprimer en renvoyant une chaîne vide dans son contenu. Le fichier appartiendra à root
vous devrez donc effectuer cette opération dans un shell root. La commande suivante videra le fichier journal pour vous :
$ sudo sh -c 'echo "" > $(docker inspect --format="{{.LogPath}}" my-app)'
L’interpolation Shell est utilisée pour récupérer dynamiquement le chemin du fichier journal pour le my-app
récipient. Au lieu de cela, vous pouvez remplacer manuellement le chemin précédemment récupéré.
quand tu cours docker logs my-app
vous verrez maintenant une sortie vide à moins que le conteneur n’ait repris l’écriture de lignes entre-temps.
Limitation de la sortie du journal
Les docker logs
La commande accepte certains arguments qui peuvent être utilisés pour limiter la sortie de journaux bruyants. Ceux-ci permettent d’atténuer le besoin de nettoyer le registre et d’éviter que votre terminal ne soit inondé d’anciennes lignes chaque fois que vous accédez au fichier.
--tail
– Cet indicateur indique à Docker de n’émettre qu’un nombre spécifique d’anciennes lignes de journal, en commençant par la plus récente.--until
Oui--since
– Ces drapeaux limitent la sortie aux lignes de journal émises pendant une période de temps spécifique. Ils sont utiles lorsque vous connaissez la période approximative pendant laquelle un événement s’est produit.
Voici quelques exemples:
Afficher les 100 lignes de journal les plus récentes
docker logs my-app --tail 100
Afficher les lignes de journal écrites au cours de la dernière heure
docker logs my-app --since 1h
Affiche jusqu’à 100 lignes de journal écrites au cours de la dernière heure
docker logs my-app --tail 100 --since 1h
Paramètres de rotation des journaux
Le fait de devoir nettoyer régulièrement les fichiers journaux de cette manière indique généralement que vos journaux d’application sont excessivement verbeux ou qu’il y a tout simplement trop d’activité à stocker dans un seul fichier.
De nombreux pilotes de registre Docker, y compris json-file
a une prise en charge facultative de la rotation des journaux que vous pouvez activer globalement pour le démon Docker ou par conteneur.
Les paramètres du démon sont configurés dans /etc/docker/daemon.json
. Il s’agit d’un exemple qui fait pivoter les journaux du conteneur une fois qu’ils atteignent 8 Mo. Jusqu’à cinq fichiers seront conservés à tout moment, les anciens fichiers étant automatiquement supprimés au fur et à mesure que de nouvelles rotations se produisent.
{ "log-opts": { "max-size": "8m", "max-file": "5" } }
Redémarrez le démon Docker pour appliquer la modification :
$ sudo service docker restart
La rotation au niveau du démon s’applique à tous les conteneurs nouvellement créés. Les modifications n’affecteront pas les conteneurs qui existent déjà sur votre hôte.
La rotation peut être définie pour des conteneurs individuels à l’aide de --log-opts
flags Ceux-ci remplaceront les paramètres par défaut du démon Docker.
docker run --name app --log-driver json-file --log-opts max-size=8M --log-opts max-file=5 app-image:latest
résumé
Les journaux de conteneur Docker peuvent devenir bruyants lorsque des applications occupées écrivent une sortie importante. L’accès aux journaux détaillés est utile pour le débogage, mais ils consomment de l’espace de stockage, rendent la sélection des données difficile et peuvent ralentir les performances.
Vous pouvez nettoyer les fichiers journaux à la demande en utilisant des commandes shell pour vider leur contenu. Cependant, il est recommandé de configurer la rotation des journaux pour qu’elle se produise automatiquement une fois que les fichiers atteignent une taille spécifiée. Les docker logs
La commande prend également en charge les indicateurs qui peuvent aider à contrôler les journaux lourds sur le point d’accès.