Логи и мониторинг контейнеров
Контейнер, за которым не следят, однажды молча упадёт или сожрёт весь диск логами. Настраиваем чтение логов, ротацию и мониторинг ресурсов — без тяжёлых стеков.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Чтение логов
Базовый инструмент — docker logs. Смотрим последние строки и следим в реальном времени:
docker logs --tail 100 -f app
Часто нужен диапазон по времени — например, что было за последний час:
docker logs --since 1h --timestamps app
Если контейнеров много, удобнее compose — он покажет логи всего стека сразу, с цветной разбивкой по сервисам:
docker compose logs -f --tail 50
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.
Арендовать VPS для DockerРотация логов
По умолчанию Docker пишет логи в JSON-файлы, которые растут бесконечно. Болтливый контейнер способен забить весь диск за сутки. Лечится ротацией в /etc/docker/daemon.json:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
После правки перезапустите демон:
systemctl restart docker
Теперь каждый контейнер хранит максимум 3 файла по 10 МБ. Проверить, где физически лежат логи и сколько весят:
du -sh /var/lib/docker/containers/*/*-json.log
На NVMe-дисках MAATRIX запись логов не создаёт I/O-затыков, но дисциплина ротации всё равно обязательна — место не резиновое.
Мониторинг ресурсов
Живая картина потребления CPU, памяти, сети и диска по каждому контейнеру:
docker stats
Для скриптов и алертов удобен разовый снимок в нужном формате:
docker stats --no-stream \
--format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"
Проверить состояние и код выхода упавшего контейнера:
docker inspect --format '{{.State.Status}} {{.State.ExitCode}}' app
Healthcheck
Мониторинг ресурсов не скажет, что приложение внутри зависло, а процесс жив. Для этого — healthcheck. Docker сам будет проверять сервис и помечать контейнер как unhealthy:
services:
app:
image: myapp:1.0
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
interval: 30s
timeout: 5s
retries: 3
Статус проверок виден в docker ps в колонке STATUS — например, Up 2 hours (healthy). На это можно повесить автоперезапуск или алерт.
Лёгкий мониторинг: Dozzle
Не хотите тянуть тяжёлый стек Prometheus + Grafana ради одного VPS? Dozzle даёт веб-интерфейс логов всех контейнеров в реальном времени, весит копейки:
docker run -d --name dozzle \
--restart unless-stopped \
-v /var/run/docker.sock:/var/run/docker.sock \
-p 127.0.0.1:8888:8080 \
amir20/dozzle
Пробросьте порт через nginx с basic-auth — и у вас удобный дашборд логов без базы данных и настройки экспортеров.
Частые ошибки
- Логи не ротируются — диск заполнен на 100%, контейнеры падают. Всегда настраивайте max-size и max-file.
- Приложение пишет логи в файл внутри контейнера, а не в stdout — тогда
docker logsпуст. Приучите сервис писать в stdout/stderr. - Нет healthcheck — контейнер «жив», но не отвечает, и вы узнаёте об этом от пользователей.
- Следите за диском:
df -h. Ежедневные бэкапы MAATRIX спасут данные, но переполненный диск всё равно уронит сервис.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США и РФ. Оплата картой РФ и по СБП.
Арендовать VPS для DockerОбсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Частые вопросы
Почему docker logs ничего не показывает?
Скорее всего, приложение пишет логи в файл внутри контейнера, а не в stdout/stderr. Docker собирает только стандартные потоки. Настройте вывод приложения в stdout.
Как не дать логам забить диск?
Настройте ротацию в /etc/docker/daemon.json через log-opts max-size и max-file, затем перезапустите демон. Так каждый контейнер ограничен по объёму логов.
Нужен ли Prometheus для маленького VPS?
Не обязательно. Для одного-двух серверов хватит docker stats, healthcheck и лёгкого Dozzle. Тяжёлый стек мониторинга оправдан, когда серверов много.