Gestion des logs des containers Docker

Une fois que le container est démarré en mode démon, l'output se trouve dans les logs. Voici quelques infos pour y accéder et les paramétrer.

Accéder aux logs des containers

Cela dépend du type de d'application dans le container mais généralement et par défaut vous avez accès aux logs par (-f pour follow qui affiche en permance vos logs et -t pour l'affichage du timestamp)

$ docker logs -f -t --details MonContainer

Il y a aussi la possibilité de filtrer par date et heure (attention aux fuseaux horaires) les logs affichés à l'aide --since et --until et de les combiner:

$ docker logs -t --since 2018-07-20 --until 2018-07-20 nginx
# N'affiche rien mais c'était pour voir si vous suiviez

$ docker logs -t --since 2018-07-19 --until 2018-07-20 nginx
# Affiche les logs du 19/07

Seulement ces logs peuvent grossir. Sous Linux et par défaut, les logs sont dans les repertoires des containers dans /var/lib/docker/containers.

Faire une rotation des logs

La configuration du docker engine se fait (sous linux) par le fichier /etc/docker/daemon.json, qui comme son nom l'indique est au format JSon.

On peut changer le chemin des containers pour les mettre sur un volume séparé en ajoutant les infos ci-dessous. Par contre si vous le faites avec des containers existants, il vous faudra recopier le contenu de l'ancien répertoire.

{
  "graph": "/mnt/docker-data",
  "storage-driver": "overlay"
}

Pour ajouter une rotation des logs tous les 10Mo et ne garder que 3 logs, il faut ajouter dans le fichier daemon.json :

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": 3
  }
}

Il est également possible d'affiner avec des tags et des profils (par exemple pour dev et prod) que l'on passe ensuite au démarrage du container.

Préférences utilisateurs

Toujours dans le domaine des paramétrages, il y a aussi un fichier de configuration utilisation au format JSon dans $HOME/.docker (par défaut, sinon utiliser la variable d'environnement DOCKER_CONFIG ou --config pour changer le chemin).

Par exemple, pour gérer l'affichage d'un ps:

{
  "psFormat": "table {{.ID}}\\t{{.Names}}\\t{{.Image}}\\t{{.RunningFor}} ago\\t{{.Status}}\\t{{.Mounts}}\\t{{.Networks}}"
}

et vous pouvez les changer pour d'autres types de commmande:

{
  "psFormat": "table {{.ID}}\\t{{.Image}}\\t{{.Command}}\\t{{.Labels}}",
  "imagesFormat": "table {{.ID}}\\t{{.Repository}}\\t{{.Tag}}\\t{{.CreatedAt}}",
  "pluginsFormat": "table {{.ID}}\t{{.Name}}\t{{.Enabled}}",
  "statsFormat": "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}",
  "servicesFormat": "table {{.ID}}\t{{.Name}}\t{{.Mode}}",
  "secretFormat": "table {{.ID}}\t{{.Name}}\t{{.CreatedAt}}\t{{.UpdatedAt}}",
  "configFormat": "table {{.ID}}\t{{.Name}}\t{{.CreatedAt}}\t{{.UpdatedAt}}",
  "serviceInspectFormat": "pretty",
  "nodesFormat": "table {{.ID}}\t{{.Hostname}}\t{{.Availability}}"
}