Почему PID у первого процесса в Docker-контейнере равен 1

«Почему PID у первого процесса в Docker-контейнере равен 1» — вопрос из категории Docker, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

PID (Process ID) первого процесса внутри контейнера равен 1 из-за механизма PID namespace, который обеспечивает изоляцию процессов.

Технические детали:

  1. Изолированное пространство PID: Каждый контейнер получает собственный набор PID, начинающийся с 1. Процессы хостовой системы и других контейнеров в этом namespace не видны.
  2. Особая роль PID 1: В Linux процесс с PID 1 — это init. Он отвечает за обработку сигналов (например, SIGTERM при docker stop) и перезапуск осиротевших процессов (zombie reaping).
  3. Последствия для Docker: Если ваш ENTRYPOINT/CMD (например, простой скрипт) становится PID 1, он должен корректно обрабатывать сигналы завершения, иначе контейнер не остановится gracefully.

Практический пример и проверка:

# Запускаем контейнер и смотрим его PID namespace
$ docker run -d --name test alpine sh -c 'sleep 3600'
$ docker exec test ps aux
PID   USER     TIME  COMMAND
1     root      0:00  sleep 3600  # PID внутри контейнера = 1

# На хосте у этого же процесса будет совершенно другой PID
$ ps aux | grep 'sleep 3600'
root     12345  0.0  0.0   1234  678 ?        Ss   14:30   0:00 sleep 3600

Рекомендация для продакшена: Для сложных приложений используйте --init флаг или легковесные init-системы внутри контейнера (например, tini), чтобы гарантировать правильную обработку сигналов и дочерних процессов.