Эта статья включена в блог GitHub Shanyuexing:shfshanyue/blog, который содержит проблемы, с которыми я столкнулся в реальной работе, размышлениях о бизнесе и обучении в направлении полного стека.
Разумное и эффективное решение для развертывания не только обеспечивает быстрое обновление, плавное переключение, балансировку нагрузки, изоляцию приложений и другие функции развертывания, но также поставляется с набором проверенных и стабильных средств мониторинга.
kubernetes
Если рассматривать Node-приложение как черный ящик серверных приложений, то оно идеально соответствует вышеуказанным условиям, и все больше и больше команд развертывают Node на k8s.
Но перед этим вам нужно запустить приложение Node в контейнере Docker, что и является темой этой главы.
Что касается внешнего развертывания на докере, Шаньюэ написал две статьи:
Простое 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 работает следующим образом:
npm install
-
npm run config
, извлеките конфигурацию из службы конфигурации (consul/vault), такую как база данных и кэшированные пароли учетных записей, в это время серверу сборки необходимо настроить разрешения службы -
npm run migrate
, сценарий миграции базы данных, выполняет операцию изменения строки столбца таблицы базы данных, в это время серверу сборки требуются права доступа к базе данных -
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