Ответ
Плюсы:
- Изоляция и консистентность: Контейнеры изолируют приложение и его зависимости, обеспечивая идентичное поведение на всех этапах — от разработки до продакшена. Это решает проблему "работает на моей машине".
- Портативность и "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;"]