Главная/Observability и диагностика/Обзор

Раздел 13. Observability и диагностика

Диагностика в контейнеризованной среде отличается от обычной не сложностью, а тем, что привычные инструменты находятся не там, где ожидается. Процесс виден на host, но с другим PID. Логов в /var/log нет. ping в образе не установлен. Файловая система приложения существует, но её путь неочевиден. Сеть работает, но localhost означает не то, что раньше.

Раздел даёт две вещи: набор инструментов и — важнее — методику. Методика превращает диагностику из перебора гипотез в последовательность проверок, каждая из которых сужает область поиска. Именно она отличает инженера от человека, который «перезапустил, и заработало».

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

Цели обучения

После раздела учащийся сможет:

  • объяснить, как Docker собирает и хранит логи container, и настроить logging driver;
  • читать логи осознанно: фильтрация по времени, хвост, метки времени, поток stderr;
  • извлекать нужные поля из docker inspect через --format;
  • использовать docker events для наблюдения за происходящим в реальном времени;
  • интерпретировать docker stats и docker top и понимать, откуда берутся эти цифры;
  • диагностировать нехватку ресурсов: OOM killer, exit code 137, 143, throttling CPU;
  • находить причину restart loop и failing healthcheck;
  • находить, что заняло дисковое пространство, и безопасно освобождать его;
  • читать логи Docker daemon через journalctl;
  • применять nsenter для входа в namespaces container, strace и tcpdump для глубокой диагностики;
  • переходить от симптома к root cause по воспроизводимой методике.

Предварительные знания

Материалы

  1. Логи и logging drivers
    Путь лога от stdout процесса до docker logs. Драйверы json-file, local, journald, syslog и их различия. Ротация логов и почему без неё диск заканчивается. Настройка в daemon.json и на уровне container. Ограничения docker logs при разных драйверах. Логи в Compose.

  2. Inspect, events, stats
    Полная структура docker inspect и извлечение полей через --format. docker events с фильтрами: наблюдение за стартами, остановками, health-переходами и OOM. docker stats: что означает каждая колонка и почему MEM USAGE отличается от того, что показывает приложение. docker top и соответствие процессам на host.

  3. Нехватка ресурсов
    OOM killer: как принимает решение, где оставляет след, как его найти. Exit code 137 и его двойное толкование. Exit code 143. CPU throttling и его диагностика через cgroup-статистику. Исчерпание PID limit и файловых дескрипторов. Диагностика утечки памяти в Python-приложении.

  4. Дисковое пространство и очистка
    docker system df и df -v: где именно расходуется место. Образы, слои, контейнеры, volumes, build cache, логи. Безопасная очистка по категориям с предварительным просмотром. Разбор опасных вариантов prune и того, что именно они удаляют безвозвратно. Настройка автоматических ограничений.

  5. Глубокая диагностика
    Логи daemon через journalctl -u docker.service. nsenter для входа в namespaces без изменения образа. Диагностика container без shell. strace для анализа системных вызовов, tcpdump для анализа трафика — как дополнительные инструменты с указанием требуемых привилегий. Поиск файловой системы container на host.

  6. Таблица диагностики
    Более двадцати типичных проблем в формате «симптом → возможная причина → проверка → исправление». Структурировано по подсистемам: запуск, логи, сеть, storage, ресурсы, сборка. Основной справочный материал раздела.

  7. Практические задания
    Лабораторные задания раздела с проверкой результата.

Рекомендуемый порядок чтения

Последовательный: 01 → 02 → 03 → 04 → 05 → 06 → exercises.

Урок 06 — справочник. Прочитайте его один раз целиком, чтобы знать состав, и возвращайтесь по мере необходимости.

После этого раздела переходите к debugging challenges — 20 сломанных конфигураций, где методика применяется на практике.

Практические задания

ЗаданиеТип
1Настроить ротацию логов и проверить, что размер файла ограниченобяз.
2Извлечь через docker inspect --format пять разных полей одной командойобяз.
3Воспроизвести OOM kill, найти след в docker events и в логах ядраобяз.
4Найти, что занимает больше всего места в Docker data, и освободить его безопаснообяз.
5Войти в namespaces работающего container через nsenter и выполнить диагностику сетиобяз.
6Наблюдать за health-переходами через docker events во время старта stackдоп.
7Продиагностировать CPU throttling через cgroup-статистикудоп.
8Провести диагностику container, в образе которого нет shellдоп.
9Сервис перезапускается каждые 40 секунд. Найти причину, не изменяя приложениедиаг.
10Диск заполнен на 95 %, Docker занимает 60 GB. Составить план освобождения с оценкой рисков

Полные формулировки — в exercises.md.

Критерии завершения раздела

Раздел пройден, когда учащийся может без подсказок:

  1. Объяснить, почему логи приложения не должны писаться в файл внутри container.
  2. Найти причину exit code 137 и отличить OOM от внешнего SIGKILL.
  3. Определить, что занимает дисковое пространство, и очистить его без потери нужных данных.
  4. Продиагностировать недоступный сервис за пять шагов, не угадывая.
  5. Войти в сетевой namespace container и посмотреть его сокеты, не устанавливая ничего в образ.
  6. Объяснить, почему docker stats показывает объём памяти, отличающийся от метрик приложения.

Проверьте себя: Quiz 13 и debugging challenges.

Что дальше

Мы умеем строить, защищать и чинить. Следующий раздел — о доставке: как образ попадает с машины разработчика туда, где он будет запущен.

Навигация

← Предыдущий раздел: Security
Вернуться к главному оглавлению
Следующий раздел: Registry →

Markdown на GitHub ↗