Чем контейнер Docker легковеснее виртуальной машины (VM)?

«Чем контейнер Docker легковеснее виртуальной машины (VM)?» — вопрос из категории DevOps, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Ключевые отличия, делающие Docker легковесным:

Аспект Docker (Контейнер) Виртуальная Машина (VM)
Архитектура Разделяет ядро хоста (через namespaces, cgroups) Эмулирует виртуальное железо (через гипервизор) + гостевая ОС
Запуск Секунды (запуск процесса) Минуты (загрузка всей ОС)
Потребление Минимум RAM/CPU (только приложение + его зависимости) Значительное (гостевая ОС + приложение)
Размер образа Обычно МБ (например, alpine:3.18 ~ 6MB) Обычно ГБ (образ с ОС)

Пример Dockerfile:

# Использует общее ядро хоста
FROM alpine:3.18
RUN apk add --no-cache openjdk11
COPY app.jar /app.jar
CMD ["java", "-jar", "/app.jar"]

Итог: Docker устраняет оверхед от дублирования ОС и виртуализации железа, упаковывая приложение в более эффективные и быстрые единицы развертывания.