Чем контейнер отличается от виртуальной машины? За счёт чего достигается изоляция контейнеров в Linux?
Короткий ответ
- ВМ виртуализирует железо и несёт полное ядро ОС
- Контейнер — это процесс с изоляцией средствами ядра хоста
- Namespaces изолируют видимость: PID, сеть, файловую систему, пользователей
- Cgroups ограничивают ресурсы: CPU, память, I/O
- Слоистые образы и union-файловые системы экономят место
- Контейнеры легче и быстрее стартуют, но изоляция слабее, чем у ВМ
Контейнер — изолированный процесс на общем ядре, а ВМ — отдельная ОС на виртуальном железе.
Как сказать вслух
пример ответаВиртуальная машина эмулирует целый компьютер с собственным ядром, поэтому она тяжёлая и долго стартует. Контейнер — это обычный процесс Linux, которому ядро через namespaces ограничивает видимость системы, а через cgroups — ресурсы. Все контейнеры делят ядро хоста, поэтому они лёгкие, но изоляция слабее, чем у виртуалки. На практике это компромисс между плотностью размещения и безопасностью.
Подробный ответ
Основной ответ
ВМ работает поверх гипервизора (KVM, ESXi) и включает собственное ядро и ОС, что даёт сильную изоляцию ценой накладных расходов. Контейнер — процесс, запущенный с набором namespaces (pid, net, mnt, uts, ipc, user, cgroup), которые изолируют его представление о системе, и с cgroups, ограничивающими CPU, память и I/O. Файловая система собирается из слоёв образа через overlayfs, сверху добавляется записываемый слой. Дополнительно применяются capabilities, seccomp и AppArmor/SELinux для сужения прав. Поскольку ядро общее, уязвимость ядра потенциально затрагивает все контейнеры — для недоверенных нагрузок используют микро-ВМ (Kata, Firecracker) или gVisor.
Ключевые моменты
- Namespaces. Изолируют видимость: свой PID 1, свой сетевой стек, своё дерево монтирования у каждого контейнера.
- Cgroups. Ограничивают потребление ресурсов; именно на них опираются limits в Kubernetes и OOM kill контейнеров.
- Слоистые образы. Слои неизменяемы и переиспользуются между образами, что ускоряет сборку и доставку.
- Границы изоляции. Общее ядро — главный риск; для усиления есть user namespaces, rootless-режим и песочницы типа gVisor.
Практический контекст
Вопрос проверяет, понимает ли кандидат, что Docker — не магия, а обёртка над механизмами ядра. В работе это знание нужно при отладке: почему контейнер убит по OOM, почему процесс виден с хоста, почему «docker exec» попадает внутрь. Интервьюеры часто копают глубже: просят назвать конкретные namespaces или объяснить, что происходит при docker run.
Частые ошибки
- Говорят «контейнер — это маленькая виртуалка», не упоминая общее ядро
- Не могут назвать namespaces и cgroups как механизмы изоляции
- Утверждают, что контейнеры по умолчанию безопаснее ВМ