Контейнеры против виртуальных машин
Тема дорожной карты · Docker & Containers
ВМ виртуализируют железо и крутят полное гостевое ядро; контейнеры разделяют ядро хоста и изолируются через namespaces + cgroups. Поэтому контейнеры стартуют за секунды и весят мегабайты на диске, а ВМ — минуты и гигабайты, но цена — более слабая изоляция: эксплойт ядра выходит из контейнера, а из ВМ обычно нет. Правило: контейнеры — для упаковки приложений и плотности; ВМ (или gVisor/Kata/Firecracker) — когда нужно гонять недоверенный код или другое ядро. На macOS/Windows Docker сам крутит контейнеры в скрытой Linux-ВМ.
Как это работает
Контейнеры против виртуальных машин начинается с понимания: контейнер — это процесс (или дерево процессов) на ядре хоста со своими namespace для файловой системы, сети, PID — не VM. Ядро Linux даёт namespaces (изоляция) и cgroups (лимиты ресурсов); Docker — один из runtime, оборачивающий эти примитивы в удобный CLI + формат образов. Образы собираются один раз и запускаются везде, где есть совместимое ядро; слоёная модель даёт дешёвые пересборки за счёт кэша.
Когда применять
Берите контейнеры, когда нужно (а) воспроизводимые сборки между dev/CI/prod, (б) плотное размещение сервисов на одном хосте, (в) быстрый старт по сравнению с VM, (г) переносимый артефакт для дистрибуции. Пропустите для одноразовых shell-скриптов, hard-realtime нагрузок или приложений с привилегированным доступом к ядру (containers + privileged даёт тот же blast radius, что и VM, часто без VM-уровня изоляции).
Типичные ошибки
Ловушки Контейнеры против виртуальных машин: путаница контейнеров с VM и ожидание полной изоляции (контейнер делит ядро — kernel-CVE пробивает границу); запуск контейнеров как root внутри (escapes проще); поставка 2 GB Ubuntu-образа для запуска 5 MB Go-бинарника; монтирование /var/run/docker.sock в контейнер "для удобства" (это root на хосте). Считайте контейнеры частью модели безопасности, не границей безопасности сами по себе.
Связанные понятия
Полезные ресурсы
Проверить знания (1)
Загрузка вопросов…