Ответ
Контейнеры в Linux — это не виртуальные машины, а изолированные процессы. Эта изоляция достигается за счет комбинации встроенных механизмов ядра, которые я изучал и настраивал.
Ключевые технологии:
-
Namespaces (пространства имен) — изолируют глобальные системные ресурсы для группы процессов, создавая у них иллюзию, что они одни в системе.
- PID namespace: Изолирует дерево процессов. Процесс в контейнере видит свой PID 1 (часто это
init), в то время как на хосте у него другой PID. - Network namespace: У контейнера свой собственный сетевой стек (интерфейсы, таблицы маршрутизации, порты). Это позволяет запускать, например, два контейнера с Nginx на 80 порту.
- Mount namespace: Изолированное дерево файловых систем. Это основа для файловой системы контейнера.
- UTS namespace: Позволяет контейнеру иметь свое собственное имя хоста и домена.
- IPC namespace: Изолирует межпроцессное взаимодействие (очереди сообщений, сегменты общей памяти).
- User namespace: Сопоставляет UID/GID внутри контейнера с другими UID/GID на хосте для повышения безопасности.
- PID namespace: Изолирует дерево процессов. Процесс в контейнере видит свой PID 1 (часто это
-
Control Groups (cgroups) — ограничивают и учитывают использование ресурсов группой процессов. Без них один контейнер мог бы «съесть» всю память или CPU хоста.
- memory: Ограничивает использование RAM и swap.
- cpu: Ограничивает долю CPU времени.
- blkio: Контролирует доступ к блочным устройствам ввода-вывода.
Я настраивал лимиты через Docker (
--memory,--cpus) или напрямую в системе.
-
Union File Systems (OverlayFS, AUFS) — хотя и не являются механизмом ядра в том же смысле, они критически важны. Они позволяют наслаивать файловые системы (образы) друг на друга, обеспечивая эффективное использование диска и кэширование слоев. Docker использует их для построения образов и файловой системы контейнера.
Дополнительные механизмы безопасности:
- Capabilities: Разделение привилегий суперпользователя. Я могу дать контейнеру право монтировать файловые системы (
CAP_SYS_ADMIN), но не давать полный root-доступ. - Seccomp: Профиль безопасности, который ограничивает системные вызовы, доступные контейнеру. Стандартный профиль Docker блокирует множество опасных вызовов.
Docker, containerd и другие среды исполнения (runtimes) — это просто удобные обертки, которые управляют этими низкоуровневыми механизмами. Понимание их работы необходимо для глубокой отладки проблем с производительностью, сетью или безопасностью контейнеров.