Контейнер и виртуальная машина: в чём разница
В прошлом уроке мы поняли: контейнер — это стандартная изолированная коробка с приложением и его окружением. Тут почти каждый, кто слышал про виртуальные машины, задаёт логичный вопрос: «Так это же то же самое, что виртуалка?»
Похоже, но нет. Обе вещи дают «отдельный мир» для приложения, но устроены они очень по-разному, и из-за этого ведут себя совсем не одинаково. Разберёмся на пальцах.
Сначала — что такое виртуальная машина
Виртуальная машина (VM, «виртуалка») — это целый компьютер внутри твоего компьютера, но не настоящий, а нарисованный программой.
Специальная программа притворяется железом: говорит гостевой системе «вот тебе процессор, вот память, вот диск». А внутри этого ненастоящего компьютера запускается полноценная операционная система — целая Windows или целый Linux, со всеми своими внутренностями, как на отдельной машине.
Представь дом, а в нём — отдельные полностью достроенные квартиры. У каждой квартиры свои стены, свой фундамент-в-миниатюре, своё всё. Они независимы и хорошо отделены друг от друга. Но каждая квартира — это полноценная стройка: дорого, тяжело, долго возводить.
Так и VM: внутри каждой — полная операционная система. Это надёжная изоляция, но и большая «масса».
Теперь — контейнер
Контейнер не строит компьютер заново. Он использует одну операционную систему, которая уже работает на машине, и просто выгораживает в ней отдельный кусочек для приложения.
Самая важная деталь — в глубине любой операционной системы есть «мотор», который ею управляет (распределяет память, общается с железом, запускает программы). Будем называть его ядром. И вот ключевое отличие:
- Виртуальная машина тащит с собой целую операционную систему вместе со своим ядром — отдельный «мотор» на каждую VM.
- Контейнер не тащит своё ядро вообще. Все контейнеры на машине пользуются одним общим ядром — тем, что уже работает на хосте. Внутри коробки лежит только само приложение и его окружение, без целой ОС.
Вернёмся к аналогии с домом. Контейнеры — это не отдельные дома и не достроенные квартиры, а комнаты в одном здании. У каждой комнаты своя дверь и своё содержимое (своя «изоляция»), но фундамент, несущие стены и коммуникации — общие, одни на всё здание. Строить комнату быстро и дёшево, потому что каркас уже стоит.
Этот «общий каркас» и есть ядро, которое контейнеры делят между собой.
Картинка: что внутри
ВИРТУАЛЬНЫЕ МАШИНЫ КОНТЕЙНЕРЫ
[Прил. A] [Прил. B] [Прил. C] [Прил. A] [Прил. B] [Прил. C]
[ ОС ] [ ОС ] [ ОС ] [окруж.] [окруж.] [окруж.]
[ядро ] [ядро ] [ядро ] | | |
| | | +---- одно общее ядро ----+
+---- программа-эмулятор ----+ +------- одна ОС хоста ----+
+--------- одна ОС хоста ----+ +--------- железо ---------+
+----------- железо ---------+
Слева: у каждой виртуальной машины своя полная ОС и своё ядро. Справа: у контейнеров общее ядро и общая ОС хоста, а каждая коробка несёт только приложение с его окружением.
[!tip] Одна фраза, которую стоит запомнить: виртуальная машина несёт целую операционную систему со своим ядром, а контейнер пользуется одним общим ядром хоста. Из этой разницы вытекает всё остальное.
Что из этого следует на практике
Из «целая ОС в каждой» против «одно общее ядро» вытекают понятные различия:
| Виртуальная машина | Контейнер | |
|---|---|---|
| Что внутри | целая ОС со своим ядром | только приложение и его окружение |
| Сколько весит | гигабайты | обычно мегабайты |
| Как быстро стартует | десятки секунд (грузится целая ОС) | доли секунды |
| Сколько влезет на машину | единицы-десятки | сотни |
| Сила изоляции | очень прочная | прочная, но «стенки тоньше» |
Грубо говоря: виртуалка тяжёлая, но с очень толстыми стенами; контейнер лёгкий и быстрый, но стены тоньше.
Поэтому для повседневной разработки, тестов и большинства серверных задач берут контейнеры: их можно поднять и убрать за секунду, и их влезает много. А виртуальные машины остаются там, где нужна максимально прочная изоляция или вообще другая операционная система целиком.
Чтобы это не висело в воздухе, прикинем на бытовом примере. Пусть у тебя ноутбук с 16 ГБ памяти, и ты хочешь поднять рядом пять разных баз данных, чтобы что-то попробовать.
- Через виртуальные машины: каждой VM нужна своя полная ОС, это сотни мегабайт памяти и десятки секунд на загрузку только на саму систему, ещё до запуска базы. Пять таких VM съедят заметную часть ноутбука и будут стартовать минуту-полторы суммарно.
- Через контейнеры: пять коробок делят одно ядро хоста, внутри каждой только сама база и её окружение. Они поднимутся почти мгновенно и займут памяти в разы меньше. Наигрался — выкинул все пять одной командой, в системе чисто.
Именно из-за этой разницы в «массе» весь современный мир разработки (локальные стенды, автотесты, облачные платформы) построен на контейнерах. Виртуальную машину берут осознанно и точечно: когда нужна другая ОС целиком или особо прочная стена изоляции, ради которой не жалко заплатить весом и временем старта.
[!note] Маленькая деталь, которая часто удивляет. Если у тебя Mac или Windows, то контейнеры там работают… внутри одной виртуальной машины с Linux, которую Docker поднимает незаметно. Так что одно другому не противоречит — на практике это часто слои: снизу виртуалка, сверху лёгкие контейнеры. Подробнее об этом — в следующих модулях.
Попробуй сам
Снова без кода — закрепляем картинку в голове.
- Объясни другу одним предложением, чем контейнер отличается от виртуальной машины. Если в объяснении прозвучало слово «ядро» и мысль «у контейнеров оно общее» — отлично.
- Перерисуй схему из урока по памяти: две колонки (VM и контейнеры), снизу железо, найди, где проходит граница «своё ядро у каждого» против «одно общее ядро».
- Подумай и ответь: почему на одной машине помещается заметно больше контейнеров, чем виртуальных машин? Свяжи ответ со словами «целая ОС внутри».