一个合理并且高效的部署方案,不仅能够实现快速升级,平滑切换,负载均衡,应用隔离等部署特性,而且配有一套成熟稳定的监控。
kubernetes 把 Node 应用视作一个服务端应用的黑盒子,完美匹配了以上条件,越来越多的团队把 node 部署在 k8s 上。
但在此之前,需要先把 Node 应用跑在一个 Docker 容器上,这也是本章的主题。
一个简单的 Node 应用
「index.js」
一个 hello, world 版的 Node Web App
consthttp=require()constapp=async(req,res)=>{res.end()}http.createServer(app).listen(3000,()=>console.log(3000))
「package.json」
配置 npm start 来启动应用
但这仅仅是最简单的 Node 应用,真实环境中还有各种数据存储及定时任务调度等,暂撇开不谈,这已经足够了。
再稍微复杂一点点的 Node 应用可以查看山月的项目 whoAMI[5]: 一个最简化的 serverless 与 dockerize 示例。
NODE_ENV=production
在生产环境中,无需安装 devDependecies 中依赖,NODE_ENV 环境变量设置为 production 时将会跳过 devDep。

#通过设置环境变量,只安装生产环境依赖$NODE_ENV=productionnpmci#通过显式指定flag,只安装生产环境依赖$npmci--production
另一方面,某些第三方模块会根据 NODE_ENV 环境变量做出一些意料不到的配置。因此在生产环境注意该环境变量的配置。
一个 Node 应用的简单部署
一个典型的、面向服务端的 Node 应用是这么跑起来的:
npminstallnpmrunconfig,从配置服务(consul/vault)拉取配置,如数据库与缓存的账号密码,此时构建服务器需要配置服务权限npmrunmigrate,数据库迁移脚本,执行数据库表列行更改操作,此时构建服务器需要数据库访问权限npmstart,启动一个Node服务把运行步骤翻译为Dockerfile:#选择一个体积小的镜像(~5MB)FROMnode:12-alpine#环境变量设置为生产环境ENVNODE_ENVproductionWORKDIR/codeADDpackage.jsonpackage-lock.json/codeRUNnpmciADD./code#配置服务及数据库迁移RUNnpmrunconfig---present&&npmrunmigrate---presentEXPOSE3000CMDnpmstart
这对于大部分 Node 应用已经是足够了,如果精益求精,可以再走接下来的多阶段构建
node-gyp 与 Native Addon
在 Node 中有可能存在着一些 Native Addon,它们通过 node-gyp 进行编译,而它依赖于 python,make 与 g++。
$apk--no-cacheaddpythonmakeg++
在带有编译过程的镜像构建中,源文件与构建工具都会造成空间的浪费。借助镜像的「多阶段构建」可以高效利用空间。Go App 与 FE App 的构建也遵循此规则。
多阶段构建 Go 应用[6] 多阶段构建前端应用[7] 在构建 Node 应用镜像时,第一层镜像用以构造 node_modules。
#选择一个体积小的镜像(~5MB)FROMnode:12-alpineasbuilder#环境变量设置为生产环境ENVNODE_ENVproductionADDpackage.jsonpackage-lock.json./RUNnpmci#多阶段构建之第二阶段#多阶段构建之第二阶段#多阶段构建之第二阶段FROMnode:12-alpineWORKDIR/codeENVNODE_ENVproductionADD..COPY--from=buildernode_modulesnode_modules#配置服务及数据库迁移RUNnpmrunconfig---present&&npmrunmigrate---presentEXPOSE3000CMDnpmstart
harbor和docker的区别和联系
harbor和docker的联系是:二者都与程序有关。 harbor和docker的区别是:1. 概念方面:Project Harbor是由VMware公司中国团队为企业用户设计的Registry server开源项目,包括了权限管理(RBAC)、LDAP、审计、管理界面、自我注册、HA等企业必需的功能,同时针对中国用户的特点,设计镜像复制和中文支持等功能。 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。 容器是完全使用沙箱机制,相互之间不会有任何接口。 2. 在英语解释方面:(1)harbor01n.海港;海湾;避难所;躲藏处。 02vt.& vi.心怀;庇护;避入安全地;(船)入港停泊。 例句:01HehadjumpedoverboardinNewYorkharborandswumtoshore.他在纽约港跳下船,游上了岸。 02Avillagesentirebeachandharborcanbefouledbyasinglerottingwhale一只腐烂的死鲸就足以弄脏一个村子的整片海滩和港口。
docker在web开发中得使用流程是怎样的
设想一个如下场景:我们需要一个webapp,其功能是用户注册并将注册信息插入到数据库,环境为Ubuntu+Tomcat+Mysql,怎么做?不使用Docker的话,我们通常会这样做,以Ubuntu为操作系统,然后安装Tomcat和MySQL,最后把app部署上就可以了。 那么使用Docker会怎么做呢,在这个场景下,可以有两种方式:1.仍然以Ubuntu为操作系统,然后构建一个安装有MySQL和Tomcat的Docker镜像,并把app部署到其中,最后启动Docker镜像就可以了。 看起来好像和不使用Docker基本相同,甚至还要麻烦一些,是这样吗?别着急,继续往下看。 2.第二种方式则体现了Docker的每个容器只做一件事情的思想,我们构建两个镜像,一个仅安装Tomcat并部署我们的app,另一个仅安装MySQL,然后启动这两个镜像,得到两个容器,再利用Docker的容器互联技术将二者连接(Docker的容器是通过http连接的)。
怎么配置node.js环境变量
win7安装好node后自动安装了npm1:使用webstorn创建express的项目会自动安装express2: 创建普通web项目,命令行中转到项目目录 使用npm install express安装express
发表评论