В чем разница между виртуализацией и контейнеризацией
Что проверяют
Понимаете ли вы, что виртуализируется в каждом случае, и знаете ли, где проходит граница безопасности.
Как отвечать
Виртуализация эмулирует оборудование. Гипервизор создаёт виртуальную машину со своим процессором, памятью и дисками, а внутри работает полноценная операционная система со своим ядром. Гипервизор бывает первого типа, работающий прямо на железе, и второго, работающий как приложение внутри хостовой системы.
Контейнеризация виртуализирует окружение процесса, а не оборудование. Ядро одно, хостовое. Изоляцию обеспечивают средства самого ядра Linux: пространства имён отделяют файловую систему, сеть, список процессов и идентификаторы пользователей, а контрольные группы ограничивают процессор, память и ввод-вывод. Контейнер это обычный процесс, которому показали урезанную картину мира.
Отсюда сравнение:
- запуск: доли секунды против десятков секунд, ядро уже загружено;
- накладные расходы: почти нет против заметных, потому что не нужна вторая операционная система;
- плотность: сотни контейнеров против десятка машин на том же сервере;
- размер образа: десятки мегабайт против гигабайтов;
- ядро: контейнер обязан работать на ядре хоста, поэтому образ Linux на macOS запускается внутри скрытой виртуальной машины.
Главное различие по сути: граница безопасности. У виртуальной машины она проходит по гипервизору и считается прочной, у контейнера по системным вызовам общего ядра. Уязвимость в ядре затрагивает все контейнеры сразу, поэтому чужой недоверенный код в контейнер не помещают.
Именно поэтому появились гибриды: Firecracker, Kata Containers и gVisor дают интерфейс контейнера, но изоляцию ближе к машинной. В облаках это и используется под функции по требованию.
Где спотыкаются
Называют контейнер лёгкой виртуальной машиной, не объясняя, что именно легче.
Считают изоляцию контейнера равной машинной.
Не знают, что контейнер не может нести другое ядро.
Думают, что Docker это виртуализация.