Мониторинг на Docker контейнерите с Prometheus и Grafana

Мониторинг на Docker контейнерите с Prometheus и Grafana

Мониторинг на Docker контейнерите с Prometheus и Grafana — стъпка по стъпка

Пълно ръководство стъпка по стъпка за начинаещи

📅 Време за четене: 12 мин
🎯 Ниво: Начинаещи
🛠️ Практическо ръководство
Какво ще научите: В тази статия ще видите как да настроите пълноценен мониторинг на Docker контейнерите. Ще използваме Prometheus за събиране на метрики и Grafana за визуализация. В края ще имате работещ dashboard с реално време данни.

Съдържание

Защо е важен мониторингът на контейнерите?

Когато работите с Docker контейнери в продукция, мониторингът е критично важен. Без него сте слепи за това какво се случва във вашите приложения.

Ето защо се нуждаете от мониторинг:

  • Откриване на проблеми преди потребителите да ги забележат
  • Проследяване на производителността и ресурсите
  • Планиране на капацитета и скалиране
  • Бърза диагностика при инциденти
Архитектура на решението:
Docker контейнери → cAdvisor → Prometheus → Grafana → Красиви графики

Какво ще инсталираме?

Prometheus

Prometheus е open-source система за мониторинг. Тя събира метрики от различни източници и ги съхранява в time-series база данни.

Grafana

Grafana е платформа за визуализация на данни. Създава красиви dashboard-ове с графики и табла в реално време.

cAdvisor

cAdvisor (Container Advisor) събира, агрегира и експортва информация за работещите контейнери. Това е нашият мост между Docker и Prometheus.

Стъпка 1: Подготовка на средата

1

Създаване на работна директория

Първо създайте директория за проекта и навигирайте в нея:

mkdir docker-monitoring
cd docker-monitoring
Внимание: Уверете се, че имате инсталиран Docker и Docker Compose. Проверете с командите docker –version и docker-compose –version.

Стъпка 2: Конфигурация на Prometheus

2

Създаване на prometheus.yml

Създайте файл prometheus.yml с конфигурацията на Prometheus:

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-exporter'
    static_configs:
      - targets: ['node-exporter:9100']
Обяснение: Този файл казва на Prometheus откъде да събира данни. Ще мониторира себе си, cAdvisor за Docker метрики и Node Exporter за системни метрики.

Стъпка 3: Docker Compose конфигурация

3

Създаване на docker-compose.yml

Създайте файл docker-compose.yml който ще orchestrira всички сервиси:

version: '3.8'

services:
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--web.console.libraries=/etc/prometheus/console_libraries'
      - '--web.console.templates=/etc/prometheus/consoles'
      - '--web.enable-lifecycle'
    restart: unless-stopped

  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    ports:
      - "3000:3000"
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin123
    volumes:
      - grafana-data:/var/lib/grafana
    restart: unless-stopped

  cadvisor:
    image: gcr.io/cadvisor/cadvisor:latest
    container_name: cadvisor
    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
    devices:
      - /dev/kmsg
    restart: unless-stopped

  node-exporter:
    image: prom/node-exporter:latest
    container_name: node-exporter
    ports:
      - "9100:9100"
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro
    command:
      - '--path.procfs=/host/proc'
      - '--path.sysfs=/host/sys'
      - '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)'
    restart: unless-stopped

  # Примерно приложение за мониторинг
  sample-app:
    image: nginx:latest
    container_name: sample-app
    ports:
      - "8081:80"
    restart: unless-stopped

volumes:
  grafana-data:

Стъпка 4: Стартиране на системата

4

Пускане на всички сервиси

Стартирайте цялата система с една команда:

docker-compose up -d

Проверете дали всички контейнери работят:

docker-compose ps
Проверка: Трябва да видите 5 контейнера в статус "Up" – prometheus, grafana, cadvisor, node-exporter и sample-app.

Стъпка 5: Конфигуриране на Grafana

5

Първоначална настройка

Отворете браузъра и отидете на http://localhost:3000.

Логнете се с:

  • Потребител: admin
  • Парола: admin123

Добавяне на Prometheus като Data Source

След логин, следвайте тези стъпки:

  • Отидете на "Configuration" → "Data Sources"
  • Кликнете "Add data source"
  • Изберете "Prometheus"
  • В URL полето въведете: http://prometheus:9090
  • Кликнете "Save & Test"
Трябва да видите зелено съобщение "Data source is working".

Стъпка 6: Създаване на Dashboard

6

Импортиране на готов dashboard

Най-лесният начин е да импортирате готов dashboard:

  • Отидете на "+" → "Import"
  • В полето "Import via grafana.com" въведете: 893
  • Кликнете "Load"
  • Изберете вашия Prometheus data source
  • Кликнете "Import"
Dashboard 893 е специално създаден за Docker контейнер мониторинг с cAdvisor. Показва CPU, памет, мрежа и disk I/O в реално време.

Създаване на собствен panel

Можете също да създадете собствен panel:

  • Кликнете "Add panel"
  • В Query полето въведете: rate(container_cpu_usage_seconds_total[1m])
  • Настройте заглавието на "Container CPU Usage"
  • Кликнете "Apply"

Стъпка 7: Полезни метрики и заявки

7

Ключови Prometheus заявки

Ето някои полезни PromQL заявки за мониторинг на контейнери:

CPU заявки

# CPU използване по контейнер (%)
rate(container_cpu_usage_seconds_total{name!=""}[1m]) * 100

# Топ 5 контейнера по CPU
topk(5, rate(container_cpu_usage_seconds_total{name!=""}[1m]))

Памет заявки

# Използвана памет по контейнер (MB)
container_memory_usage_bytes{name!=""} / 1024 / 1024

# Процент използвана памет
(container_memory_usage_bytes{name!=""} / container_spec_memory_limit_bytes{name!=""}) * 100

Мрежови метрики

# Мрежов трафик - получен
rate(container_network_receive_bytes_total{name!=""}[1m])

# Мрежов трафик - изпратен  
rate(container_network_transmit_bytes_total{name!=""}[1m])

Стъпка 8: Настройване на алерти

8

Създаване на basic алерти

В Grafana можете да настроите алерти за важни метрики:

Алерт за високо CPU използване

  • Отворете панела за CPU използване
  • Кликнете "Alert" таба
  • Създайте правило: "WHEN max() OF query() IS ABOVE 80"
  • Настройте notification channel
Препоръка: Започнете с прости алерти. Твърде много алерти могат да доведат до "alert fatigue" – игнориране на важни известия.

Стъпка 9: Тестване на системата

9

Генериране на натоварване

За да тествате мониторинга, можете да генерирате натоварване:

# Стартиране на контейнер с високо CPU използване
docker run --rm -d --name cpu-stress alpine sh -c "while true; do :; done"

# Спиране след няколко минути
docker stop cpu-stress

Стартирайте няколко контейнера за тест:

# Различни тестови контейнери
docker run -d --name test-nginx nginx:alpine
docker run -d --name test-redis redis:alpine
docker run -d --name test-postgres -e POSTGRES_PASSWORD=test postgres:alpine
Проверете dashboard-а в Grafana. Трябва да видите новите контейнери и техните метрики в реално време.

Стъпка 10: Поддръжка и оптимизация

10

Best practices за продукция

Data retention

По подразбиране Prometheus пази данни 15 дни. За продукция настройте подходящ retention:

# Добавете към Prometheus командите в docker-compose.yml
- '--storage.tsdb.retention.time=30d'
- '--storage.tsdb.retention.size=10GB'

Security настройки

  • Променете default паролата на Grafana
  • Настройте reverse proxy с SSL
  • Ограничете достъпа с firewall правила
  • Използвайте authentication за Prometheus

Backup стратегия

# Backup на Grafana конфигурация
docker exec grafana grafana-cli admin export-dashboard > dashboards-backup.json

# Backup на Prometheus данни
docker exec prometheus tar -czf /tmp/prometheus-backup.tar.gz /prometheus

Често срещани проблеми и решения

Prometheus не събира данни от cAdvisor

  • Проверете дали cAdvisor контейнерът работи: docker-compose ps
  • Тествайте директен достъп: curl http://localhost:8080/metrics
  • Проверете мрежовите връзки между контейнерите

Grafana не може да се свърже с Prometheus

  • Уверете се, че използвате правилния URL: http://prometheus:9090
  • Проверете дали и двата контейнера са в същата мрежа
  • Тествайте connectivity: docker exec grafana ping prometheus

Високо използване на дискова памет

  • Намалете scrape интервала в prometheus.yml
  • Настройте по-кратък retention период
  • Използвайте по-специфични label селектори
Важно: Винаги тествайте промените в development среда преди да ги приложите в production.

Заключение

Честито! Сега имате пълноценна система за мониторинг на Docker контейнери.

Това setup ви дава възможност да:

  • Проследявате performance на всички контейнери в реално време
  • Получавате алерти при проблеми
  • Анализирате trends и планирате капацитет
  • Бързо диагностицирате проблеми

Следващи стъпки: Експериментирайте с различни dashboard-ове, настройте алерти за вашите специфични нужди и разгледайте advanced функции като service discovery и federation.

Мониторингът е непрекъснат процес. Редовно преглеждайте метриките и оптимизирайте системата според нуждите на вашите приложения.

💡 Полезна статия? Споделете я с колеги, които също работят с Docker контейнери!

Федя Серафиев

Федя Серафиев

Федя Серафиев e собственик на уебсайта urocibg.eu. Той намира удовлетворение в това да помага на хората да решават и най-сложните технически проблеми. Сегашната му цел е да пише лесни за следване статии, така че подобни проблеми изобщо да не възникват.

Благодарим ви за прочитането на статията! Ако намерихте информацията за полезна, можете да дарите посредством бутоните по-долу: