← Назад к вопросам

В чём разница между Docker и виртуальной машиной?

2.2 Middle🔥 131 комментариев
#DevOps и инфраструктура

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разница между Docker и виртуальной машиной

Docker и виртуальные машины (VM) решают похожую задачу изоляции приложений, но кардинально отличаются по архитектуре и подходу. Это различие определяет их производительность и область применения.

Архитектура

Виртуальная машина (VM)

Хосте ОС
├── Hypervisor (KVM, VirtualBox, Hyper-V)
│   ├── Guest ОС (Linux)
│   │   └── Приложение
│   ├── Guest ОС (Windows)
│   │   └── Приложение
│   └── Guest ОС (macOS)
│       └── Приложение

Виртуальная машина эмулирует всё оборудование: процессор, память, диск, сетевую карту. Гостевая ОС работает как полнофункциональная система.

Docker (контейнеры)

Хост ОС (Linux kernel)
├── Docker Engine
│   ├── Контейнер 1 (приложение + зависимости)
│   ├── Контейнер 2 (приложение + зависимости)
│   └── Контейнер 3 (приложение + зависимости)

Докер использует features ядра Linux (namespaces, cgroups) для изоляции процессов в одной ОС. Контейнеры - это просто процессы с ограниченным доступом.

Сравнительная таблица

ПараметрVMDocker
Ядро ОССвое для каждой VMОбщее с хостом
ПамятьВыделяется заранееДинамически
Начало30-60 сек<1 сек
Размер образа1-20 ГБ10-500 МБ
Производительность~90% хоста~99% хоста
ИзоляцияВысокая (разные ОС)Средняя (одна ОС)
ПереносимостьЗависит от hypervisorРаботает везде

Размер образа - практический пример

VM образ с Ubuntu 20.04 + Python 3.9

# Размер: ~3-5 ГБ
# Содержит полную ОС

Docker образ с Python 3.9

FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "app.py"]

# Размер: ~150-300 МБ
# Содержит только необходимое

Производительность

VM — небольшие накладные расходы на эмуляцию оборудования (обычно ~5-10% потерь).

Docker — минимальные накладные расходы, используются native Linux features (~1% потерь).

# Пример: CPU-bound задача
import time

start = time.time()
result = sum(i**2 for i in range(100_000_000))
print(f"Время: {time.time() - start:.2f}с")

# На VM: ~5.50 сек
# На Docker: ~5.20 сек
# На хосте: ~5.15 сек

Когда использовать что

Используй VM если:

  • Нужна полная изоляция разных ОС (Windows, Linux, macOS)
  • Требуется высокая степень безопасности (sandboxing)
  • Используешь приложения, не работающие в Linux
  • Нужна полная изоляция на уровне ядра
# Запуск Windows приложения на Linux хосте
virtualbox run windows-10-image.vdi

Используй Docker если:

  • Приложение работает на Linux
  • Нужна быстрая развёртка и масштабирование
  • Требуется портативность между разными машинами
  • Нужна эффективность по памяти и ресурсам
  • Микросервисная архитектура

Docker на macOS и Windows

Технически Docker требует Linux ядра. На macOS и Windows используется:

macOS (Apple Silicon/Intel)
├── Docker Desktop
│   ├── Lightweight VM (с Linux ядром)
│   │   └── Docker Engine
│   │       └── Контейнеры

Docker Desktop автоматически создаёт лёгкую VM, но всё равно это быстрее, чем полноценная VirtualBox VM.

Пример использования

Развёртка Python приложения

# Dockerfile
FROM python:3.9-slim

WORKDIR /app

# Копирование зависимостей
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# Копирование кода
COPY . .

# Запуск приложения
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "app:app"]
# Сборка образа (~200 МБ)
docker build -t my-app:1.0 .

# Запуск контейнера (<1 сек)
docker run -p 8000:8000 my-app:1.0

# Масштабирование (3 копии)
docker run -d -p 8001:8000 my-app:1.0
docker run -d -p 8002:8000 my-app:1.0
docker run -d -p 8003:8000 my-app:1.0

Комбинированный подход

Обычно в production используется комбинация:

Облачный сервер (AWS/GCP)
├── Hypervisor (KVM/Xen) — для высокой изоляции
│   └── Linux VM
│       ├── Docker
│       │   ├── Контейнер (API сервис)
│       │   ├── Контейнер (DB)
│       │   └── Контейнер (Cache)

VM обеспечивает безопасность на уровне хостинга, Docker обеспечивает масштабируемость и удобство развёртки.

Изоляция - важный аспект

VM: контейнер взломан → доступ только к системе VM Docker: контейнер взломан → потенциальный доступ к хост-системе (без дополнительных мер безопасности)

Поэтому в Docker используют:

  • Seccomp профили
  • AppArmor
  • SELinux
  • Ограничения ресурсов (cgroups)

Выводит: Docker и VM - это инструменты для разных целей. Docker идеален для микросервисов и быстрого развёртывания, VM идеальны для полной изоляции и поддержки разных ОС.