Контейнер против виртуальной машины
Почему контейнеры легче и быстрее виртуальных машин и в чём принципиальная разница.
Виртуальная машина эмулирует целый компьютер с собственной ОС, а контейнер использует ядро операционной системы хоста и изолирует только процесс.
Как устроена виртуальная машина
Виртуальная машина (ВМ) запускается поверх гипервизора и содержит полноценную гостевую операционную систему: своё ядро, системные службы, всё целиком. Поэтому одна ВМ занимает гигабайты, стартует десятки секунд, а на одной физической машине их помещается немного.
Как устроен контейнер
Контейнер не тащит за собой отдельную ОС. Он использует ядро хоста и изолируется средствами самого ядра (namespaces и cgroups в Linux). Внутри контейнера есть только нужные библиотеки и файлы приложения. Отсюда — лёгкость: образ часто весит десятки мегабайт, контейнер стартует за доли секунды, и их можно запускать сотнями.
| Свойство | Виртуальная машина | Контейнер |
| Ядро ОС | своё, у каждой ВМ | общее, ядро хоста |
| Размер | гигабайты | мегабайты |
| Запуск | десятки секунд | доли секунды |
| Изоляция | полная (отдельная ОС) | на уровне процесса |
| Плотность на хосте | единицы–десятки | десятки–сотни |
Что выбирать
Контейнеры — для упаковки и запуска приложений: быстро, легко, переносимо. Виртуальные машины — когда нужна полная изоляция или другая ОС целиком (например, запустить Windows на Linux-сервере). На практике их часто сочетают: контейнеры крутятся внутри виртуальных машин в облаке.
# Контейнер запускается почти мгновенно
docker run alpine echo "Привет из контейнера"
Вывод:
Привет из контейнера
Важный нюанс про ядро
Поскольку контейнеры используют ядро хоста, Linux-контейнеры нативно работают на Linux. На Windows и macOS Docker Desktop незаметно для вас запускает лёгкую Linux-виртуалку, внутри которой и крутятся контейнеры. Поэтому говорят, что контейнеры «легче ВМ», но под капотом на не-Linux системах одна общая ВМ всё же есть.
Итог
- ВМ виртуализирует целый компьютер с отдельной ОС; контейнер изолирует процесс на общем ядре.
- Контейнеры легче, быстрее стартуют и плотнее упаковываются.
- ВМ выбирают для полной изоляции и другой ОС, контейнеры — для приложений.