Как эффективно развертывать приложения Node с помощью Docker

Node.js

Эта статья включена в блог GitHub Shanyuexing:shfshanyue/blog, который содержит проблемы, с которыми я столкнулся в реальной работе, размышлениях о бизнесе и обучении в направлении полного стека.

Как развернуть приложение узла в производстве?

Разумное и эффективное решение для развертывания не только обеспечивает быстрое обновление, плавное переключение, балансировку нагрузки, изоляцию приложений и другие функции развертывания, но также поставляется с набором проверенных и стабильных средств мониторинга.

kubernetesЕсли рассматривать Node-приложение как черный ящик серверных приложений, то оно идеально соответствует вышеуказанным условиям, и все больше и больше команд развертывают Node на k8s.

Но перед этим вам нужно запустить приложение Node в контейнере Docker, что и является темой этой главы.

Что касается внешнего развертывания на докере, Шаньюэ написал две статьи:

  1. Как развернуть интерфейс в докере
  2. Предварительная и рабочая версия развертывания переднего плана
  3. Процесс разработки переднего развертывания

Простое Node-приложение

index.js

Одинhello, worldверсия веб-приложения Node.

const http = require('http')

const app = async (req, res) => {
  res.end('hello, world')
}

http.createServer(app).listen(3000, () => console.log(3000))

package.json

настроитьnpm startчтобы запустить приложение

"scripts": {
  "start": "node index.js"
},

Но это только самое простое Node-приложение, в реальной среде есть различные хранилища данных, планирование задач по времени и т. д., оставим пока в стороне, этого достаточно.

Для немного более сложного приложения Node вы можете просмотреть проект Shanyue.whoami: минимальныйserverlessа такжеdockerizeПример.

NODE_ENV=production

В производственной среде установка не требуетсяdevDependeciesсредние зависимости, которые будут пропущены, если для переменной среды NODE_ENV установлено значение productiondevDep.

# 通过设置环境变量,只安装生产环境依赖
$ NODE_ENV=production npm ci

# 通过显式指定 flag,只安装生产环境依赖
$ npm ci --production

С другой стороны, некоторые сторонние модули делают некоторые неожиданные конфигурации на основе переменной среды NODE_ENV. Поэтому обратите внимание на настройку этой переменной среды в рабочей среде.

Простое развертывание приложения Node.

Типичное серверное приложение Node работает следующим образом:

  1. npm install
  2. npm run config, извлеките конфигурацию из службы конфигурации (consul/vault), такую ​​как база данных и кэшированные пароли учетных записей, в это время серверу сборки необходимо настроить разрешения службы
  3. npm run migrate, сценарий миграции базы данных, выполняет операцию изменения строки столбца таблицы базы данных, в это время серверу сборки требуются права доступа к базе данных
  4. npm start, запустить службу узла

Переведите шаги запуска в Dockerfile:

# 选择一个体积小的镜像 (~5MB)
FROM node:12-alpine

# 环境变量设置为生产环境
ENV NODE_ENV production

WORKDIR /code

# 更好的根据 Image Layer 利用缓存
ADD package.json package-lock.json /code
RUN npm ci

ADD . /code

# 配置服务及数据库迁移
RUN npm run config --if-present && npm run migrate --if-present

EXPOSE 3000
CMD npm start

Этого достаточно для большинства приложений Node.Если вы продолжите улучшать, вы можете перейти к следующей многоэтапной сборке.

node-gyp и собственный аддон

В Node могут быть некоторые нативные дополнения, которые скомпилированы с помощью node-gyp, что зависит отpython,makeа такжеg++.

$ apk --no-cache add python make g++

В сборке образа с процессом компиляции как исходные файлы, так и инструменты сборки приводят к пустой трате места. зеркальныймногоступенчатая сборкаПространство можно использовать эффективно.Go Appа такжеFE AppСборка также следует этому правилу.

При создании образа приложения Node образ первого слоя используется для построенияnode_modules.

# 选择一个体积小的镜像 (~5MB)
FROM node:12-alpine as builder

# 环境变量设置为生产环境
ENV NODE_ENV production

# 更好的根据 Image Layer 利用缓存
ADD package.json package-lock.json ./
RUN npm ci

# 多阶段构建之第二阶段
# 多阶段构建之第二阶段
# 多阶段构建之第二阶段
FROM node:12-alpine

WORKDIR /code
ENV NODE_ENV production

ADD . .
COPY --from=builder node_modules node_modules
# 配置服务及数据库迁移
RUN npm run config --if-present && npm run migrate --if-present

EXPOSE 3000
CMD npm start

Статьи по Теме

  1. N-API and getting started with writing C addons for Node.js
  2. Using Docker for Node.js in Development and Production