前言

之前已经成功通过 jenkins 实现自动部署项目,是通过 build 打出 dist 文件,通过 nginx 来访问的,这次想部署一个 node 后台服务,发现之前的方式不太行的通,在经过几天的摸索和实践后,最终采用 docker 容器来部署项目,通过 jenkins 来触发 docker 命令来完成整套流程。

项目配置

技术选型

项目主要使用koa+sequelize来搭建,koa是一个轻量级的node框架,sequelize是一个可以操作数据库的ORM,帮助我们连接数据库。项目部署通过docker compose 来同时启动两个容器,node容器通过sequelize连接mysql容器。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
项目结构
|-- .dockerignore //docker忽略文件
|-- .gitignore
|-- Dockerfile //docker镜像文件
|-- docker-compose.yml //docker compose执行文件
|-- package.json
|-- src
|-- app.ts //入口文件
|-- config
| |-- auth.ts
|-- constants
| |-- errorInfo.ts
|-- controller
| |-- auth.ts
|-- db //数据库配置
| |-- index.ts // 数据库入口文件
| |-- seq.ts // sequeliz配置文件
| |-- models // 定义的数据库模型
| |-- index.ts
|-- routes // 路由配置
| |-- index.ts
|-- services // 请求配置
|-- utils // 公共方法
|-- Response.ts
|-- createMd5.ts

sequelize 配置

sequelize 配置主要需要注意的点在于 host 配置。本地开发时可以配置为 localhost,但是在部署在容器中,需要将 host 改成 docker 容器与主机的 ip 地址,关于 docker 与主机之间的 ip 地址,可以通过 ifconfig 查看,可以看到一个 docker0 的网卡,如下图,可以看到 172.17.0.1 是 docker 容器与主机之间的 ip 连接地址。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//src/db/seq.ts
import { Sequelize } from "sequelize";
// new Sequelize('数据库名称', '用户名', '密码', 配置项)
const sequelize = new Sequelize("数据库名称", "用户名", "密码", {
host: isDev ? "localhost" : "172.17.0.1", //通过环境变量判断连接数据库地址
dialect: "mysql", //连接数据库类型
timezone: "+08:00", //东8时区
pool: {
//连接池
max: 5, //最大连接数
min: 0,
idle: 100000, // 一个连接池10s之内没有被使用则释放
},
});

export default sequelize;

添加 Dockerfile

创建项目的 Dockerfile 来生成 node 镜像。

1
2
3
4
5
6
# Dockerfile
FROM node # 基础镜像
WORKDIR /app # 工作目录
COPY . . # 把项目中所有内容拷贝到工作目录中 ,此处有不想拷贝的可以配置.dockerignore来忽略相关文件
RUN npm config set registry https://registry.npm.taobao.org && npm install # 设置淘宝源并install依赖
CMD npm run db && npm start # 先连接数据库并创建相关表然后执行start命令

jenkins 配置

因为 node 服务不需要打包,我们最后通过 start 或者其他定义好的 script 命令来直接运行,因而相较于之前的 jenkins 构建配置有所不同。主要区别在于之前是配置的构建后操作,node 服务的话需要配置构建时要执行的配置。

在 jenkins 中配置 docker 命令

1
2
3
4
5
6
Exec command 中配置
docker stop $(docker ps -a -q --filter ancestor=启动容器的镜像名称 --format="{{.ID}}") # 通过过滤的方式停止运行的容器
docker rmi test-docker-server-v2 # 删除之前的镜像
cd /项目目录 # 进入 node 项目目录,可通过 pwd 获得
docker build --rm --no-cache=true -t xxxx(镜像名称) . # 创建新的镜像
docker run -d --rm -ti -p 9010:9010 test-docker-server-v2 # 启动镜像,添加--rm 是为了第一步 docker stop 停止的时候删除之前的镜像

访问服务

通过立即构建,来启动服务

服务正常启动