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

- Как работает виртуальная машина
- Как работает Docker
- Сравнение Docker и виртуальных машин
- Когда использовать Docker
- Когда использовать виртуальную машину
- Docker на Windows и macOS — как это работает
- Docker + VM = лучшее из двух миров
- Часто задаваемые вопросы
- Docker безопаснее виртуальной машины?
- Можно ли запустить Windows в Docker?
- Docker работает без виртуализации?
- Что читать дальше по Docker
Как работает виртуальная машина
Виртуальная машина — полная эмуляция компьютера. Гипервизор (VMware, VirtualBox, KVM) создаёт виртуальное железо, на котором запускается полноценная операционная система:
Физический сервер
└── Гипервизор (VMware / VirtualBox / KVM)
├── VM 1: полная ОС (ядро Linux + systemd + библиотеки)
│ └── Приложение A
├── VM 2: полная ОС (ядро Windows + все компоненты)
│ └── Приложение B
└── VM 3: полная ОС (другой дистрибутив Linux)
└── Приложение C
Каждая VM — независимый компьютер. Время запуска: 30–60 секунд. Размер образа: гигабайты. RAM: каждая VM резервирует свой объём независимо от нагрузки.
Как работает Docker
Контейнеры не эмулируют оборудование — они используют ядро хостовой ОС напрямую. Docker изолирует процессы через механизмы Linux (namespaces, cgroups), но не создаёт отдельную ОС:
Физический сервер
└── Хостовая ОС (ядро Linux — одно на всех)
└── Docker Engine
├── Контейнер 1 (только библиотеки приложения)
│ └── Приложение A
├── Контейнер 2 (только нужные зависимости)
│ └── Приложение B
└── Контейнер 3
└── Приложение C
Контейнеры делят ядро хоста. Запуск: секунды (часто меньше 1 секунды). Размер образа: мегабайты. RAM: занимает только то, что реально нужно приложению.
Сравнение Docker и виртуальных машин
| Характеристика | Docker | Виртуальная машина |
|---|---|---|
| Изоляция | Процессная (namespaces) | Полная (гипервизор) |
| Запуск | Секунды | Минуты |
| Размер образа | МБ | ГБ |
| Потребление RAM | Низкое | Высокое |
| Производительность | ~= нативная | -5..30% накладные расходы |
| ОС контейнера | Совместима с ядром хоста | Любая ОС |
| Безопасность | Меньше изоляции | Сильная изоляция |
| Плотность на сервере | Десятки-сотни контейнеров | Несколько VM |
| Портируемость | Высокая (образ = файл) | Средняя (большие файлы) |
Когда использовать Docker
Docker — правильный выбор для большинства современных задач разработки и деплоя:
- Деплой веб-приложений и микросервисов — быстрый старт, лёгкое обновление
- CI/CD пайплайны — изолированная воспроизводимая среда сборки
- Локальная разработка — одинаковое окружение у всей команды
- Запуск нескольких сервисов на одном сервере — высокая плотность
- Быстрое прототипирование — поднял, проверил, снёс
- Микросервисная архитектура — каждый сервис в своём контейнере
Когда использовать виртуальную машину
VM незаменимы в сценариях, где нужна полная изоляция или другая ОС:
- Нужна другая ОС — Windows на Linux сервере, или разные версии Linux
- Максимальная безопасность — полная изоляция между арендаторами (облачные провайдеры)
- Legacy приложения, требующие конкретного ядра или старой ОС
- Тестирование ОС и системного ПО
- Desktop приложения с GUI на сервере
- Compliance требования — полная изоляция по стандартам PCI DSS, HIPAA
Docker на Windows и macOS — как это работает
Docker требует Linux-ядра. На Windows и macOS его нет, поэтому Docker Desktop запускает небольшую Linux VM и внутри неё — Docker Engine:
macOS / Windows
└── Легковесная Linux VM (Docker Desktop / WSL2)
└── Docker Engine (Linux)
└── Контейнеры (Linux)
На macOS Docker Desktop использует Apple Hypervisor Framework. На Windows — WSL2 (Windows Subsystem for Linux 2). Производительность чуть ниже чем на Linux-хосте из-за дополнительного слоя VM, особенно заметно при интенсивной работе с файлами через bind mount.
Docker + VM = лучшее из двух миров
В продакшне часто используют оба подхода. VM даёт изоляцию на уровне сервера, Docker — на уровне приложений:
VPS (Virtual Machine в облаке)
└── Ubuntu 22.04
└── Docker Engine
├── nginx контейнер (reverse proxy)
├── flask-app контейнер (приложение)
└── postgres контейнер (база данных)
Типичная схема для стартапа: арендуешь VPS (это VM у провайдера), устанавливаешь Docker, запускаешь всё приложение через docker compose. Получаешь изоляцию от других клиентов провайдера (VM) + изоляцию между сервисами приложения (Docker).
Часто задаваемые вопросы
Docker безопаснее виртуальной машины?
Нет — VM безопаснее с точки зрения изоляции. Контейнеры делят ядро хоста: если в ядре есть уязвимость, атака может выйти за пределы контейнера (container escape). VM изолирована гипервизором — даже если приложение внутри скомпрометировано, выйти на хост значительно сложнее. Именно поэтому облачные провайдеры разделяют клиентов через VM, а не контейнеры. Для типичных веб-приложений Docker безопасен, но для многопользовательских систем с недоверенным кодом — VM надёжнее.
Можно ли запустить Windows в Docker?
Нет. Docker-контейнер использует ядро хоста, а ядро Windows и Linux — несовместимы. На Linux-хосте можно запускать только Linux-контейнеры. Windows-контейнеры существуют, но только на Windows-хосте с Docker Desktop. Для запуска Windows рядом с Linux — нужна виртуальная машина (VirtualBox, VMware, KVM). Docker образов с Windows как таковых не существует — есть образы на базе Windows Server Core и Nano Server, но они запускаются только на Windows-хосте.
Docker работает без виртуализации?
На Linux — да, Docker работает напрямую на ядре без виртуализации. Именно поэтому контейнеры так быстро запускаются и так мало потребляют ресурсов. На macOS и Windows — нет: Docker Desktop запускает Linux VM (через Apple Hypervisor или WSL2) и уже внутри неё — Docker Engine. Так что на не-Linux платформах виртуализация всё равно присутствует, просто прозрачно для пользователя.
Что читать дальше по Docker
Чтобы связать тему с соседними практическими материалами, дальше удобно открыть:
- Что такое Docker — вернуться к базовому объяснению Docker.
- docker run — посмотреть контейнеры на практике.
- Docker Compose — понять сценарии для нескольких сервисов.



