Ответ
Docker использует механизмы ядра Linux для изоляции, создавая отдельное окружение для каждого контейнера. Помимо файловой системы (через mount namespace), изолируются:
- Процессы (PID namespace): Контейнер видит только свои процессы, начиная с PID 1.
- Сеть (Network namespace): Контейнер получает собственные сетевые интерфейсы, правила iptables и таблицы маршрутизации.
- Пользователи и группы (User namespace): UID/GID внутри контейнера могут быть отображены на другие UID/GID на хосте для повышения безопасности.
- Межпроцессное взаимодействие (IPC namespace): Изолирует ресурсы System V IPC и POSIX очереди сообщений.
- Имя хоста и домена (UTS namespace): Контейнер может иметь свой собственный
hostname. - Ресурсы (Control groups - cgroups): Ограничивает и изолирует потребление ресурсов (CPU, память, дисковый I/O, сеть).
Пример проверки изоляции процессов:
# На хосте видим все процессы
ps aux
# В контейнере видим только процессы контейнера
docker run --rm alpine ps aux
PID USER TIME COMMAND
1 root 0:00 ps aux
Контейнеры делят ядро хоста, но namespaces и cgroups обеспечивают сильную изоляцию на уровне процессов, сети и ресурсов.