前言
之前已经成功通过 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
| import { Sequelize } from "sequelize";
const sequelize = new Sequelize("数据库名称", "用户名", "密码", { host: isDev ? "localhost" : "172.17.0.1", dialect: "mysql", timezone: "+08:00", pool: { max: 5, min: 0, idle: 100000, }, });
export default sequelize;
|
添加 Dockerfile
创建项目的 Dockerfile 来生成 node 镜像。
1 2 3 4 5 6
| FROM node WORKDIR /app COPY . . RUN npm config set registry https://registry.npm.taobao.org && npm install CMD npm run db && npm 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 /项目目录 docker build --rm --no-cache=true -t xxxx(镜像名称) . docker run -d --rm -ti -p 9010:9010 test-docker-server-v2
|
访问服务
通过立即构建,来启动服务
服务正常启动