Learning Platform
Глоссарий Troubleshooting
Урок 02.02 · 15 мин
Начальный
dockervmcontainersintuition

Контейнер и виртуальная машина: в чём разница

В прошлом уроке мы поняли: контейнер — это стандартная изолированная коробка с приложением и его окружением. Тут почти каждый, кто слышал про виртуальные машины, задаёт логичный вопрос: «Так это же то же самое, что виртуалка?»

Похоже, но нет. Обе вещи дают «отдельный мир» для приложения, но устроены они очень по-разному, и из-за этого ведут себя совсем не одинаково. Разберёмся на пальцах.


Сначала — что такое виртуальная машина

Виртуальная машина (VM, «виртуалка») — это целый компьютер внутри твоего компьютера, но не настоящий, а нарисованный программой.

Специальная программа притворяется железом: говорит гостевой системе «вот тебе процессор, вот память, вот диск». А внутри этого ненастоящего компьютера запускается полноценная операционная система — целая Windows или целый Linux, со всеми своими внутренностями, как на отдельной машине.

Представь дом, а в нём — отдельные полностью достроенные квартиры. У каждой квартиры свои стены, свой фундамент-в-миниатюре, своё всё. Они независимы и хорошо отделены друг от друга. Но каждая квартира — это полноценная стройка: дорого, тяжело, долго возводить.

Так и VM: внутри каждой — полная операционная система. Это надёжная изоляция, но и большая «масса».


Теперь — контейнер

Контейнер не строит компьютер заново. Он использует одну операционную систему, которая уже работает на машине, и просто выгораживает в ней отдельный кусочек для приложения.

Самая важная деталь — в глубине любой операционной системы есть «мотор», который ею управляет (распределяет память, общается с железом, запускает программы). Будем называть его ядром. И вот ключевое отличие:

  • Виртуальная машина тащит с собой целую операционную систему вместе со своим ядром — отдельный «мотор» на каждую VM.
  • Контейнер не тащит своё ядро вообще. Все контейнеры на машине пользуются одним общим ядром — тем, что уже работает на хосте. Внутри коробки лежит только само приложение и его окружение, без целой ОС.

Вернёмся к аналогии с домом. Контейнеры — это не отдельные дома и не достроенные квартиры, а комнаты в одном здании. У каждой комнаты своя дверь и своё содержимое (своя «изоляция»), но фундамент, несущие стены и коммуникации — общие, одни на всё здание. Строить комнату быстро и дёшево, потому что каркас уже стоит.

Этот «общий каркас» и есть ядро, которое контейнеры делят между собой.


Картинка: что внутри

ВИРТУАЛЬНЫЕ МАШИНЫ                     КОНТЕЙНЕРЫ

[Прил. A] [Прил. B] [Прил. C]         [Прил. A] [Прил. B] [Прил. C]
[ ОС  ]   [ ОС  ]   [ ОС  ]           [окруж.]  [окруж.]  [окруж.]
[ядро ]   [ядро ]   [ядро ]              |         |         |
   |         |         |              +---- одно общее ядро ----+
+---- программа-эмулятор ----+        +------- одна ОС хоста ----+
+--------- одна ОС хоста ----+        +--------- железо ---------+
+----------- железо ---------+

Слева: у каждой виртуальной машины своя полная ОС и своё ядро. Справа: у контейнеров общее ядро и общая ОС хоста, а каждая коробка несёт только приложение с его окружением.

[!tip] Одна фраза, которую стоит запомнить: виртуальная машина несёт целую операционную систему со своим ядром, а контейнер пользуется одним общим ядром хоста. Из этой разницы вытекает всё остальное.


Что из этого следует на практике

Из «целая ОС в каждой» против «одно общее ядро» вытекают понятные различия:

Виртуальная машинаКонтейнер
Что внутрицелая ОС со своим ядромтолько приложение и его окружение
Сколько веситгигабайтыобычно мегабайты
Как быстро стартуетдесятки секунд (грузится целая ОС)доли секунды
Сколько влезет на машинуединицы-десяткисотни
Сила изоляцииочень прочнаяпрочная, но «стенки тоньше»

Грубо говоря: виртуалка тяжёлая, но с очень толстыми стенами; контейнер лёгкий и быстрый, но стены тоньше.

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

Чтобы это не висело в воздухе, прикинем на бытовом примере. Пусть у тебя ноутбук с 16 ГБ памяти, и ты хочешь поднять рядом пять разных баз данных, чтобы что-то попробовать.

  • Через виртуальные машины: каждой VM нужна своя полная ОС, это сотни мегабайт памяти и десятки секунд на загрузку только на саму систему, ещё до запуска базы. Пять таких VM съедят заметную часть ноутбука и будут стартовать минуту-полторы суммарно.
  • Через контейнеры: пять коробок делят одно ядро хоста, внутри каждой только сама база и её окружение. Они поднимутся почти мгновенно и займут памяти в разы меньше. Наигрался — выкинул все пять одной командой, в системе чисто.

Именно из-за этой разницы в «массе» весь современный мир разработки (локальные стенды, автотесты, облачные платформы) построен на контейнерах. Виртуальную машину берут осознанно и точечно: когда нужна другая ОС целиком или особо прочная стена изоляции, ради которой не жалко заплатить весом и временем старта.

[!note] Маленькая деталь, которая часто удивляет. Если у тебя Mac или Windows, то контейнеры там работают… внутри одной виртуальной машины с Linux, которую Docker поднимает незаметно. Так что одно другому не противоречит — на практике это часто слои: снизу виртуалка, сверху лёгкие контейнеры. Подробнее об этом — в следующих модулях.


Попробуй сам

Снова без кода — закрепляем картинку в голове.

  1. Объясни другу одним предложением, чем контейнер отличается от виртуальной машины. Если в объяснении прозвучало слово «ядро» и мысль «у контейнеров оно общее» — отлично.
  2. Перерисуй схему из урока по памяти: две колонки (VM и контейнеры), снизу железо, найди, где проходит граница «своё ядро у каждого» против «одно общее ядро».
  3. Подумай и ответь: почему на одной машине помещается заметно больше контейнеров, чем виртуальных машин? Свяжи ответ со словами «целая ОС внутри».

Проверка знанийKnowledge check
В чём главное отличие контейнера от виртуальной машины и почему из-за этого контейнеры легче и стартуют быстрее?
ОтветAnswer
Главное отличие — в том, что несёт каждый из них. Виртуальная машина — это целый компьютер, нарисованный программой: внутри неё запускается полноценная операционная система со своим собственным ядром (тем самым «мотором», что управляет системой). У каждой VM своя ОС и своё ядро. Контейнер же ничего этого не несёт: он пользуется одним общим ядром операционной системы, которая уже работает на хосте, а внутри коробки лежит только само приложение и его окружение. По аналогии: VM — это отдельные достроенные квартиры со своим фундаментом, а контейнеры — комнаты в одном здании с общим каркасом. Отсюда и следствия: раз контейнеру не нужно тащить и грузить целую ОС с ядром, он весит мегабайты, а не гигабайты, и стартует за доли секунды, а не за десятки секунд. Поэтому на одной машине помещается во много раз больше контейнеров. Плата за лёгкость — стенки изоляции тоньше, чем у VM.

Проверьте понимание

Результат: 0 из 0
Концептуальный
Вопрос 1 из 5. Главное отличие контейнера от виртуальной машины, простыми словами:

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс

Войдите чтобы оценить урок

Прогресс модуля
0 из 3