自动化部署项目实践(docker+ jekins)

581 阅读4分钟

应用部署方式

1. 传统部署

直接部署在物理机上

缺点:容易相互影响,一个项目发生内存泄漏会影响机器上所有其他项目

2. 虚拟化部署

一台物理机可以运行多个虚拟机,项目部署在不同的虚拟机中,相互之间隔离

缺点:每个虚拟机都要有一套操作系统,虚拟机本身存在很大的资源占用

3. 容器化部署

共享操作系统,项目部署在容器上,同时每个容器有自己的文件系统,cpu,内存,进程空间等,相互之间不会影响

20006deca0fccda0d536edd626835e9e_720w.png

安装Docker

目前Mac、window、centos均已支持docker,这里以centos为例(服务器基本用的都是centos系统,并且它对docker的支持最好)

详细的安装和docker基础可以参考我之前写的一篇Docker基础

yum install -y yum-utils
# 设置镜像仓库
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 更新yum软件包索引
yum makecache fast\
# 安装Docker ce是社区版,ee是企业版
yum install docker-ce docker-ce-cli containerd.io

部署docker可视化工具

  • 下载镜像 docker pull docker.io/portainer/portainer
  • 启动容器
docker run -d -p 9001:9000 -v /var/run/docker.sock:/var/run/docker.sock --name portainer docker.io/portainer/portainer
# -d 后台启动 ## -it 启动并进入容器
# -p 主机端口:容器端口,即容器内启动的服务9000,主机访问9001端口即可访问容器服务
# -v 数据卷 数据的持久存储,文件数据不会因容器停止或重启而丢失
# --name 容器名

image.png

部署github的项目

为了保持主机环境简单,以下实践均在docker启动的镜像容器中操作

jekins

  • 安装并启动jekins,完成后页面效果
docker run \
  -u root \
  --rm \
  -d \
  -p 8080:8080 \
  -p 50000:50000 \
  -v jenkins-data:/var/jenkins_home \
  -v /var/run/docker.sock:/var/run/docker.sock \
  jenkinsci/blueocean
# --rm 关闭时自动删除Docker容器
# 8080 本地服务端口
# 50000 与Jenkins主站进行通信的端口
# -v 在docker内使用docker需要挂载/var/run/docker.sock,用于在同一主机上的进程之间进行通信。Docker守护程序默认情况下侦听docker.sock
  • 在jekins页面(首次进入需要配置,按指引操作就行)新建一个freestyle的任务

image.png

  • 配置github仓库和分支,在构建里添加shell指令用docker构建和运行

image.png

  • Dockerfile文件放在在项目根目录,配置示例:
FROM lj996/node14-yarn
COPY . /webapp
WORKDIR /webapp
RUN yarn --version
RUN node --version
RUN yarn
RUN yarn run build
WORKDIR /webapp/dist
RUN ls
EXPOSE 3000
ENTRYPOINT yarn run server
  • 构建完成后会自动运行镜像,访问9000端口即可以查看页面效果

镜像优化

  • 使用体积更小的基础镜像
  • 多阶段构建
  • 使用nginx

使用体积更小的基础镜像

node镜像有很多版本,如Alpine, Slim, Stretch, Buster等

  1. alpine是体积最小的版本,里面什么工具都没有(118M)
  2. slim是带有少量软件包的版本,体积比alpine大(168M)
  3. stretch就是稳定版和不带后缀的体积相同,
  4. buster也是稳定版,和stretch只有很小的差异 参考:docker镜像不同版本的区别

多阶段构建

通过多阶段构建,我们可以在 Dockerfile 中使用多个基础镜像,并将编译成品、配置文件等从一个阶段复制到另一个阶段,这样我们就可以丢弃不需要的东西(源代码,node_module等)。

FROM lj996/node14-slim-yarn as build
COPY . /webapp
WORKDIR /webapp
RUN yarn --version
RUN node --version
RUN yarn
RUN yarn run build

FROM node:14.17.5-alpine3.14
COPY --from=build /webapp/dist /webapp/dist
COPY --from=build /webapp/server /webapp/server
WORKDIR /webapp
RUN node --version
RUN npm --version
RUN npm init -y
RUN npm i koa koa-static
EXPOSE 3000
ENTRYPOINT node ./server/server.ts

使用nginx

对于不需要复杂配置,只是需要启动一个服务来加载打包后文件的项目,用nginx更合适(镜像体积更小,而且不需要安装其他依赖)

FROM lj996/node14-slim-yarn as build
COPY . /webapp
WORKDIR /webapp
RUN yarn --version
RUN node --version
RUN yarn
RUN yarn run build

FROM nginx:stable-alpine
COPY --from=build /webapp/dist /usr/share/nginx/html
EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]

优化结果

image.png

回滚

回滚方案

  • 每次构建的镜像用不同版本号区分,需要回滚的时候启动对应的镜像即可
    • 优点:回滚速度快,只需要启动一个镜像
    • 缺点:每次构建都会生成一个镜像,占内存
  • 每次构建完给github项目上打一个tag,需要回滚时拉取对应tag的代码执行构建部署操作
    • 优点:镜像始终只有一个,节省内存
    • 缺点:因为需要重新构建,回滚的速度慢 个人服务器内存不大,网站访问量不大的情况,打tag的方案比较合适

配置

  • 设置参数,区分构建和回滚,并指定回滚版本号

image.png

  • 构建后操作增加Git Publisher给远程git项目打发版tag

image.png

  • 需要回滚时勾选回滚并输入版本号

image.png