背景
后端项目
后端项目现在以SringBoot的jar包项目为主, 如果使用原生的java -jar jar包名
的方式,如果有代码变动,每次需要在本地打好jar包,上传到服务器,重新执行操作,步骤繁琐,效率低下。
如果使用jenkins持续集成的技术,可以做到定时部署、自动化部署,但是还要编写很多的shell脚本,而且比较重,比较依赖硬件环境,并不适合小型项目的部署。详情可参看另一篇博客:部署SpringBoot的jar包项目让人头疼,不如使用jenkins+docker自动化部署jar包项目
前端项目
以前项目以npm打包和原生的html静态项目为主,如果是静态项目,nginx直接反向代理即可。如果是npm需要让nginx代理到项目的dist文件夹下的静态资源。还是与后端项目相同,如果有代码上的改动,需要再次重新部署。
以上的一些列原生方式,比较繁琐,在开发环境下,每天的代码改动量比较大,部署方式不够自动化和人性化。于是结合中小型项目的特点,诞生了服务器部署v1.0方案。
服务器部署v1.0方案
方案内容
详情可参看一下文档:
- docker 构建centos7+git+nvm镜像,实现自主切换node版本统一部署前端vue项目
- docker 构建git+maven+jdk8的centos7环境,实现轻量级的springboot项目的自动化部署
- docker安装nginx规范所有项目的反向代理(一个项目一个反向代理的conf配置文件)
特点
- 基于docker搭建基础服务的容器(例如mysql、nginx、redis…)
- 在前后端docker镜像中安装git用于项目代码同步,安装vim用于基础文件的编辑
- 在后端镜像中安装java8环境,安装maven进行项目打包
- 在前端镜像中安装nvm实现自主切换node和npm的版本
- 利用shell脚本进行docker容器的生成和前后端项目的部署
问题分析
服务器部署v1.0方案,虽然在一定程度上实现了自动化和规范化,但是在长达半年的部署过程当中,还是发现了很多的问题。具体问题如下:
- start.log日志文件输出内容太多,只需要启动日志
- 部署生产环境所需要的环境依赖流程复杂、耗时长
项目需要依赖mysql、redis、nginx、rabbitmq…等,每次使用docker run命令去构建容器需要挨个构建和配置
每次都需要手动使用docker run
命令去构建容器,不能统一管理 - 部署方式有部分不够统一/规范,比如通过
centos7_mvn_git_java8
镜像构建的项目容器是将/root/project
与容器的/project
进行挂载,而nginx容器保留了之前将/root/project
挂载到/var/www/html
(为了兼容之前的项目) - 在
centos7_mvn_git_java8镜像构建的springboot后端项目容器
中,每次进行项目重新部署都需要进入容器,执行相应的shell命令,相对繁琐 - 构建的容器重新部署可能导致容器的
ip变更
,进而引发nginx反向代理失败 - 构建的容器不能做到网络互通
- mysql没有备份方案
- mysql8版本容器启动时,缺少相应的配置
- 服务器中运行的docker容器不方便进行管理
- 考虑配置集群(mysql、redis、后端项目等)
服务器部署v2.0方案期望
根据以上的问题分析,所以决定迭代服务器部署的v2.0方案。
- 主要使用docker-compose对容器进行编排,做到有限的几条命令,可以构建好所有的基础服务(docker容器)
- 使用portainer图像化管理工具对基础服务进行管理和监控
- 编制更加自动化和规范化shell脚本
- 提供规范的使用手册
- 代码和文档放到github进行开源和不断迭代版本
服务器部署v2.0方案会尽快编制和更新…