Passer au contenu principal

Production (Docker)

Monitoring Docker

Savoir que le container tourne ne suffit pas. En production, il faut des métriques sur l'utilisation des ressources, les health checks, les redémarrages, les erreurs. La stack cAdvisor + Prometheus + Grafana est le standard pour les environnements Docker standalone.

docker stats

# Vue temps réel de tous les containers
docker stats

# Format pour scripts
docker stats --no-stream --format   "{{.Name}},{{.CPUPerc}},{{.MemUsage}},{{.NetIO}},{{.BlockIO}}"

cAdvisor

cAdvisor (Container Advisor) expose les métriques de tous les containers en format Prometheus sur le port 8080.

# compose.yml
services:
  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"
    restart: unless-stopped

Prometheus + Grafana

services:
  prometheus:
    image: prom/prometheus:latest
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
      - prometheus-data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.retention.time=15d'
    restart: unless-stopped

  grafana:
    image: grafana/grafana:latest
    volumes:
      - grafana-data:/var/lib/grafana
    environment:
      GF_SECURITY_ADMIN_PASSWORD: ${GRAFANA_PASSWORD}
    ports:
      - "3000:3000"
    restart: unless-stopped

volumes:
  prometheus-data:
  grafana-data:
# prometheus.yml
global:
  scrape_interval: 15s

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

  - job_name: node
    static_configs:
      - targets: ['node-exporter:9100']

Labels pour la découverte

services:
  api:
    labels:
      - "prometheus.io/scrape=true"
      - "prometheus.io/port=8080"
      - "prometheus.io/path=/metrics"

Prometheus peut utiliser ces labels pour la découverte automatique de cibles avec le docker_sd_config.

Alertes essentielles à configurer

  • Container redémarré (OOMKilled ou crash)
  • Mémoire > 80% de la limite
  • CPU throttled > 25% du temps
  • Healthcheck en état unhealthy
  • Disque /var/lib/docker > 80%