如何使用Docker高效部署Node应用系列Node进阶系列如何在生产环境部署Node应用?合理高效的部署方案,不仅可以实现快速升级、平滑切换、负载均衡、应用隔离等部署特性,还具备一套成熟稳定的监控。Kubernetes将Node应用看作是服务器应用的黑盒,正好符合上述条件。越来越多的团队在k8s上部署Node。但在此之前,您需要在Docker容器上运行Node应用程序,这就是本章的主题。关于在docker上部署前端,山月写过两篇文章:如何在docker中部署前端前端部署Prview和Production前端部署的开发过程一个简单的Node应用index.js一个hello,world版本NodeWebAppconsthttp=require('http')constapp=async(req,res)=>{res.end('hello,world')}http.createServer(app).listen(3000,()=>console.log(3000))package.json配置npmstart启动应用"scripts":{"start":"nodeindex.js"},但这只是最简单的Node应用,还有各种数据存储和定时抛开真实环境中的任务调度等,这就够了。稍微复杂一点的Node应用,可以查看山月的项目whoami:serverless和dockerize的简化示例。NODE_ENV=production生产环境不需要安装devDependecies中的依赖。当NODE_ENV环境变量设置为production时,将跳过devDep。#通过设置环境变量,只有生产环境依赖$NODE_ENV=productionnpmci#通过显式指定flag,只有生产环境依赖$npmci--production另一方面,一些第三方模块会被基于NODE_ENV环境变量的一些意想不到的配置。所以在生产环境中要注意这个环境变量的配置。一个Node应用的简单部署一个典型的面向服务器的Node应用是这样运行的:npminstallnpmrunconfig,从配置服务(consul/vault)中拉取配置,比如数据库和缓存的账户密码,此时搭建服务器需要配置服务权限npmrunmigrate,数据库迁移脚本,执行数据库表行更改操作,此时buildserver需要数据库访问权限npmstart,启动一个Node服务,将运行步骤翻译成Dockerfile:#选择一个小镜像(~5MB)FROMnode:12-alpine#环境变量设置为生产环境ENVNODE_ENVproductionWORKDIR/code#最好使用缓存ADDpackage.jsonpackage-lock.json/codeRUNnpmciADD。/code#配置服务和数据库迁移RUNnpmrunconfig--if-present&&npmrunmigrate--if-presentEXPOSE3000CMDnpmstart这对于大多数Node应用程序来说已经足够了。如果你想精益求精,可以去下一个node-gyp和NativeAddons的多阶段构建Node中可能有一些NativeAddons,它们是通过node-gyp编译的,它依赖于python、make和g++.$apk--no-cacheaddpythonmakeg++在使用编译过程构建镜像时,源文件和构建工具都会浪费空间。镜像多阶段构建的空间高效使用。GoApp和FEApp的构建也是遵循这个规律。Multi-stagebuildGoapplicationmulti-stagebuildfront-endapplication在构建Node应用镜像时,第一层镜像用于构建node_modules。#选择一个小镜像(~5MB)FROMnode:12-alpineasbuilder#设置环境变量为生产环境ENVNODE_ENVproduction#最好根据镜像层使用缓存ADDpackage.jsonpackage-lock.json./RUNnpmci#第二阶段多阶段构建#第二阶段多阶段构建#第二阶段多阶段构建FROMnode:12-alpineWORKDIR/codeENVNODE_ENVproductionADD..COPY--from=buildernode_modulesnode_modules#配置服务和数据库迁移RUNnpmrunconfig--if-present&&npmrunmigrate--if-presentEXPOSE3000CMDnpmstart相关文章N-API和开始为Node.js编写C插件使用Docker用于开发和生产中的Node.js
