Aller au contenu

Surveillance des conteneurs Docker avec Prometheus et Grafana : alertes automatiques à domicile

Rogelio Guerra Riverón
Auteur
Rogelio Guerra Riverón
Construction de ma propre infrastructure web depuis zéro. Je documente chaque étape : serveurs, réseaux, conteneurs et tout ce qui se présente.

Le problème
#

Après avoir passé des mois à exécuter des conteneurs sur mon serveur domestique, j’en ai eu assez de découvrir des problèmes quand les choses étaient déjà cassées. Un conteneur consommant toute la mémoire. Un volume plein sans avertissement. J’avais besoin d’une vraie visibilité sur ce qui se passait dans mon infrastructure.

J’ai décidé de mettre en place une stack de monitoring avec Prometheus et Grafana. Je documente ici exactement comment j’ai procédé.

Architecture choisie
#

  • Prometheus : collecte les métriques de Docker
  • cAdvisor : expose les métriques des conteneurs
  • Grafana : visualise tout dans les dashboards
  • Alertmanager : notifie quand quelque chose échoue

Étape 1 : Docker Compose avec la stack complète
#

J’ai créé un fichier docker-compose.yml qui démarre le tout :

version: '3.8'

services:
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - ./alertas.yml:/etc/prometheus/alertas.yml
      - prometheus_data:/prometheus
    ports:
      - "9090:9090"
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
    networks:
      - monitoring

  cadvisor:
    image: gcr.io/cadvisor/cadvisor:latest
    container_name: cadvisor
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:ro
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro
    ports:
      - "8080:8080"
    networks:
      - monitoring

  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    ports:
      - "3000:3000"
    volumes:
      - grafana_data:/var/lib/grafana
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin
    networks:
      - monitoring

  alertmanager:
    image: prom/alertmanager:latest
    container_name: alertmanager
    volumes:
      - ./alertmanager.yml:/etc/alertmanager/alertmanager.yml
      - alertmanager_data:/alertmanager
    ports:
      - "9093:9093"
    networks:
      - monitoring

volumes:
  prometheus_data:
  grafana_data:
  alertmanager_data:

networks:
  monitoring:
    driver: bridge

Étape 2 : Configurer Prometheus
#

Fichier prometheus.yml :

global:
  scrape_interval: 15s
  evaluation_interval: 15s

alerting:
  alertmanagers:
    - static_configs:
        - targets:
            - alertmanager:9093

rule_files:
  - '/etc/prometheus/alertas.yml'

scrape_configs:
  - job_name: 'cadvisor'
    static_configs:
      - targets: ['cadvisor:8080']

  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

Étape 3 : Définir les alertes
#

Fichier alertas.yml :

groups:
  - name: docker_alerts
    interval: 10s
    rules:
      - alert: HighCPUUsage
        expr: 'rate(container_cpu_usage_seconds_total[5m]) > 0.8'
        for: 2m
        annotations:
          summary: "CPU alta en contenedor {{ $labels.name }}"
          description: "{{ $labels.name }} está usando {{ $value | humanizePercentage }} de CPU"

      - alert: HighMemoryUsage
        expr: 'container_memory_usage_bytes / container_spec_memory_limit_bytes > 0.85'
        for: 2m
        annotations:
          summary: "Memoria alta en {{ $labels.name }}"
          description: "Uso de memoria: {{ $value | humanizePercentage }}"

      - alert: DiskSpaceRunningOut
        expr: 'node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"} < 0.1'
        for: 5m
        annotations:
          summary: "Espacio en disco por debajo del 10%"

Étape 4 : Configurer Alertmanager
#

Fichier alertmanager.yml :

global:
  resolve_timeout: 5m

route:
  receiver: 'console'
  group_by: ['alertname']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 1h

receivers:
  - name: 'console'
    webhook_configs:
      - url: 'http://localhost:5001/'

Étape 5 : Démarrer et vérifier
#

docker-compose up -d

Accès :

  • Prometheus : http://localhost:9090
  • Grafana : http://localhost:3000
  • cAdvisor : http://localhost:8080

Étape 6 : Créer des dashboards dans Grafana
#

Dans Grafana j’ai importé le dashboard public 893 (Docker and Host Monitoring) qui fonctionne directement avec cAdvisor.

Résultat
#

J’ai maintenant une visibilité complète. Je reçois des alertes quand :

  • Un conteneur consomme plus de 80% de CPU pendant 2 minutes
  • La mémoire dépasse 85% de la limite
  • Le disque tombe en dessous de 10%

La setup complète occupe moins de 500MB de RAM au repos et m’a déjà évité plusieurs frayeurs. Ça en vaut la peine.


Équipement recommandé
#

Liens d’affiliation. Aucun coût supplémentaire pour toi.