应用部署方式
1. 传统部署
直接部署在物理机上
缺点:容易相互影响,一个项目发生内存泄漏会影响机器上所有其他项目
2. 虚拟化部署
一台物理机可以运行多个虚拟机,项目部署在不同的虚拟机中,相互之间隔离
缺点:每个虚拟机都要有一套操作系统,虚拟机本身存在很大的资源占用
3. 容器化部署
共享操作系统,项目部署在容器上,同时每个容器有自己的文件系统,cpu,内存,进程空间等,相互之间不会影响
安装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 容器名
- 查看页面效果
部署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的任务
- 配置github仓库和分支,在构建里添加shell指令用docker构建和运行
- 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等
- alpine是体积最小的版本,里面什么工具都没有(118M)
- slim是带有少量软件包的版本,体积比alpine大(168M)
- stretch就是稳定版和不带后缀的体积相同,
- 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;"]
优化结果
回滚
回滚方案
- 每次构建的镜像用不同版本号区分,需要回滚的时候启动对应的镜像即可
- 优点:回滚速度快,只需要启动一个镜像
- 缺点:每次构建都会生成一个镜像,占内存
- 每次构建完给github项目上打一个tag,需要回滚时拉取对应tag的代码执行构建部署操作
- 优点:镜像始终只有一个,节省内存
- 缺点:因为需要重新构建,回滚的速度慢 个人服务器内存不大,网站访问量不大的情况,打tag的方案比较合适
配置
- 设置参数,区分构建和回滚,并指定回滚版本号
- 构建后操作增加Git Publisher给远程git项目打发版tag
- 需要回滚时勾选回滚并输入版本号