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

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

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

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

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

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

Контейнер не тащит за собой отдельную ОС. Он использует ядро хоста и изолируется средствами самого ядра (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Всегда, контейнеры устарели