Какие плюсы и минусы у Docker?

«Какие плюсы и минусы у Docker?» — вопрос из категории Docker, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Плюсы:

  • Изоляция и консистентность: Контейнеры изолируют приложение и его зависимости, обеспечивая идентичное поведение на всех этапах — от разработки до продакшена. Это решает проблему "работает на моей машине".
  • Портативность и "Build once, run anywhere": Образ можно собрать один раз и запускать на любой системе с Docker Engine (Linux, Windows, облако).
  • Эффективность ресурсов: Контейнеры используют общее ядро хостовой ОС, что делает их гораздо легковеснее и быстрее в запуске по сравнению с виртуальными машинами.
  • Быстрое развертывание и масштабирование: Запуск занимает секунды, что идеально подходит для микросервисов и горизонтального масштабирования.
  • Экосистема и стандартизация: Docker Hub и другие реестры предоставляют огромную библиотеку готовых, проверенных образов. Dockerfile стандартизирует процесс сборки.

Минусы:

  • Безопасность (относительная): Изоляция на уровне процессов слабее, чем аппаратная изоляция в VM. Уязвимость в ядре хоста может затронуть все контейнеры. Требуется тщательная настройка (непривилегированные пользователи, AppArmor/SELinux).
  • Сложность оркестрации: Управление сотнями контейнеров вручную невозможно. Необходимо осваивать оркестраторы (Kubernetes, Docker Swarm), что добавляет сложности.
  • Персистентность данных: Файловая система контейнера по умолчанию эфемерна. Для хранения данных требуется настройка томов (volumes) или bind mounts, что усложняет архитектуру.
  • Сложность отладки: Распределенная природа контейнерных приложений требует новых навыков и инструментов (централизованное логирование, распределенный трейсинг).

Пример простого Dockerfile для веб-приложения:

# Используем минимальный базовый образ
FROM nginx:alpine

# Копируем статику приложения
COPY ./dist /usr/share/nginx/html

# Открываем порт
EXPOSE 80

# Запускаем nginx в foreground
CMD ["nginx", "-g", "daemon off;"]