Gestion des logs
Persistance
Dans le cycle de vie d'une application, il est toujours nécessaire d'accéder aux logs, afin par exemple, de débugguer l'application. Pour se faire, dans le cadre d'un environnement de production il ne faut pas sauvegarder les logs dans un container.
Les logs sont stockés dans la layer du container liée à son cycle de vie ; celui créé au démarrage du container et qui est accessible en lecture et écriture. Si le container est supprimé, ils seront donc perdus. Il est recommendé de logger sur la sortie standard (stdout) et l'erreur standard (stderr) afin de pouvoir les utiliser via un agrégateur de logs et un stockage centralisé.
Drivers
Par défault sont installés plusieurs plugins sur la machine hôte
docker info | grep "Plugin" -A 3
Plugins:
buildx: Build with BuildKit (Docker Inc., v0.6.1-docker)
compose: Docker Compose (Docker Inc., 2.1.1)
--
Plugins:
Volume: local
Network: bridge host ipvlan macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslogChaque plugin peut être utilisé via le driver qu'il définit.
Par défaut c'est le drive json-file qui sert à la gestion des logs. Celui-ci stockant dans un fichier json (/var/lib/docker/containers/CONTAINER_ID/CONTAINER_ID-json.log), on comprend pourquoi il est difficilement exploitable dans un environnement de production ; le fichier étant rattaché à la layer de démarrage du container.
Principaux drivers de logs
| Driver | Destination |
|---|---|
| json-file | fichier local (driver par défaut) |
| awslogs | service AWS CloudWatch |
| gcplogs | service de logging de Google Cloud Platform (GCP) |
| logentries | service https://logentries.com |
| spunk | service https://spunk.com |
| gelf | gendpoint GELF (Graylog Extended Log Format), ex: Logstash |
| syslog | daemon syslog tournant sur la machine hôte |
| fluentd | daemon fluentd tournant sur la machine hôte |
| journald | daemon journald tournant sur la machine hôte |
Pour utiliser un driver spécifique il existe 2 solutions :
Pour configurer un driver, on peut le faire via :
- le daemon docker
nvim /etc/docker/daemon.json
{
"log-driver": "gelf",
"log-opts": {
"gelf-address": "udp://192.168.99.100:5000"
}
}- le service docker via systemd
nvim /etc/systemd/system/docker.service.d/10-machine.conf
ExecStart=/usr/bin/dockerd -H fd:// --log-driver=gelf --log-opt gelf-address=udp://192./168.99.100:5000Si toutefois il est impossible d'accéder à la configuration du daemon on peut aussi spécifier le driver à utiliser au moment du lancement du container :
- docker-cli
docker service create --log-driver=gelf --log-opt gelf-address=udp://10.0.0.18:5000 reverse-proxy:1.0- docker-compose
services:
reverse-proxy:
image: reverse-proxy:1.0
logging:
driver: "gelf"
options:
gelf-address: "udp://10.0.0.18:5000"