Агент Docker
Агент Docker от Status200 — это один контейнер, который запускается на Docker-хосте. Он читает статистику и файлы логов каждого контейнера на хосте и отправляет их в Status200, где хост появляется со своими контейнерами, метриками и логами. Второй контейнер, ИИ-агент Docker, позволяет Status200 AI расследовать проблемы на хосте. Мониторы Docker оповещают о том, что отправляет агент.
docker run или Docker Compose.Что собирает агентМетрики, логи и инвентарь каждого контейнера.Для логов контейнеров нужен json-fileПроверка и смена драйвера логов контейнера.Устранение неполадокЦиклы перезапусков, отсутствующие метрики, отсутствующие логи.Как это работает
Агент — это OpenTelemetry Collector со встроенной конфигурацией Status200. Через сокет Docker он читает статистику каждого контейнера каждые 30 секунд и каждые 5 минут перечисляет все контейнеры, образы, сети и тома. Он следит за файлами логов контейнеров и отправляет всё на ваш URL Status200 по OTLP с ключом приёма, который вы ему передаёте.
Два контейнера на вашем Docker-хосте
Хост регистрируется по своим первым данным под именем, которое вы задаёте в DOCKER_HOST_NAME. ИИ-агент необязателен: если его не устанавливать, коллектор работает так же.
Перед началом
- Docker Engine 20.10 или новее и доступ root на хосте: агент читает
/var/run/docker.sock. - Docker Compose v2 (команда
docker compose), если вы устанавливаете через Docker Compose. - Ключ приёма. Создайте его в разделе Настройки проекта → Телеметрия и APM → Ключи приема и скопируйте значение.
- Исходящий HTTPS с хоста на ваш URL Status200.
- Для логов контейнеров — контейнеры, которые используют драйвер логов Docker
json-file, используемый Docker по умолчанию. См. Для логов контейнеров нужен драйвер логов json-file.
Установка агента
Запустите агент
Замените
YOUR_STATUS200_URLсвоим URL Status200,YOUR_TELEMETRY_INGESTION_TOKEN— ключом приёма, аmy-docker-host— именем этого хоста, напримерprod-docker-01. Под этим именем хост появится в Status200, поэтому не меняйте его: новое имя регистрирует новый хост.Docker CLI
docker run -d \ --name status200-docker-agent \ --user 0:0 \ --restart unless-stopped \ -v /var/run/docker.sock:/var/run/docker.sock:ro \ -v /var/lib/docker/containers:/var/lib/docker/containers:ro \ -e STATUS200_URL="YOUR_STATUS200_URL" \ -e STATUS200_SERVICE_TOKEN="YOUR_TELEMETRY_INGESTION_TOKEN" \ -e DOCKER_HOST_NAME="my-docker-host" \ status200/docker-agent:releaseЗатем рядом запустите ИИ-агент с теми же значениями. ИИ-расследования включены по умолчанию: пока Status200 AI расследует инцидент или оповещение на этом хосте, он выполняет через ИИ-агент команды
dockerтолько для чтения и ничего не меняет, если вы не разрешите исправления. Чтобы установить без ИИ-расследований, пропустите эту команду.docker run -d \ --name status200-docker-ai-agent \ --user 0:0 \ --restart unless-stopped \ --read-only --tmpfs /tmp \ -v /var/run/docker.sock:/var/run/docker.sock:ro \ -e STATUS200_URL="YOUR_STATUS200_URL" \ -e STATUS200_SERVICE_TOKEN="YOUR_TELEMETRY_INGESTION_TOKEN" \ -e STATUS200_AI_AGENT_RESOURCE_TYPE=docker \ -e DOCKER_HOST_NAME="my-docker-host" \ status200/resource-ai-agent:releaseDocker Compose
Сохраните это как
docker-compose.ymlв папке на хосте. Второй сервис — ИИ-агент: уберите его, чтобы запускать коллектор без ИИ-расследований.services: status200-docker-agent: image: status200/docker-agent:release container_name: status200-docker-agent user: "0:0" restart: unless-stopped volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - /var/lib/docker/containers:/var/lib/docker/containers:ro environment: - STATUS200_URL=YOUR_STATUS200_URL - STATUS200_SERVICE_TOKEN=YOUR_TELEMETRY_INGESTION_TOKEN - DOCKER_HOST_NAME=my-docker-host logging: driver: json-file options: max-size: "10m" max-file: "3" status200-docker-ai-agent: image: status200/resource-ai-agent:release container_name: status200-docker-ai-agent user: "0:0" restart: unless-stopped read_only: true tmpfs: - /tmp volumes: - /var/run/docker.sock:/var/run/docker.sock:ro environment: - STATUS200_URL=YOUR_STATUS200_URL - STATUS200_SERVICE_TOKEN=YOUR_TELEMETRY_INGESTION_TOKEN - STATUS200_AI_AGENT_RESOURCE_TYPE=docker - DOCKER_HOST_NAME=my-docker-hostЗапустите его в этой папке:
docker compose up -dУбедитесь, что агент работает
docker ps --filter name=status200-docker-agent docker logs -f status200-docker-agentКогда коллектор запустится, в логах должна появиться такая строка:
Everything is ready. Begin running and processing data.Найдите хост в Status200
Откройте Продукты → Инфраструктура → Docker → Все хосты. Хост появится под своим
DOCKER_HOST_NAMEпримерно через минуту, со своими контейнерами, метриками и логами. ИИ-агент отображается как подключённый на странице хоста ИИ-агент и внизу его страницы Обзор. Страница Топология хоста рисует его проекты Compose, контейнеры, образы, сети и тома на одной карте: см. Топология.
Переменные окружения
| Переменная | Обязательна | Описание |
|---|---|---|
STATUS200_URL | Да | Ваш URL Status200, например https://status200.ru, или ваш собственный экземпляр. Если экземпляр работает только по HTTP, используйте http:// и его порт. |
STATUS200_SERVICE_TOKEN | Да | Ключ приёма из раздела Настройки проекта → Телеметрия и APM → Ключи приема. |
DOCKER_HOST_NAME | Нет | Имя хоста в Status200. По умолчанию docker-host, поэтому дайте каждому хосту своё. |
DOCKER_API_VERSION | Нет | Версия API Docker Engine, на которой работает агент. По умолчанию 1.44. Понизьте её для старого демона или задайте пустое значение, чтобы согласовать её с демоном (см. Устранение неполадок). |
Чтобы изменить значение, удалите агент и снова выполните его команду (Docker CLI) или отредактируйте docker-compose.yml и выполните docker compose up -d (Docker Compose).
Что собирает агент
| Данные | Что это |
|---|---|
| Метрики контейнеров | CPU (использование, процент, троттлинг), память (использование, лимит, процент), сетевой и блочный ввод-вывод, время работы, перезапуски и число процессов по каждому контейнеру каждые 30 секунд. |
| Логи контейнеров | stdout и stderr каждого контейнера из его файла лога json-file. |
| Инвентарь | Все контейнеры в любом состоянии, а также все образы, сети и тома каждые 5 минут. |
Метрики и логи каждого контейнера хранятся под сервисом, названным по имени контейнера. Каждая строка лога получает важность по уровню, который в ней указан, например [ERROR], level=warn или {"level":"info"}; строка без уровня получает важность своего потока: stderr — ERROR, stdout — INFO. Строки, начинающиеся с пробела или закрывающей скобки, присоединяются к предыдущей строке, поэтому трассировка стека приходит одной записью. Собственные логи агента не отправляются.
Мониторинг Docker перечисляет все метрики и объясняет их значение.
Для логов контейнеров нужен драйвер логов json-file
Агент следит за /var/lib/docker/containers/*/*-json.log — файлами, которые пишет драйвер логов Docker json-file. Контейнер с другим драйвером не оставляет файла для чтения: local пишет двоичные файлы, а journald, syslog, fluentd и gelf отправляют логи в другое место. Его метрики по-прежнему поступают, а логи — нет.
Проверьте драйвер логов контейнера и значение по умолчанию у демона:
docker inspect <container> --format '{{.HostConfig.LogConfig.Type}}'
docker info --format '{{.LoggingDriver}}'Переведите сервис Compose на json-file с ротацией:
services:
my-app:
image: my-app:latest
logging:
driver: "json-file"
options:
max-size: "100m"
max-file: "5"Или сделайте его значением по умолчанию для всех контейнеров, создаваемых после этого, в /etc/docker/daemon.json:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "5"
}
}Затем перезапустите Docker и пересоздайте контейнеры. Контейнер сохраняет драйвер логов, с которым был создан, поэтому перезапуска недостаточно.
Обновление агента
Когда агент старше вашего Status200, рядом с Версия агента на странице хоста Обзор появляется предупреждающий значок. Нажмите на него, чтобы увидеть эти команды.
Docker CLI
docker pull status200/docker-agent:release
docker pull status200/resource-ai-agent:release
docker rm -f status200-docker-agent status200-docker-ai-agentЗатем снова выполните обе команды docker run из раздела Запустите агент.
Docker Compose
docker compose pull
docker compose up -dТег release всегда указывает на новейший выпуск. Чтобы закрепить версию, используйте status200/docker-agent:<version>, например status200/docker-agent:10.0.31. Тот же образ есть в GitHub Container Registry как ghcr.io/status200/docker-agent:release.
Удаление агента
Docker CLI
docker rm -f status200-docker-agent
docker rm -f status200-docker-ai-agentDocker Compose
docker compose downХост остаётся в Status200 с отправленными данными. Если он больше не нужен, удалите его через Удалить хост в его меню.
ИИ-агент
Команды и файл Compose выше, install.sh агента Docker и docker-compose.yml в его [каталоге DockerAgent](<YOUR_STATUS200_URL>/docs/static/scripts/agents/DockerAgent) запускают ИИ-агент Docker: второй контейнер, status200-docker-ai-agent (образ status200/resource-ai-agent:release), который выполняет команды docker только для чтения, запрашиваемые Status200 AI при расследовании инцидента или оповещения на этом хосте, — docker ps -a, docker logs --tail 200 web, docker container inspect web, docker stats --no-stream — и, только если вы это разрешите, применяет исправления, например перезапуск указанного контейнера. Он читает те же STATUS200_URL, STATUS200_SERVICE_TOKEN и DOCKER_HOST_NAME, что и коллектор, поэтому обслуживает ровно этот хост и появляется на странице хоста ИИ-агент в Status200.
- ИИ-расследования включены по умолчанию. Как только агент подключается, Status200 AI расследует с его помощью инциденты и оповещения на этом хосте, а страница Обзор хоста показывает статус агента. Чтобы отключить это, задайте
STATUS200_AI_INVESTIGATION=falseтам, где работает агент (как это сделать, показывает Изменить в разделе Что может делать ИИ на странице ИИ-агента), или не устанавливайте агента. - Он работает только для чтения, если вы не запустите его с
STATUS200_AI_ALLOW_WRITES=true;STATUS200_AI_WRITE_TARGETS(например,web-*,api-*) ограничивает, какие контейнеры может затрагивать исправление. Запустите его также сSTATUS200_AI_FIXES, чтобы задать, как выполняются исправления, —ask-for-approval(каждое одобряет человек),automaticилиbypass-approval, — а страница ИИ-агента покажет это только для чтения (Что может делать ИИ, задаётся агентом). - Он работает от root со смонтированным сокетом Docker, потому что сокет принадлежит root, — а тот, кто может пользоваться сокетом, является root на этом хосте, с
:roили без. Границу задаёт политика команд агента: он никогда не выполняетexec,run,rmилиpruneи никогда не изменяет себя, коллектор или что-либо изSTATUS200_AI_PROTECTED_TARGETS(glob-шаблоны имён контейнеров). Значения окружения в выводеdocker inspectмаскируются до того, как что-либо покинет хост. install.sh --no-ai-agentне устанавливает его;docker rm -f status200-docker-ai-agentудаляет его. Обновляйте его так же, как коллектор:docker pull status200/resource-ai-agent:release, удалите и запустите снова.
Что он может запускать, как работают исправления и как устранять неполадки: Infrastructure AI Agents.
Устранение неполадок
Агент перезапускается с ошибкой "client version is too new"
Логи агента показывают:
Error: cannot start pipelines: failed to start "docker_stats" receiver:
Error response from daemon: client version 1.44 is too new.
Maximum supported API version is 1.41Демон отклоняет клиента новее собственного максимума, поэтому приёмник так и не запускается, а вместе с ним завершается и коллектор. Узнайте максимум демона:
docker version --format '{{ .Server.APIVersion }}'Затем добавьте -e DOCKER_API_VERSION=1.41 (или полученное значение) в docker run или задайте DOCKER_API_VERSION в Compose. Новые демоны по-прежнему поддерживают старые версии API, поэтому настройка остаётся верной и после обновления.
Не хотите искать номер? Задайте DOCKER_API_VERSION пустой строкой. Тогда агент согласует версию с демоном (один HEAD /_ping, затем собственный максимум демона), что работает и со старыми, и с новыми демонами:
docker run -d ... -e DOCKER_API_VERSION= ...Отказ в доступе к сокету Docker
Чтобы читать /var/run/docker.sock, агент должен работать от root. Проверьте, что в вашей команде docker run есть --user 0:0 или в Compose — user: "0:0".
Хост отображается как отключённый
- Проверьте, что агент работает:
docker ps --filter name=status200-docker-agent - Поищите ошибки в его логах:
docker logs status200-docker-agent 2>&1 | grep -i error - Проверьте
STATUS200_URLиSTATUS200_SERVICE_TOKEN: ключ должен быть действительным ключом приёма, который не отключён. - Проверьте, что хост может достучаться до вашего URL Status200 по сети.
Метрики не появляются
- Проверьте, что сокет Docker смонтирован в агент. В его образе нет оболочки, поэтому посмотрите из временного контейнера, который использует те же точки монтирования:
docker run --rm --volumes-from status200-docker-agent alpine:3.19 ls -la /var/run/docker.sock - Поищите ошибки экспорта в его логах:
docker logs status200-docker-agent 2>&1 | tail -100 - Проверьте, что ключ приёма действителен и не истёк.
CPU контейнеров – ровная линия
Старый агент отправляет значение CPU, которое вычисляет сам приёмник docker_stats. Начиная с коллектора 0.150.0 приёмник вычисляет его по одному снимку статистики: всё процессорное время, которое контейнер использовал с момента запуска, делённое на всё процессорное время, которое хост использовал с момента загрузки. Линия почти не двигается и не следует за нагрузкой, а container.cpu.usage.total следует. Обновите агент: начиная со второго измерения он отправляет CPU, которое каждый контейнер использовал за каждый 30-секундный интервал. Уже сохранённые измерения остаются как были.
Метрики поступают, но логов контейнеров нет
Скорее всего, ваши контейнеры используют драйвер логов, отличный от json-file. Проверьте, за какими файлами следит агент и какой драйвер использует контейнер:
docker logs status200-docker-agent 2>&1 | grep -E "Started watching file|no files match"
docker inspect <container> --format '{{.HostConfig.LogConfig.Type}}'Если агент сообщает no files match the configured criteria, переведите контейнеры на json-file и пересоздайте их, как показано в разделе Для логов контейнеров нужен драйвер логов json-file.
Логи попадают на другой хост, или хост называется docker-host
Имя хоста берётся из DOCKER_HOST_NAME. Агент, запущенный без этой переменной, сообщает docker-host, поэтому все хосты, настроенные так, выглядят как один; если позже изменить имя, Status200 зарегистрирует второй хост, и новые данные будут в нём. Задайте DOCKER_HOST_NAME своё имя на каждом хосте и пересоздайте агента. Чтобы проверить имя, которое сообщает агент:
docker inspect status200-docker-agent --format '{{range .Config.Env}}{{println .}}{{end}}' | grep DOCKER_HOST_NAME