Ответ
Контейнеризация — это технология упаковки приложения со всеми его зависимостями (библиотеки, runtime, системные инструменты, настройки) в стандартизированную, изолированную единицу — контейнер. Контейнеры выполняются поверх ядра операционной системы хоста, но изолированы друг от друга и от хоста.
Основные принципы и сравнение:
| Аспект | Виртуальная машина (VM) | Контейнер (Docker) |
|---|---|---|
| Абстракция | Аппаратное обеспечение (виртуализация) | Операционная система |
| Гостевая ОС | Полная копия ОС в каждой VM | Использует ядро хоста |
| Размер | ГБ (тяжеловесные) | МБ (легковесные) |
| Запуск | Минуты | Секунды |
| Изоляция | Полная (гипервизор) | Процессная (namespaces, cgroups) |
Практический пример (Dockerfile):
# Используем минимальный базовый образ
FROM node:18-alpine
# Устанавливаем рабочую директорию внутри контейнера
WORKDIR /app
# Копируем файлы зависимостей
COPY package*.json ./
# Устанавливаем зависимости
RUN npm ci --only=production
# Копируем исходный код приложения
COPY . .
# Объявляем порт, который использует приложение
EXPOSE 3000
# Команда для запуска приложения
CMD ["node", "server.js"]
Преимущества в DevOps-практике:
- Переносимость: Контейнер гарантирует идентичное поведение приложения в любом окружении (разработка, тестирование, продакшн).
- Эффективность: Меньший расход ресурсов и быстрое развёртывание по сравнению с виртуальными машинами.
- Масштабируемость: Легко запускать множество экземпляров приложения, что является основой для микросервисной архитектуры и оркестраторов (Kubernetes).
- Изоляция: Проблемы в одном контейнере (например, сбой или конфликт версий библиотек) не затрагивают другие.