Главная/Containers и lifecycle/Обзор

Раздел 4. Containers и lifecycle

Container существует ровно столько, сколько живёт его главный процесс. Это правило объясняет большинство вопросов новичков: почему container «сразу упал», почему docker stop занимает десять секунд, почему приложение не успевает закрыть соединения с базой и почему exit code 137 появляется без видимой причины.

Раздел проходит полный жизненный цикл: от create и start до stop, kill и rm. Разбираются режимы запуска, работа со стандартными потоками, exec для входа в работающий container, чтение логов и метрик. Затем — самая практически важная часть: обработка сигналов, graceful shutdown, проблема PID 1 и zombie processes.

Материал этого раздела напрямую переиспользуется в разделе 06, где те же механизмы разбираются применительно к Python.

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

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

  • описать все состояния container и переходы между ними;
  • осознанно выбирать между run, create + start, foreground и detached режимами;
  • объяснить, зачем нужны -i и -t по отдельности и что происходит без них;
  • войти в работающий container через exec и объяснить, чем это отличается от attach;
  • читать логи, метрики и полное состояние container через logs, stats, top, inspect;
  • объяснить, что происходит при docker stop: какой сигнал, кому, с каким таймаутом;
  • реализовать graceful shutdown и доказать его работу;
  • объяснить проблему PID 1, распознать zombie processes и применить --init там, где нужно;
  • интерпретировать exit codes, в том числе 0, 1, 125, 126, 127, 137, 143;
  • выбрать restart policy под конкретную задачу и объяснить её взаимодействие с exit code.

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

Материалы

  1. Состояния и переходы
    Полный граф состояний: created, running, paused, restarting, exited, dead. Команды create, start, run, stop, kill, restart, pause, unpause, rm, wait. Что удаляется при rm, а что остаётся.

  2. Режимы запуска
    Foreground и detached, -d, --rm, -i, -t и их комбинации. Стандартные потоки container. Почему docker run -it работает, а docker run -t без -i — нет. Именование containers и автогенерируемые имена.

  3. Exec, logs, inspect
    Вход в работающий container через exec, отличие от attach и почему attach опасен. Чтение логов: --follow, --tail, --since, --timestamps. Метрики через stats и top. Полное состояние через inspect и извлечение конкретных полей через --format.

  4. Сигналы и graceful shutdown
    Что делает docker stop: SIGTERM, grace period, SIGKILL. Отличие от docker kill. STOPSIGNAL, флаг --time. Почему приложение не получает сигнал при shell form в Dockerfile. Реализация корректного завершения.

  5. PID 1 и init
    Особый статус PID 1 в Linux: игнорирование сигналов без обработчика, обязанность собирать осиротевшие процессы. Zombie processes: как возникают и чем вредны. Флаг --init и tini. Когда init-процесс нужен, а когда избыточен.

  6. Restart policies и exit codes
    Политики no, on-failure, always, unless-stopped и их различия при перезапуске daemon. Таблица exit codes с расшифровкой. Диагностика restart loop. Взаимодействие restart policy с --rm.

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

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

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

Уроки 04 и 05 — самые важные в разделе и самые часто пропускаемые. Именно они объясняют поведение, которое потом воспринимается как «Docker странно себя ведёт».

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

ЗаданиеТип
1Провести container через все состояния и зафиксировать вывод docker ps -a на каждом шагеобяз.
2Запустить долгоживущий container, выполнить в нём команду через exec, объяснить, почему процесс не стал PID 1обяз.
3Написать скрипт, обрабатывающий SIGTERM, и доказать, что docker stop завершает его корректнообяз.
4Сравнить время выполнения docker stop для приложения с обработчиком сигнала и без негообяз.
5Воспроизвести zombie process в container и устранить проблему через --initдоп.
6Получить exit codes 125, 126 и 127 и объяснить причину каждогодоп.
7Настроить restart policy on-failure:3 и проверить её поведениедоп.
8Container останавливается ровно 10 секунд при каждом docker stop. Найти причину и исправитьдиаг.
9Извлечь через docker inspect --format IP-адрес, exit code и время старта одной командой

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

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

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

  1. Объяснить, почему container завершается сразу после docker run ubuntu.
  2. Назвать точную последовательность действий Docker при docker stop с указанием сигналов и таймаута.
  3. Объяснить, почему CMD python app.py (shell form) может помешать доставке SIGTERM приложению.
  4. Расшифровать exit codes 137 и 143 и назвать причину каждого.
  5. Объяснить, чем PID 1 отличается от обычного процесса, и когда это создаёт проблему.
  6. Выбрать restart policy для трёх разных задач: web-сервис, разовая миграция, worker очереди.

Проверьте себя: Quiz 04 и Checkpoint 1.

Что дальше

До сих пор мы использовали готовые образы. Следующий раздел учит собирать свои.

Навигация

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

Markdown на GitHub ↗