Как посмотреть нагрузку на сервер со всех контейнеров?

«Как посмотреть нагрузку на сервер со всех контейнеров?» — вопрос из категории Мониторинг и логирование, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для мониторинга ресурсопотребления контейнеров я использую комбинацию инструментов, от простых CLI до полноценных систем.

1. Быстрый CLI-мониторинг (Docker/Podman):

# Статистика по всем запущенным контейнерам в реальном времени (CPU, Memory, Network I/O, Block I/O)
docker stats --all

# Аналогично для Podman
podman stats --all

# Вывод в формате JSON для скриптовой обработки
docker stats --all --no-stream --format "{{ json . }}"

2. Интерактивные инструменты:

  • ctop — как top, но для контейнеров.
    docker run --rm -ti --name=ctop -v /var/run/docker.sock:/var/run/docker.sock:ro quay.io/vektorlab/ctop:latest
  • dockertop — встроенная команда (менее информативно).

3. Агенты для сбора метрик:

  • cAdvisor (Container Advisor) от Google — собирает детальные метрики по ресурсам и производительности контейнеров.
    docker run -d 
      --name=cadvisor 
      --volume=/:/rootfs:ro 
      --volume=/var/run:/var/run:ro 
      --volume=/sys:/sys:ro 
      --volume=/var/lib/docker/:/var/lib/docker:ro 
      --publish=8080:8080 
      --detach=true 
      gcr.io/cadvisor/cadvisor:latest

    После запуска веб-интерфейс доступен на http://<server-ip>:8080. cAdvisor также предоставляет метрики в формате Prometheus.

4. Продакшен-мониторинг: В реальных проектах мы не смотрим нагрузку вручную. Настроен пайплайн:

  1. Сбор метрик: Prometheus Node Exporter (метрики хоста) + cAdvisor (метрики контейнеров) или метрики напрямую из Docker/Podman socket.
  2. Хранение и запросы: Prometheus.
  3. Визуализация и алертинг: Grafana с дашбордами, показывающими CPU/RAM/Network/Disk по всем контейнерам и хостам. Критические значения триггерят алерты в Alertmanager.

Пример запроса PromQL для Grafana: sum(rate(container_cpu_usage_seconds_total{name!=""}[5m])) by (name) — загрузка CPU по контейнерам.