Поиск по сайту:

Как контролировать использование ресурсов контейнеров Docker


Хотя Docker намного легче, чем традиционные виртуальные машины, слишком большое количество контейнеров может быстро потреблять ресурсы вашего хоста. Вот как можно проверить использование оборудования и отслеживать количество процессов внутри ваших контейнеров.

Команда статистики Docker

Встроенный в Docker механизм просмотра потребления ресурсов — docker stats. Эта команда дает вам табличное представление ваших контейнеров. Каждый контейнер отображает в реальном времени свои критические показатели.

Выходные данные команды включают потребление ЦП и показатель использования сети и хранилища каждого контейнера в течение его срока службы. В столбце «Память» показано использование оперативной памяти, а также ограничение памяти, настроенное для контейнера. Когда ограничение не установлено, вы увидите объем оперативной памяти, доступный на вашем хосте. Последний столбец, PIDS, представляет собой количество процессов, запущенных контейнером.

Остановленные контейнеры по умолчанию исключаются. Вы можете добавить их в таблицу, передав команде флаг -a (--all). Информация об использовании ЦП и памяти будет недоступна, но вы сможете увидеть метрики, агрегированные на протяжении всего жизненного цикла контейнера, например сетевую активность.

Вы можете просматривать статистику одного и нескольких контейнеров так же, как и другие распространенные команды командной строки docker CLI. Передайте список идентификаторов или имен контейнеров, разделенных пробелами. Вывод покажет метрики для указанных контейнеров, удалив все остальное.

docker stats first-container second-container

docker stats поддерживает пользовательское форматирование, поэтому вы можете выбрать только те столбцы, которые вам нужны. Флаг --format принимает строку-заполнитель Go, которая позволяет создавать собственные визуализации данных.

Вот как отобразить имена контейнеров с показателями использования ЦП и памяти:

docker stats --format "table {{.Name}}t{{.CPUPerc}}t{{.MemUsage}}"

Тип форматирования table добавляет заголовки столбцов к выходным данным. Опустите это, если вам нужны необработанные данные без табуляции. Если вы регулярно используете одну и ту же строку форматирования, рассмотрите возможность добавления ее в качестве псевдонима оболочки для простоты доступа.

Получение дополнительной информации

Более подробную информацию об использовании ресурсов контейнера можно получить, проверив его контрольную группу (cgroup). Этот механизм ядра отслеживает использование группы процессов, предоставляя собранные метрики в псевдофайловой системе.

Доступны две версии системы cgroup. v2 поддерживается только в Docker 20.10 или новее с ядром Linux v4.15. Более старые версии будут использовать v1. Документация по версии 2 все еще неполная, поэтому с версией 1 может быть проще работать.

Чтобы найти контрольную группу контейнера, вам нужно определить, какая версия активна, и знать полный идентификатор контейнера. Это должна быть полная версия, а не усеченная форма, показанная в выходных данных docker ps и docker stats. Вы можете найти его, запустив docker ps --no-trunc.

Объедините идентификатор контейнера с путем к каталогу групп управления вашей системы. Пути для v1 и v2 задокументированы Docker. Затем вы можете проверить псевдофайловую систему, чтобы найти подробную статистику ресурсов. Вот путь, чтобы найти использование памяти контейнером при использовании cgroups v1:

cat /sys/fs/cgroup/memory/docker/<full container id>/memory.stat

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

Поиск метрик ресурсов с помощью Docker API

Более простой способ доступа к этой информации — через Docker API. Это включено по умолчанию через сокет Unix демона Docker. Конечная точка /containers/{id}/stats предоставляет подробную информацию об использовании ресурсов. Замените {id} идентификатором вашего контейнера.

curl --unix-socket /var/run/docker.sock "http://localhost/v1.41/containers/{id}/stats" | jq

В этом примере мы используем curl. Он получает указание использовать сокет демона Docker с помощью флага --unix-socket. Docker API будет возвращать данные в формате JSON; это передается в jq, чтобы сделать его более читаемым в терминале.

Каждый ответ API содержит подробную информацию о текущем и прошлом использовании ресурсов контейнера. Это числовые данные, предназначенные для использования станками. Значения представлены «сырыми» и могут быть непонятны сразу без дальнейшей обработки или ввода в инструмент информационной панели.

Просмотр запущенных процессов

Отдельная команда docker top позволяет просмотреть текущий список процессов указанного контейнера:

docker top my-container

Он перечисляет список процессов контейнера во время выполнения команды. В отличие от stats, он не предоставляет поток данных в реальном времени. Вы можете увидеть идентификатор каждого процесса, пользователя, который его запустил, и выполняемую команду.

Вы также можете получить эту информацию из API. Используйте тот же подход, что описан выше, заменив конечную точку /containers/{id}/stats на /containers/{id}/top.

Docker не предоставляет встроенного способа просмотра использования ресурсов для каждого процесса. Если вам нужна эта информация, лучше всего подключиться к контейнеру и установить top или htop. Эти инструменты дадут вам гораздо более глубокое представление об активности контейнера.

docker exec -it my-container sh

# substitute your package manager's commands
apt update && apt install htop -y

htop

Краткое содержание

Демон Docker собирает и предоставляет статистику потребления ресурсов в реальном времени и за прошлые периоды для ваших контейнеров. Вы можете получить доступ к основному графическому представлению данных, используя docker stats, но для более сложных показаний требуется Docker API или ручная проверка группы управления.

Вы также можете перечислить запущенные процессы контейнера, но команда docker top не дает никаких указаний на показатели ресурсов. Это означает, что он имеет ограниченное применение при проверке того, почему контейнер занимает слишком много ресурсов ЦП или памяти. Вам нужно будет подключиться к нему вручную и осмотреть изнутри.

Инструменты Docker нацелены на общий мониторинг и наблюдаемость, а не на детальную проверку для облегчения решения проблем. В большинстве случаев их вполне достаточно, но хорошее знание более широких инструментов мониторинга Linux, которые работают внутри контейнеров, будет более эффективным при решении проблем.