node最佳实践12-docker部署和ssl配置

456 阅读3分钟

Dockerize

新增Dockerfile

FROM node:16.16.0
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install pm2 -g
RUN npm install 
COPY . .
EXPOSE 8080
CMD ["npm","start"]

全局安装pm2,否则会提示找不到pm2指令,同时需要修改一下package.json,使用pm2-docker代替pm2

  "scripts": {
    "server": "babel-node ./src/bin/www",
    "server:prod": "pm2-docker start ecosystem.config.js",
    "dev": "cross-env NODE_ENV=development npm run server",
    "clean": "rimraf dist",
    "build": "babel ./src --out-dir dist",
    "start": "npm run prod",
    "prod": "cross-env NODE_ENV=production npm-run-all clean build server:prod",
    "watch": "nodemon"
  },

执行构建

docker build -t node-server .
// 跨平台构建
docker build --platform linux/amd64 -t dongzhiqin/node-server:v0.2 .

运行容器

docker run -p 8899:3000 -d node-server

连数据库

输入localhost:8899可以访问到首页,但此时项目还未链接到数据库,如果访问数据库会报错。

此时准备一个可以远程访问的数据库,假设公网ip120.38.7.191,数据库名称postgres,用户名和密码都是postgres

2023092501.png

先在本地连接一下远程的这个数据库,进行一些初始设置

src/config/database.js

module.exports={
  ...
  production: {
    username: "postgres",
    password: "postgres",
    database: "postgres",
    host: "122.38.7.191",
    dialect: "postgres"
  }
}

然后使用sequelize指令新建模型和初始化数据,要标注env使用production环境

sequelize db:migrate --env production // 跑迁移指令

sequelize db:seed all --env production // 跑种子文件
sequelize db:seed --seed xxx --env production // 跑特定一个文件

执行完毕后就可以看到数据库新增了数据模型,并且有初始数据。

本地跑npm run start链接远程数据库,可以看到有正常数据返回了

2023092502.png

把容器跑起来,docker run -p 8899:3000 -d node-server,docker使用的是8899端口,apifox访问一下,可以正常拿到数据了

2023092503.png

项目的docker化就已经完成,接下来可以部署

部署

先执行docker login进行登录

跨平台构建image,如果使用非arm架构的系统可以省略—-platform这一步

docker build --platform linux/amd64 -t dongzhiqin/node-server:v0.2 .

push镜像

docker push dongzhiqin/node-server:v0.2

弄个服务器准备部署。这里选择腾讯云的云服务器,TencentOS Server2.4,这个系统自带了docker,不需要再重新安装。

服务器准备好后远程登陆上去,下载镜像

docker pull dongzhiqin/node-server:v0.2

运行容器

docker run -p 443:3000 -p 80:3000 -d dongzhiqin/node-server:v0.2

// 把日志映射到宿主机根目录logs文件夹内
docker run -p 80:3000 -d -v /logs/node-server:/usr/src/app/logs dongzhiqin/node-server:v0.2

浏览器访问公网ip即可看见express默认页面,如果访问不到express默认页面,可以注意下安全组是否开通80端口。

域名解析

弄个二级域名node.gdbkyz.com

申请证书 2023092504.png

下载Nginx类型的证书,里面包含四个文件

2023092505.png

这里只需要crt和key文件即可。

项目根目录下新增cert文件夹,把crt文件和key文件放到这个文件夹下。修改src/bin/www

import https from 'https'
import fs from 'fs'
import path from 'path'

if(process.env.NODE_ENV === 'production'){
  const options = {
    key:fs.readFileSync(path.join(__dirname,'../../cert/node.gdbkyz.com.key')),
    cert:fs.readFileSync(path.join(__dirname,'../../cert/node.gdbkyz.com_bundle.crt'))
  }
  var server = https.createServer(options,app);
  server.listen(port)
}else{
  var server = http.createServer(app);
  server.listen(port);
}

// server.listen(options,port);

重新打包部署一遍就可以正常访问了

2023092506.png

-v 指令挂载

容器内的地址usr/src/app/cert

要挂载到宿主机的地址 /Users/dongzhiqin/Desktop/cert

执行指令

docker run -p 3000:3000 -d --rm -v /Users/dongzhiqin/Desktop/cert:/usr/src/app/cert e299faf3610f