Superviser ses conteneurs Docker avec cAdvisor

Superviser ses conteneurs Docker avec cAdvisor

La stack posée dans l'article sur la supervision SNMP couvre bien les équipements réseau, mais pas ce qui se passe à l'intérieur des hôtes Docker : quel conteneur consomme le plus de CPU, quel autre fuit de la mémoire, lequel sature son disque. cAdvisor (Container Advisor), l'exporter de métriques de conteneurs maintenu par Google, comble exactement ce manque, avec la même stack Prometheus + Grafana déjà en place.

node_exporter vs cAdvisor : node_exporter (vu dans l'article Grafana) donne des métriques au niveau de la machine hôte (CPU, RAM, disque globaux) ; cAdvisor descend au niveau de chaque conteneur individuellement. Les deux sont complémentaires, pas concurrents, et tournent très bien côte à côte sur le même hôte.

1. Ajouter cAdvisor au docker-compose.yml

cAdvisor a besoin d'accéder au socket Docker et à certains chemins système pour observer les conteneurs et l'hôte :

docker-compose.yml
services:
  cadvisor:
    image: gcr.io/cadvisor/cadvisor:latest
    container_name: cadvisor
    restart: unless-stopped
    privileged: true
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:ro
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro
      - /dev/disk/:/dev/disk:ro
    ports:
      - "18080:8080"   # port hôte à adapter selon ce qui est déjà utilisé chez vous
Sur les montages en lecture seule : cAdvisor n'a besoin que de lire ces chemins pour observer l'état des conteneurs — tous les montages sont donc en :ro. Le mode privileged reste nécessaire pour accéder aux métriques bas niveau du noyau, mais gardez cAdvisor sur un réseau Docker interne plutôt que d'exposer son port directement sur Internet.

2. Ajouter la cible à Prometheus

En reprenant le prometheus.yml de la stack de supervision SNMP, on ajoute simplement un nouveau job :

prometheus.yml
scrape_configs:
  # ... (job snmp existant)
  - job_name: cadvisor
    static_configs:
      - targets: [cadvisor:8080]   # port conteneur, pas le port hôte remappé

Contrairement au SNMP, pas besoin de relabel_configs ici : cAdvisor expose directement ses métriques Prometheus sur /metrics, sans passer par un exporter intermédiaire.

3. Importer un dashboard Grafana

Plusieurs dashboards communautaires prêts à l'emploi existent pour cAdvisor sur grafana.com/dashboards (recherche "cAdvisor" ou "Docker containers") : CPU et mémoire par conteneur dans le temps, trafic réseau entrant/sortant, débit disque en lecture/écriture, et un classement des conteneurs les plus gourmands.

4. Points de vigilance

  • cgroups v1 vs v2 : selon la distribution et la version de Docker, certaines métriques (notamment mémoire détaillée) peuvent différer légèrement entre les deux implémentations de cgroups. Si des métriques manquent, vérifier la version de cgroups active sur l'hôte (mount | grep cgroup).
  • Overhead de cAdvisor lui-même : sur un hôte avec beaucoup de conteneurs, cAdvisor consomme lui-même une part non négligeable de CPU pour collecter ses métriques — à surveiller comme n'importe quel autre conteneur.
  • Rétention des métriques : cAdvisor ne conserve qu'un historique très court en mémoire ; c'est Prometheus, avec son propre volume de stockage, qui assure la conservation à long terme des séries temporelles.
Croiser les métriques cAdvisor (par conteneur) avec celles de node_exporter (par hôte) permet de répondre en quelques secondes à la question "c'est le serveur qui est chargé, ou un conteneur précis qui s'emballe ?" — une distinction qui fait gagner beaucoup de temps en diagnostic.

Conclusion

Avec quelques lignes de configuration supplémentaires sur une stack Prometheus + Grafana déjà en place, cAdvisor ajoute une granularité par conteneur qui manque cruellement dès qu'on héberge plus de quelques services Docker sur le même hôte. Si vous voulez être accompagné sur la mise en place de votre supervision applicative, n'hésitez pas à me contacter.

R
Raph — Chronoassistance25 ans d'expérience en informatique, cybersécurité et infrastructure.