Чтобы понять, почему это происходит, вам необходимо понять основные понятия Linux, которыми пользуется Docker.
В ядре Linux есть такая функция, которая называется namespaces
, которая разделяет / изолирует ресурсы хоста таким образом, чтобы набор процессов видел один набор ресурсов, а другой набор процессов видел другой набор ресурсов.
Linux имеет 7 типов пространств имен:
- Крепление - изоляция точек крепления
- UTS - изолировать имя хоста
- IPC - изолировать межпроцессные коммуникационные ресурсы
- PID - изолировать пространство номеров PID
- Сеть - изолировать сетевые интерфейсы
- Пользователь - изолировать номера UID / GID
- Cgroup - изолировать корневой каталог cgroup
Когда вы работаете на своей машине с Linux, все, что вы делаете, находится в одном и том же пространстве имен, но когда вы создаете контейнер, выполняя docker run
по умолчанию, он создает новое отдельное пространство имен, чтобы изолировать контейнер от вашего хоста.
В конкретном случае вашего вопроса вы видите только один запущенный процесс, потому что контейнер находится в другом пространстве имен PID, чем ваш хост-компьютер.
Вы можете сказать Docker об использовании одного и того же пространства имен PID, используя --pid="host"
при создании контейнера, в некоторых случаях это полезно.