Контейнер против виртуальной машины

Почему контейнеры легче и быстрее виртуальных машин и в чём принципиальная разница.

Виртуальная машина эмулирует целый компьютер с собственной ОС, а контейнер использует ядро операционной системы хоста и изолирует только процесс.

Как устроена виртуальная машина

Виртуальная машина (ВМ) запускается поверх гипервизора и содержит полноценную гостевую операционную систему: своё ядро, системные службы, всё целиком. Поэтому одна ВМ занимает гигабайты, стартует десятки секунд, а на одной физической машине их помещается немного.

Как устроен контейнер

Контейнер не тащит за собой отдельную ОС. Он использует ядро хоста и изолируется средствами самого ядра (namespaces и cgroups в Linux). Внутри контейнера есть только нужные библиотеки и файлы приложения. Отсюда — лёгкость: образ часто весит десятки мегабайт, контейнер стартует за доли секунды, и их можно запускать сотнями.

СвойствоВиртуальная машинаКонтейнер
Ядро ОСсвоё, у каждой ВМобщее, ядро хоста
Размергигабайтымегабайты
Запускдесятки секунддоли секунды
Изоляцияполная (отдельная ОС)на уровне процесса
Плотность на хостеединицы–десяткидесятки–сотни

Что выбирать

Контейнеры — для упаковки и запуска приложений: быстро, легко, переносимо. Виртуальные машины — когда нужна полная изоляция или другая ОС целиком (например, запустить Windows на Linux-сервере). На практике их часто сочетают: контейнеры крутятся внутри виртуальных машин в облаке.

# Контейнер запускается почти мгновенно
docker run alpine echo "Привет из контейнера"

Вывод:

Привет из контейнера

Важный нюанс про ядро

Поскольку контейнеры используют ядро хоста, Linux-контейнеры нативно работают на Linux. На Windows и macOS Docker Desktop незаметно для вас запускает лёгкую Linux-виртуалку, внутри которой и крутятся контейнеры. Поэтому говорят, что контейнеры «легче ВМ», но под капотом на не-Linux системах одна общая ВМ всё же есть.

Итог

  • ВМ виртуализирует целый компьютер с отдельной ОС; контейнер изолирует процесс на общем ядре.
  • Контейнеры легче, быстрее стартуют и плотнее упаковываются.
  • ВМ выбирают для полной изоляции и другой ОС, контейнеры — для приложений.
Проверьте себя
1. Чем контейнер принципиально отличается от виртуальной машины?
AКонтейнер всегда быстрее работает на любом железе
BКонтейнер использует ядро ОС хоста, а ВМ запускает собственную ОС
CКонтейнер не может запускать приложения
DВМ занимает меньше места, чем контейнер
2. Почему контейнеры стартуют быстрее виртуальных машин?
AОни написаны на более быстром языке
BИм не нужно загружать целую гостевую операционную систему
CОни работают только в оперативной памяти
DОни не используют диск вообще
3. Когда разумнее выбрать виртуальную машину, а не контейнер?
AКогда нужна полная изоляция или другая ОС целиком
BКогда нужно запустить простое веб-приложение
CКогда важна минимальная нагрузка на ресурсы
DВсегда, контейнеры устарели
Поддержать проект