我用shell脚本实现项目容器化自动部署

简介

本文主要用shell脚本实现的功能为:

  • 代码更新

  • 代码编译

  • 镜像制作

  • 容器启动

  • 镜像推送

  • 推送通知

有兴趣的童鞋千万不要错过哦~

背景

之前我写了一篇文章《我的shell脚本实战-编写一个系统发布脚本》,里面用shell脚本模拟了软件的发布,有兴趣的同学可以看看这篇文章:

我的shell脚本实战-编写一个系统发布脚本

当时的发布思路是这样的

我用shell脚本实现项目容器化自动部署_第1张图片

将代码拉取至主机A进行编译,然后将编译后的jar包分发到各发布服务器上并运行。当时的操作是将jar包在虚拟机上运行,今天我决定改造下脚本,让jar做成镜像在docker容器中运行,同时打上tag,并将镜像推送到私服仓库。

说干就干~

或许有的同学对docker比较陌生,docker是一种容器技术,我们可以将自己的程序做成镜像,然后发布到镜像仓库中,我们需要的时候就拉取镜像,然后以容器的形式运行。感觉这个有点类似maven啊。

我用shell脚本实现项目容器化自动部署_第2张图片

以前我们的程序是在服务器中运行的,现在我们的程序可以在容器中运行。与服务器没有了直接的交互。

这里我只是粗略的讲下docker,具体的知识可以网上了解下。

脚本编写

我的脚本组成大概是这样的:

我用shell脚本实现项目容器化自动部署_第3张图片

docker部署

拉取代码

拉取代码就不用我说了吧,我们直接从gitlab上面拉取:

#最初时候需要git clone代码
git pull

编译代码

我用shell脚本实现项目容器化自动部署_第4张图片

我们使用maven将原代码编译成jar

备份jar

在发放jar之前我们先要将原有的jar做个备份,因为编译代码与存放jar不是同一个服务器,这里我们需要远程访问备份。

拷贝发放jar

备份好后我们需要发放jar到指定路径。

我用shell脚本实现项目容器化自动部署_第5张图片

备份代码执行后可以在指定路径查看结果。

镜像制作

接下来我们就需要将jar制作成镜像。

首先我们需要编写Dockerfile文件:

我用shell脚本实现项目容器化自动部署_第6张图片

Dockerfile可用于自动构建镜像。

我们再创建docker-compose.yml文件,用于启动指定容器。文件内容如下:

我用shell脚本实现项目容器化自动部署_第7张图片

这里使用docker-compose可以方便的编排启停容器,这里我们将程序使用的8080端口映射成服务器外部使用的18098端口,当容器启动后需要访问18098端口。

之后我们只要执行命令

docker-compose up --force-recreate --build -d

即可构建镜像和启动容器。

我们访问容器镜像管理系统Portainer,发现镜像成功构建,容器也成功启动。

镜像

我用shell脚本实现项目容器化自动部署_第8张图片

容器

容器端口

从启动的容器可以看到映射的端口为18098

推送镜像到私有仓库

我用shell脚本实现项目容器化自动部署_第9张图片

每次推送镜像时需要删除原有的容器,然后再生成一个新的容器。上面的代码主要做几件事:

  • 删除原有容器

  • 构建新镜像并启动容器

  • 给镜像打tag

  • 推送镜像

再推送到私有仓库前我们需要到私服上创建一个仓库,这里我在harbor上面创建了仓库:crawl-service

我用shell脚本实现项目容器化自动部署_第10张图片

harbor新建项目

仓库的大小我限制成800MB。执行推送脚本,我们来看看结果。

我用shell脚本实现项目容器化自动部署_第11张图片

镜像构建,容器运行

我用shell脚本实现项目容器化自动部署_第12张图片

私服推送

harbor上也看到了镜像:

我用shell脚本实现项目容器化自动部署_第13张图片

我们访问浏览器,项目的swagger也能成功访问了。

我用shell脚本实现项目容器化自动部署_第14张图片

脚本整合

我们将上面的步骤整合到一个脚本中,来看看运行结果。

我用shell脚本实现项目容器化自动部署_第15张图片

编译

我用shell脚本实现项目容器化自动部署_第16张图片

备份发放

我用shell脚本实现项目容器化自动部署_第17张图片

镜像制作,私服推送

最后我加上了钉钉机器人的消息推送通知,只要脚本执行成功,就会发放消息通知。

通知模板代码如下:

我用shell脚本实现项目容器化自动部署_第18张图片

通知效果见下图:

我用shell脚本实现项目容器化自动部署_第19张图片

最后

当然我们也可以在IDEA里面做相应的配置,实现镜像构建。

这里我是用脚本的原因是可以代码构建,镜像制作,容器启动,镜像推送一步完成,我们可以将脚本加入到定时任务中,实现定时执行:

vi /etc/crontab

我用shell脚本实现项目容器化自动部署_第20张图片

以上就是本篇的全部内容啦,如果对你有帮助,欢迎点赞+转发。

你可能感兴趣的:(开发效率,命令,linux,docker,容器,运维)