Ответ
Контейнеризация в Linux — это не одна технология, а комбинация встроенных механизмов ядра, которые вместе создают изолированное окружение.
1. Изоляция с помощью namespaces: Каждый namespace предоставляет контейнеру собственный изолированный вид на системные ресурсы.
# Создание нового PID namespace и запуск в нем bash
sudo unshare --pid --fork --mount-proc /bin/bash
ps aux # Будет виден только процесс bash и ps, а не все процессы хоста
Основные типы namespaces: PID (процессы), NET (сети, интерфейсы, порты), MNT (точки монтирования), UTS (hostname), IPC (очереди сообщений), User (ID пользователей).
2. Управление ресурсами через cgroups (v2): Cgroups ограничивают и учитывают использование ресурсов группой процессов.
# Создание cgroup для ограничения памяти в 500Мб
sudo mkdir /sys/fs/cgroup/mycgroup
echo "500000000" | sudo tee /sys/fs/cgroup/mycgroup/memory.max
# Помещение процесса в эту cgroup
echo <PID> | sudo tee /sys/fs/cgroup/mycgroup/cgroup.procs
3. Изоляция файловой системы:
Используется механизм pivot_root или chroot в сочетании с overlay-файловыми системами (overlayfs), чтобы контейнер имел свой собственный корень /, собранный из слоев образа.
Практический итог: Инструменты вроде Docker или Podman выступают как удобные менеджеры, которые автоматически создают и координируют все эти namespaces, cgroups и файловые системы, предоставляя простой интерфейс для работы с контейнерами.