Что такое…

Docker или виртуальная машина — в чём разница и что взять новичку

Иллюстрация: слева тяжёлый ящик с целым компьютером внутри, справа лёгкая коробка только с приложением

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

Разница в одной фразе: виртуалка упаковывает целый компьютер, Docker — только твоё приложение. Разберём, что это значит на практике, и в конце скажу прямо, что брать для первого проекта.

Что упаковывает виртуальная машина

Виртуальная машина (VM) — это полноценный компьютер внутри твоего компьютера. Специальная программа (гипервизор) выделяет ему кусок памяти и диска, и внутри крутится целая операционная система — своя Windows или Linux, со всем содержимым.

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

Что упаковывает Docker

Docker идёт хитрее. Он не тащит с собой отдельную операционную систему — он одалживает ядро у хозяйской. В контейнер кладётся только твоё приложение и то, что ему нужно для работы: код, библиотеки, настройки. Всё остальное — общее с хозяином.

Отсюда лёгкость. Контейнер весит мегабайты, а не гигабайты, и стартует за секунды, потому что грузить целую ОС не надо. Расплата — изоляция слабее: контейнеры делят одно ядро с хозяином, поэтому запустить внутри совсем другую ОС не выйдет. Для запуска приложения этого почти всегда достаточно.

Пара слов, которые ты сразу встретишь: образ (image) и контейнер. Образ — это собранный один раз «слепок» приложения со всем необходимым. Контейнер — это запущенный экземпляр образа. Собрал образ однажды — и дальше поднимаешь из него сколько угодно одинаковых контейнеров: у себя, у коллеги, на сервере. Ровно отсюда и берётся обещание «собрал один раз — работает везде».

Сравнение по существу

| Критерий | Docker (контейнер) | Виртуалка (VM) | |----------|--------------------|----------------| | Что упаковывает | Только приложение и его зависимости | Целую операционную систему | | Размер | Мегабайты | Гигабайты | | Старт | Секунды | Минуты | | Изоляция | Лёгкая, общее ядро с хозяином | Полная, отдельная ОС | | Другая ОС внутри | Нет (делит ядро) | Да, любая | | Когда брать | Запустить/задеплоить приложение | Нужна целиком другая ОС или жёсткая изоляция |

Кому что подойдёт

Новичку и для деплоя приложения — Docker, почти всегда. Твоя задача — чтобы приложение одинаково поднималось у тебя, у коллеги и на сервере. Контейнер решает это легко: собрал образ один раз — запускается везде за секунды. Именно поэтому современный деплой почти весь построен на контейнерах, а не на виртуалках.

Виртуалка нужна, когда требуется целиком другая ОС — например, ты на macOS, а надо честную Windows, — или когда важна максимальная изоляция ради безопасности. Ещё нюанс: сам Docker на Windows и macOS под капотом крутит маленькую Linux-виртуалку, чтобы одолжить у неё ядро. То есть это не «или — или»: часто они работают вместе, просто на разных уровнях.

Практический вывод: начинаешь — ставь Docker и учись собирать контейнер. Первый шаг — файл Dockerfile: в нём ты по строчкам описываешь, из чего собрать образ (какая база, что установить, как запускать). К виртуалкам придёшь, только когда упрёшься в задачу, где нужна целая отдельная система. Для первого приложения это почти наверняка не твой случай.

Частые вопросы

Docker — это тоже виртуальная машина?

Нет, хотя цель похожа. VM виртуализирует железо и запускает поверх целую ОС. Docker виртуализирует только окружение приложения, а ядро одалживает у хозяина. Поэтому контейнер во много раз легче и быстрее виртуалки — он не грузит отдельную операционную систему.

Что быстрее запускается — контейнер или виртуалка?

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

Можно ли обойтись вообще без того и другого?

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

Учись вайб-кодингу, а не просто читай о нём

Короткие уроки-истории, симулятор агента и ежедневная практика — в нашем мобильном приложении. Бесплатно.

Открыть приложение
Робот KODiQ

ИИ-редактор KODiQ. Пишет про вайб-кодинг и AI-инструменты простым языком — каждый день.

Все статьи →