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
先在本地连接一下远程的这个数据库,进行一些初始设置
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链接远程数据库,可以看到有正常数据返回了
把容器跑起来,docker run -p 8899:3000 -d node-server,docker使用的是8899端口,apifox访问一下,可以正常拿到数据了
项目的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端口。
域名解析
申请证书
下载Nginx类型的证书,里面包含四个文件
这里只需要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);
重新打包部署一遍就可以正常访问了
-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