Перейти к содержимому

19. Мониторинг

Мониторинг ресурсов контейнеров позволяет выявлять узкие места, предотвращать утечки памяти и оптимизировать производительность. Docker предоставляет встроенные инструменты и интегрируется с профессиональными системами мониторинга.

Окно терминала
# Статистика всех запущенных контейнеров
docker stats
# Конкретного контейнера
docker stats mycontainer
# Без автообновления (один снимок)
docker stats --no-stream
# Форматированный вывод
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}"
# Вывод в JSON
docker stats --format json --no-stream

Вывод docker stats:

CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O
abc123 web-nginx 0.1% 12.5MiB / 512MiB 2.44% 1.2kB / 890B 1MB / 0B
def456 api-node 2.3% 245MiB / 1GiB 23.9% 45kB / 22kB 5MB / 2MB
ghi789 postgres 0.5% 128MiB / 2GiB 6.25% 12kB / 8kB 25MB / 10MB
Окно терминала
# Ограничение памяти
docker run -d \
--memory=512m \ # максимум 512 МБ RAM
--memory-swap=512m \ # отключить swap (swap = memory)
--memory-reservation=256m \ # мягкий лимит
myapp
# Ограничение CPU
docker run -d \
--cpus=0.5 \ # использовать максимум 0.5 CPU
--cpu-shares=512 \ # относительный приоритет (по умолчанию 1024)
--cpuset-cpus="0,1" \ # использовать только ядра 0 и 1
myapp
# Ограничение I/O
docker run -d \
--device-read-bps=/dev/sda:50mb \ # чтение макс 50 MB/s
--device-write-bps=/dev/sda:50mb \ # запись макс 50 MB/s
myapp
# В docker-compose.yml
services:
api:
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
reservations:
cpus: '0.25'
memory: 256M

Профессиональный мониторинг: cAdvisor + Prometheus + Grafana

Заголовок раздела «Профессиональный мониторинг: cAdvisor + Prometheus + Grafana»
version: '3.8'
services:
cadvisor:
image: gcr.io/cadvisor/cadvisor:latest
volumes:
- /:/rootfs:ro
- /var/run:/var/run:ro
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
ports:
- "8080:8080"
privileged: true
prometheus:
image: prom/prometheus:latest
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
ports:
- "9090:9090"
grafana:
image: grafana/grafana:latest
ports:
- "3000:3000"
volumes:
- grafana_data:/var/lib/grafana
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
depends_on:
- prometheus
prometheus.yml
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'docker'
static_configs:
- targets: ['cadvisor:8080']

CPU:

  • container_cpu_usage_seconds_total — общее использование CPU
  • container_cpu_throttled_seconds_total — время троттлинга

Memory:

  • container_memory_usage_bytes — текущее использование
  • container_memory_limit_bytes — лимит памяти
  • container_memory_working_set_bytes — рабочий набор памяти

Network:

  • container_network_receive_bytes_total — входящий трафик
  • container_network_transmit_bytes_total — исходящий трафик