>  기사  >  웹 프론트엔드  >  Docker를 사용하여 Node.js 애플리케이션을 효율적으로 배포하는 방법 소개

Docker를 사용하여 Node.js 애플리케이션을 효율적으로 배포하는 방법 소개

青灯夜游
青灯夜游앞으로
2020-08-28 10:11:531956검색

Docker를 사용하여 Node.js 애플리케이션을 효율적으로 배포하는 방법 소개

빠른 업그레이드, 원활한 전환, 로드 밸런싱, 애플리케이션 격리 및 기타 배포 기능을 구현할 수 있을 뿐만 아니라 성숙하고 안정적인 모니터링 기능도 제공하는 합리적이고 효율적인 배포 솔루션입니다.

kubernetes는 Node 애플리케이션을 서버측 애플리케이션의 블랙박스로 간주하며, 이는 위의 조건과 완벽하게 일치합니다. k8s에 노드를 배포하는 팀이 점점 늘어나고 있습니다. [동영상 튜토리얼 추천: node js tutorialkubernetes 把 Node 应用视作一个服务端应用的黑盒子,完美匹配了以上条件,越来越多的团队把 node 部署在 k8s 上。【视频教程推荐:node js教程Docker视频教程

但在此之前,需要先把 Node 应用跑在一个 Docker 容器上,这也是本章的主题。

关于前端在 docker 上部署,作者曾写了几篇文章:

  1. 如何在 docker 中部署前端
  2. 前端部署 Prview 与 Production
  3. 前端部署的发展过程

一个简单的 Node 应用

index.js

一个 hello, world 版的 Node Web App

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 应用可以查看山月的项目 whoami: 一个最简化的 serverlessdockerize 示例。

NODE_ENV=production

在生产环境中,无需安装 devDependecies 中依赖,NODE_ENV 环境变量设置为 production 时将会跳过 devDep

# 通过设置环境变量,只安装生产环境依赖
$ 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,启动一个 Node 服务

把运行步骤翻译为 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 与 Native Addon

在 Node 中有可能存在着一些 Native Addon,它们通过 node-gyp 进行编译,而它依赖于 pythonmakeg++

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

在带有编译过程的镜像构建中,源文件与构建工具都会造成空间的浪费。借助镜像的多阶段构建可以高效利用空间。Go AppFE App 的构建也遵循此规则。

在构建 Node 应用镜像时,第一层镜像用以构造 node_modules, Docker 동영상 튜토리얼

]

하지만 그 전에는 Docker 컨테이너에서 Node 애플리케이션을 실행해야 합니다. 이 장의 주제이기도 하다.
  1. Docker의 프런트 엔드 배포에 대해 저자는 다음과 같은 여러 기사를 작성했습니다.
  2. Docker에서 프런트 엔드를 배포하는 방법
  3. 프론트엔드 배포 Prview and Production

프론트 개발 프로세스 -배포 종료

간단한 Node 애플리케이션🎜🎜index.js🎜🎜hello, world 버전 of Node Web App🎜
# 选择一个体积小的镜像 (~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
🎜package.json🎜🎜npm start를 구성하여 애플리케이션을 시작하세요🎜rrreee🎜하지만 이것은 가장 간단한 Node 애플리케이션일 뿐입니다. 다양한 데이터 저장소가 있습니다. 실제 환경에서의 타이밍 작업 스케줄링 등은 제쳐두고 이것으로 충분합니다. 🎜🎜좀 더 복잡한 Node 애플리케이션의 경우 Shanyue의 프로젝트 whoami🎜: One of 가장 단순화된 서버리스dockerize 예입니다. 🎜

NODE_ENV=production🎜🎜프로덕션 환경에서는 devDependecies에 종속성을 설치할 필요가 없습니다. NODE_ENV 환경 변수가 프로덕션으로 설정되면 devDep를 건너뜁니다. 🎜rrreee🎜 반면 일부 타사 모듈은 NODE_ENV 환경 변수를 기반으로 예상치 못한 구성을 수행합니다. 따라서 프로덕션 환경에서 이 환경 변수의 구성에 주의하세요. 🎜<h2 id="item-3">Node 애플리케이션의 간단한 배포🎜🎜일반적인 서버 지향 Node 애플리케이션은 다음과 같이 실행됩니다.🎜🎜🎜<code>npm install🎜🎜npm run config 는 데이터베이스 및 캐시된 계정 비밀번호와 같은 구성을 구성 서비스(consul/vault)에서 가져옵니다. 이때 서버를 빌드하려면 구성 서비스 권한이 필요합니다🎜🎜npm run migration, 데이터베이스 마이그레이션 스크립트는 데이터베이스 테이블 열 및 행 변경을 수행합니다. 이때 서버를 구축하려면 데이터베이스 액세스 권한이 필요합니다🎜🎜<code>npm start, Node 서비스를 시작합니다🎜🎜🎜실행 단계를 번역합니다. Dockerfile에:🎜rrreee🎜이것은 대부분의 Node 애플리케이션에 충분합니다. 계속 개선하면 다음 다단계 구축으로 갈 수 있습니다🎜

node-gyp 및 Native Addon🎜🎜여기 Node Addon의 일부 네이티브일 수 있으며 python, makeg++에 의존하는 node-gyp을 통해 컴파일됩니다. 🎜rrreee🎜컴파일 프로세스를 통한 이미지 빌드에서는 소스 파일과 빌드 도구로 인해 공간 낭비가 발생합니다. 미러링된 다단계 빌드 덕분에 공간을 효율적으로 사용할 수 있습니다. Go 앱FE 앱의 구성도 이 규칙을 따릅니다. 🎜🎜Node 애플리케이션 이미지를 구축할 때 첫 번째 레이어는 이미지는node_modules를 구성하는 데 사용됩니다. 🎜rrreee🎜관련 기사🎜🎜🎜🎜N-API 및 Node.js용 C 애드온 작성 시작하기🎜🎜🎜🎜개발 및 프로덕션에서 Node.js용 Docker 사용🎜🎜🎜🎜더 많은 프로그래밍 관련 지식을 보려면 다음 사이트를 방문하세요. 🎜프로그래밍 입문🎜! ! 🎜

위 내용은 Docker를 사용하여 Node.js 애플리케이션을 효율적으로 배포하는 방법 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제