Раздел 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.
Предварительные знания
- Раздел 02. Основы Containerization — процессы и изоляция;
- Раздел 03. Работа с Images — откуда берётся файловая система;
- понимание сигналов в Linux хотя бы на уровне
kill -9; - понимание stdin, stdout, stderr и exit code.
Материалы
-
Состояния и переходы
Полный граф состояний:created,running,paused,restarting,exited,dead. Командыcreate,start,run,stop,kill,restart,pause,unpause,rm,wait. Что удаляется приrm, а что остаётся. -
Режимы запуска
Foreground и detached,-d,--rm,-i,-tи их комбинации. Стандартные потоки container. Почемуdocker run -itработает, аdocker run -tбез-i— нет. Именование containers и автогенерируемые имена. -
Exec, logs, inspect
Вход в работающий container черезexec, отличие отattachи почемуattachопасен. Чтение логов:--follow,--tail,--since,--timestamps. Метрики черезstatsиtop. Полное состояние черезinspectи извлечение конкретных полей через--format. -
Сигналы и graceful shutdown
Что делаетdocker stop:SIGTERM, grace period,SIGKILL. Отличие отdocker kill.STOPSIGNAL, флаг--time. Почему приложение не получает сигнал при shell form вDockerfile. Реализация корректного завершения. -
PID 1 и init
Особый статус PID 1 в Linux: игнорирование сигналов без обработчика, обязанность собирать осиротевшие процессы. Zombie processes: как возникают и чем вредны. Флаг--initиtini. Когда init-процесс нужен, а когда избыточен. -
Restart policies и exit codes
Политикиno,on-failure,always,unless-stoppedи их различия при перезапуске daemon. Таблица exit codes с расшифровкой. Диагностика restart loop. Взаимодействие restart policy с--rm. -
Практические задания
Лабораторные задания раздела с проверкой результата.
Рекомендуемый порядок чтения
Последовательный: 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 и проверить её поведение | доп. |
| 8 | Container останавливается ровно 10 секунд при каждом docker stop. Найти причину и исправить | диаг. |
| 9 | Извлечь через docker inspect --format IP-адрес, exit code и время старта одной командой | ★ |
Полные формулировки — в exercises.md.
Критерии завершения раздела
Раздел пройден, когда учащийся может без подсказок:
- Объяснить, почему container завершается сразу после
docker run ubuntu. - Назвать точную последовательность действий Docker при
docker stopс указанием сигналов и таймаута. - Объяснить, почему
CMD python app.py(shell form) может помешать доставкеSIGTERMприложению. - Расшифровать exit codes
137и143и назвать причину каждого. - Объяснить, чем PID 1 отличается от обычного процесса, и когда это создаёт проблему.
- Выбрать restart policy для трёх разных задач: web-сервис, разовая миграция, worker очереди.
Проверьте себя: Quiz 04 и Checkpoint 1.
Что дальше
До сих пор мы использовали готовые образы. Следующий раздел учит собирать свои.
Навигация
← Предыдущий раздел: Работа с Images
Вернуться к главному оглавлению
Следующий раздел: Dockerfile →