Docker + Node.js

Тема дорожной карты · Node.js

Docker позволяет упаковывать серверные приложения Node.js в портативные, воспроизводимые образы контейнеров, которые одинаково работают в средах разработки, стейджинга и продакшна. Типичный Dockerfile для Node.js начинается с официального базового образа node:22-alpine, сначала копирует package.json и package-lock.json (или pnpm-lock.yaml) для использования кэша слоёв Docker, затем выполняет npm ci или pnpm install --frozen-lockfile для установки зависимостей, и после этого копирует исходный код приложения. Лучшие практики для Docker-образов Node.js включают: запуск процесса от непривилегированного пользователя, установку NODE_ENV=production для пропуска dev-зависимостей и использование многоэтапных сборок для уменьшения размера итогового образа путём исключения инструментов сборки. Приложение Node.js должно получать конфигурацию исключительно из process.env, а не из жёстко прописанных значений; чувствительные переменные следует передавать при запуске через Docker secrets или переменные окружения оркестратора, а не встраивать в образ. Проверки работоспособности (health checks) контейнера, обращающиеся к эндпоинту /health приложения Node.js, гарантируют, что оркестраторы вроде Kubernetes или Docker Swarm направляют трафик только к полностью запущенным и готовым экземплярам приложения.

Как это работает

Docker + Node.js оборачивает Node-приложение в контейнер для воспроизводимых деплоев. Выбор базового образа важен: node:22-alpine (маленький, musl libc, иногда проблемы с нативными модулями), node:22-slim (на debian, лучше совместимость), node:22-bookworm (полный debian, самый большой). Multi-stage сборки компилируют + чистят: builder ставит deps и npm run build; runner копирует только dist/ + production-node_modules. Запускайте под non-root (USER node). Добавьте healthcheck.

Когда применять

Контейнеризуйте каждое production Node-приложение — воспроизводимость + deployment-пайплайн перевешивают цену. Slim или alpine для размера; bookworm — если упрётесь в native-модули. Всегда multi-stage. Кешируйте npm ci/pnpm install, копируя package*.json первым. Не ставьте dev-deps в runner. NODE_ENV=production. node (не npm start) как PID 1 — сигналы тогда работают.

Типичные ошибки

Ловушки Docker + Node.js: копирование node_modules с хоста (несовпадение архитектуры, native-модули не пересобраны); npm install вместо npm ci (дрейф lockfile); проигнорированный .dockerignore (огромный build context); npm start как CMD (PID 1 — это npm, SIGTERM не доходит до Node); build-deps в runner-образе (раздутие + поверхность атаки). Один node Dockerfile даст 80% — копируйте его вперёд.

Связанные понятия

Полезные ресурсы