Monitor Docker Container ด้วย Prometheus และ Grafana

ทำไมต้อง Monitor Docker?

การติดตาม Container Health, CPU, Memory และ Network ช่วยให้รู้ปัญหาก่อนที่ User จะได้รับผลกระทบ Prometheus เป็นเครื่องเก็บ Metrics และ Grafana เป็นเครื่องแสดง Dashboard

สถาปัตยกรรม Monitoring Stack

Prometheus ← scrape metrics ← cAdvisor (Docker Container metrics)
    ↓
  Grafana Dashboard
    ↓
  Alertmanager (Alert)

docker-compose.yml

version: '3.8'
services:
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    restart: unless-stopped
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus_data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.retention.time=15d'

  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    restart: unless-stopped
    ports:
      - "3000:3000"
    environment:
      GF_SECURITY_ADMIN_PASSWORD: admin123
      GF_USERS_ALLOW_SIGN_UP: "false"
    volumes:
      - grafana_data:/var/lib/grafana
    depends_on:
      - prometheus

  cadvisor:
    image: gcr.io/cadvisor/cadvisor:latest
    container_name: cadvisor
    restart: unless-stopped
    ports:
      - "8080:8080"
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:ro
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro
      - /dev/disk/:/dev/disk:ro
    privileged: true

  node-exporter:
    image: prom/node-exporter:latest
    container_name: node_exporter
    restart: unless-stopped
    ports:
      - "9100:9100"
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro
    command:
      - '--path.procfs=/host/proc'
      - '--path.sysfs=/host/sys'

volumes:
  prometheus_data:
  grafana_data:

prometheus.yml

global:
  scrape_interval: 15s
  evaluation_interval: 15s

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

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

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

ตั้งค่า Grafana Dashboard

  1. เข้า Grafana ที่ http://server:3000 (admin/admin123)
  2. Configuration → Data Sources → Add Prometheus (http://prometheus:9090)
  3. Import Dashboard ID 193 (Docker cAdvisor) หรือ 1860 (Node Exporter Full)

Metrics ที่น่าติดตาม

Metric ความหมาย
container_cpu_usage_seconds_total CPU ใช้สะสม
container_memory_usage_bytes Memory ที่ใช้อยู่
container_network_receive_bytes_total Network รับเข้า
container_fs_usage_bytes Disk usage

ตั้ง Alert ด้วย Alertmanager

version: '3.8'
services:
  alertmanager:
    image: prom/alertmanager:latest
    container_name: alertmanager
    restart: unless-stopped
    ports:
      - "9093:9093"
    volumes:
      - ./alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml

สรุป

Prometheus + Grafana + cAdvisor เป็น Monitoring Stack ที่นิยมที่สุดสำหรับ Docker ติดตั้งได้ง่ายด้วย Docker Compose อย่างเดียว