Мониторинг Docker Compose
Мониторинг Docker Compose в Наблюдателе работает через агента — ещё один сервис в вашем docker-compose.yml. Агент сам находит контейнеры своего compose-проекта и раз в 30 секунд отправляет их метрики и статусы: CPU, память, сеть, диск, тома, health-проверки, рестарты, OOM и коды выхода. В приложениях ничего менять не нужно.
Установка занимает пару минут: создать стек, скопировать сервис агента из кабинета, выполнить одну команду.
Как установить агента в Docker Compose
- Откройте проект в кабинете и добавьте стек (кнопка «Добавить»). Стек — это одно окружение: один compose-проект.
- На странице стека нажмите кнопку «Агент» → «Создать агента». Введите название и нажмите «Создать».
- В окне «Агент создан» в блоке «Где работает стек» выберите «Docker Compose» и скопируйте «Сервис для docker-compose.yml».
- Вставьте сервис в
docker-compose.ymlрядом с вашими сервисами и запустите его.
Важно. Токен агента показывается один раз. Сохраните его сразу — посмотреть его ещё раз нельзя, можно только выпустить новый.
Сервис, который выдаёт кабинет, выглядит так:
services:
nabl-agent:
image: velgir/nabl-agent:latest
restart: unless-stopped
# Как requests/limits в манифесте Kubernetes: агент не отнимет ресурсы у приложения.
mem_limit: 256m
cpus: 1
environment:
NABL_AGENT_TOKEN: <ТОКЕН_АГЕНТА>
NABL_BASE_URL: https://app.nablops.io
NABL_INTERVAL: 30
NABL_OTLP_ENABLED: "true"
NABL_OTLP_GRPC_ADDR: "0.0.0.0:4317"
NABL_OTLP_HTTP_ADDR: "0.0.0.0:4318"
NABL_AGENT_CAPTURE_HTTP_ADDR: "0.0.0.0:4319"
expose:
- "4317"
- "4318"
- "4319"
volumes:
- /var/run/docker.sock:/var/run/docker.sockЕсли в вашем файле уже есть раздел services:, добавьте в него только блок nabl-agent. Затем выполните в каталоге с docker-compose.yml:
docker compose up -d nabl-agentЧто важно в сервисе:
| Параметр | Зачем |
|---|---|
/var/run/docker.sock |
Обязателен. Через Docker API агент видит контейнеры, их статистику и логи. |
NABL_AGENT_TOKEN |
Токен агента из кабинета. |
NABL_BASE_URL |
Адрес Наблюдателя: https://app.nablops.io. |
NABL_INTERVAL |
Как часто отправлять данные, в секундах. По умолчанию 30. |
NABL_OTLP_ENABLED и порты 4317, 4318 |
Приём трасс OpenTelemetry от ваших сервисов (gRPC и HTTP). |
| порт 4319 | Приём событий и логов приложения (POST /v1/log). |
mem_limit: 256m, cpus: 1 |
Ограничения агента. На больших стеках память можно поднять. |
Порты указаны в expose, а не в ports: публиковать их наружу не нужно. Ваши сервисы обращаются к агенту по имени nabl-agent во внутренней сети compose.
Токен — в файл .env
Чтобы токен не попал в git, вынесите его в .env рядом с docker-compose.yml:
environment:
NABL_AGENT_TOKEN: ${NABL_AGENT_TOKEN}# .env
NABL_AGENT_TOKEN=<ТОКЕН_АГЕНТА>Если у сервисов свои сети
Если в compose у приложений заданы свои networks:, добавьте агента в те же сети. Иначе метрики контейнеров будут приходить, но трассы и события от приложений до агента не дойдут.
nabl-agent:
# …
networks:
- backendВерсия образа в production
latest удобен для старта. В production закрепите версию: тегом (velgir/nabl-agent:0.14.1) или по digest (velgir/nabl-agent@sha256:…). Как обновлять — в статье Обновление агента и токен.
Как проверить, что данные пошли
Окно в кабинете показывает «Ждём первое подключение агента…», а после первой отправки — «Агент на связи — данные начали поступать». Обычно это занимает до 30 секунд.
Если окно уже закрыто, проверьте сами:
docker compose logs -f nabl-agentВ логе должна быть строка запуска с версией и режимом, например nabl-agent 0.14.1 mode=compose …, и строка mode auto: detected compose project="…" с именем вашего проекта. Строк с 401 и config: быть не должно.
В кабинете:
- на странице стека появилась вкладка «Контейнеры» со списком сервисов;
- в разделе «Агенты» у агента статус «Активен» и свежее время последней отправки.
Что собирает агент Docker Compose
Агент собирает данные сам, без изменений в коде приложений.
| Что | Подробности |
|---|---|
| CPU | загрузка контейнера, лимит CPU и доля времени, когда контейнер упирался в лимит (throttling) |
| Память | использование и лимит контейнера |
| Сеть | входящий и исходящий трафик |
| Диск | чтение и запись (I/O), размер слоя контейнера |
| Тома | размер именованных томов, какие тома подключены к контейнеру |
| Базы данных | размер баз postgres, mysql/mariadb, mongo, redis/valkey, clickhouse |
| Статусы | состояние контейнера, health-проверка и сколько раз подряд она не прошла |
| Сбои | рестарты, OOM (контейнер убит из-за нехватки памяти), код выхода |
| Прочее | число процессов, опубликованные порты, образ контейнера |
| Ошибки | ошибки и исключения из stdout/stderr — во вкладке «Ошибки» |
Полные логи контейнеров Наблюдатель не хранит. Агент читает stdout/stderr и отправляет только распознанные ошибки. Весь лог можно смотреть вживую, пока он открыт в кабинете, — см. Живые логи. Если логи нужно хранить и искать, отправляйте их как события и логи.
С агентом 0.12 по смене образа в ленте стека появляется событие обновления, а с 0.13 — даже если образ тот же, но поменялась конфигурация сервиса.
Размер баз. Раз в 3 минуты агент выполняет в контейнерах баз короткий запрос только на чтение, чтобы узнать их размер. Если это нежелательно, добавьте агенту
NABL_DB_SIZE_PROBE: "false"(агент 0.8.1+) — пропадёт только размер баз. Подробнее — в статье Как работает агент.
Что делать с этими данными дальше — смотреть графики во вкладке «Контейнеры» и настроить уведомления о падениях, OOM и нехватке памяти.
Несколько compose-проектов на одном сервере
Агент видит только контейнеры своего compose-проекта — тех, у кого та же метка com.docker.compose.project. Имя проекта по умолчанию — имя каталога с docker-compose.yml, его можно задать флагом -p или переменной COMPOSE_PROJECT_NAME.
Поэтому:
- Каждому compose-проекту — свой стек и свой агент. Например,
shopиblogв разных каталогах на одной машине — это два стека в Наблюдателе и два сервисаnabl-agent, каждый в своёмdocker-compose.ymlсо своим токеном. - Один проект из нескольких файлов (
docker compose -f base.yml -f prod.yml) — это один проект: достаточно одного агента в любом из файлов. - Метрики самого сервера (диски, CPU хоста, swap) compose-агент не собирает. Для них поставьте на ту же машину агента сервера. Оба агента работают независимо, а стек с сервером Наблюдатель свяжет сам. С агентами 0.14 агент сервера ещё и видит сетевые соединения контейнеров — на карте появятся связи с сервисами без трассировки.
Частые ошибки
| Симптом | Причина и что делать |
|---|---|
В логе агента 401 или «токен отклонён» |
Токен неверный, перевыпущен или агент удалён в кабинете. Выпустите новый токен и замените его в environment — см. Обновление агента и токен. С агентом 0.9.2+ после отказа он ждёт 5 минут и пишет причину в лог. |
| Агент работает, но вкладка «Контейнеры» пуста | Не смонтирован /var/run/docker.sock, или агент запущен через docker run, а не в compose: тогда он не определяет проект. |
| Видны не все сервисы | Часть сервисов в другом compose-проекте: другой каталог или другое имя -p. Для них нужен свой стек и агент. |
config: и задайте NABL_AGENT_TOKEN в логе |
Не задан токен или адрес. Агент повторяет попытку каждые 30 секунд — допишите переменные и перезапустите сервис. |
| Нет связи с Наблюдателем | Контейнер не может открыть https://app.nablops.io: прокси, DNS или firewall. Агенту нужен исходящий HTTPS. |
| Метрики есть, а трассы и события не приходят | Агент не в той же сети, что приложения, или приложение шлёт не на nabl-agent. |
| Агент перезапускается из-за нехватки памяти | Большой стек или много трасс. Поднимите mem_limit. |
Если причина не нашлась — загляните в решение проблем.
Совет. ИИ-ассистент через MCP может создать стек, выдать готовый сервис агента и проверить, что данные пошли. См. ИИ-ассистент.
Как удалить агента
Удалите сервис nabl-agent из docker-compose.yml и выполните:
docker compose up -d --remove-orphansЗатем удалите агента в кабинете в разделе «Агенты», чтобы его токен перестал действовать.
Что дальше
- Контейнеры — графики, статусы и рестарты сервисов.
- Ошибки приложений — что агент находит в логах.
- Трассировка — подключить OpenTelemetry к агенту.
- Как работает агент — доступы, нагрузка и безопасность.
Первый сервер или стек подключается за пару минут. Бесплатно в раннем доступе.
Нашли неточность или не хватает ответа? Напишите в поддержку