Ответ
PID (Process ID) первого процесса внутри контейнера равен 1 из-за механизма PID namespace, который обеспечивает изоляцию процессов.
Технические детали:
- Изолированное пространство PID: Каждый контейнер получает собственный набор PID, начинающийся с 1. Процессы хостовой системы и других контейнеров в этом namespace не видны.
- Особая роль PID 1: В Linux процесс с PID 1 — это
init. Он отвечает за обработку сигналов (например,SIGTERMприdocker stop) и перезапуск осиротевших процессов (zombie reaping). - Последствия для 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), чтобы гарантировать правильную обработку сигналов и дочерних процессов.