Контейнеры и виртуальные машины: что именно изолируется
Почему контейнер не является облегчённой ВМ и как выбрать подход для приложения.
Контейнеры и виртуальные машины решают похожую задачу — изолируют рабочие нагрузки, — но делают это на разных уровнях. Виртуальная машина получает собственное ядро операционной системы и виртуальное оборудование. Контейнеры используют ядро хоста и изолируют процессы средствами самой ОС.
Что изолирует виртуальная машина
ВМ имеет собственную гостевую ОС. Внутри неё можно использовать другое ядро, другой набор системных сервисов и отдельную модель обновлений. Для приложения граница виртуальной машины очень похожа на отдельный физический сервер.
Что изолирует контейнер
Контейнер обычно представляет собой группу процессов с отдельными namespace, ограничениями cgroups и собственной файловой системой. С точки зрения Linux это не «маленький компьютер», а изолированный процессный контекст.
Контейнеры особенно удобны, когда приложение уже разбито на сервисы, зависимости явно описаны, а состояние вынесено во внешние системы.
Производительность и плотность
Контейнер не обязан загружать собственное ядро и системные службы, поэтому десятки и сотни контейнеров на одном узле — обычная практика. ВМ тяжелее, но обеспечивает более сильную границу между окружениями.
Можно ли совмещать
Да. Очень распространённая схема — запуск Kubernetes или другой контейнерной платформы внутри виртуальных машин. ВМ дают инфраструктурную изоляцию и удобство управления ресурсами, а контейнеры — быстрый жизненный цикл приложений.
Практический вывод
Если нужно перенести традиционный сервер почти без изменений, ВМ обычно естественнее. Если приложение проектируется как набор масштабируемых сервисов и имеет автоматизированную сборку, контейнеры дают больше гибкости.