【微服务部署】三、Jenkins+Maven插件Jib一键打包部署SpringBoot应用Docker镜像步骤详解

这篇具有很好参考价值的文章主要介绍了【微服务部署】三、Jenkins+Maven插件Jib一键打包部署SpringBoot应用Docker镜像步骤详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  前面我们介绍了K8S+Docker+Maven插件打包部署SpringCloud微服务项目,在实际应用过程中,很多项目没有用到K8S和微服务,但是用到了Docker和SpringBoot,所以,我们这边介绍,如果使用Jenkins+jib-maven-plugin插件打包部署SpringBoot项目的Docker镜像。
  网上有多种Docker打包插件使用说明,讲解最多的是Spotify开源的,Spotify官方已不再推荐使用docker-maven-plugin插件进行打包,而是推荐其最新的docker打包插件dockerfile-maven-plugin,但是dockerfile-maven-plugin也已经很久没有更新了,在使用方面也有局限性,比如:只支持在本机Docker的镜像build、tag、push。
  经过几个插件的对比,发现Google开源的Jib插件功能更强大,它可以不写Dockerfile,不需要在本地安装Docker环境就能实现Docker打包,而且一直在更新,所以这里选择这个插件作为我们的Docker打包插件。
  Jib构建Java的Docker和OCI映像,不需要在本机安装Docker daemon,也不需要深入掌握Docker最佳实践。它可以作为Maven和Gradle的插件以及Java库使用。
  下面介绍Jib( jib-maven-plugin插件 )如何将SpringBoot应用程序分层打包Docker镜像,充分利用Docker的镜像分层复用机制,解决网络限制和占用大量磁盘空间的问题。
Jib( jib-maven-plugin插件 )构建的三个参数:

  • buildTar:本地构建,不需要Docker daemon就可以将镜像生成tar文件,保存在工程的target目录下
  • dockerBuild:将构建的镜像存到当前环境的Docker daemon
  • build:将构建的镜像推送到远程仓库,官方仓库或者Harbor私有仓库
一、SpringBoot项目jib-maven-plugin插件配置说明

  我们这里主要使用buildTar命令,将Docker镜像文件打包在本地,然后通过Jenkins插件发布到服务器运行,这样可以不需要搭建使用私有Docker镜像仓库Harbor。

  • 打包命令:
    -Dimage可以在打包时自定义镜像名称和版本,这个可以在Jenkins脚本时使用,如果不配置默认使用pom.xml里面配置的镜像名称和版本,如果不设置版本,默认版本是latest
clean package -Ptest -Dimage=gitegg:1.0.1 jib:buildTar -f pom.xml
  • docker镜像载入命令
    docker load用来载入镜像包,但是不能对载入的镜像重命名;docker import用来载入容器包,但两者都会恢复为镜像,可以为镜像指定新名称;经过测试,jib-maven-plugin插件生成的Docker镜像文件jib-image.tar只能通过docker load载入,并且在pom.xml配置中format不能选择OCI(K8S时使用OCI),否则载入不了。
docker load --input  jib-image.tar
  • 可以将jib-maven-plugin插件的打包命令绑定到Maven的生命周期
                    <executions>
                        <execution>
                            <phase>install</phase>
                            <goals>
                                <goal>build</goal>
                            </goals>
                        </execution>
                    </executions>
  • 将Docker镜像推送到私有镜像仓库Harbor,当然这里不需要,但是可以配置镜像名称和镜像版本,当在运行打包命令时,没有加参数-Dimage,就会取此处的配置
                        <to>
                            <image>私有仓库地址/项目名称/${project.artifactId}:${project.version}</image>
                            <auth>
                                <username>私有仓库用户名</username>
                                <password>私有仓库密码</password>
                            </auth>
                        </to>
  • volumes 创建容器内的目录,当SpringBoot项目记录日志等需要自定义的目录地址时,此处需要定义容器内的目录;SpringBoot使用的内嵌Tomcat容器默认使用/tmp作为工作目录,这里可以不配置/tmp的valumes。
                            <!-- 容器内的目录 -->
                            <volumes>
                                <value>/tmp</value>
                                <value>/log</value>
                            </volumes>
  • workingDirectory 容器内的工作目录,容器启动时执行的命令会在容器内的此目录下执行。
<workingDirectory>/gitegg</workingDirectory>
  • format 使用OCI构建OCI容器映像。这里直接注释掉不要使用,否则docker load时不能载入,在K8S里面可以使用,所以这里不使用这个format。
 <!--K8S时,使用OCI,单独只用docker load会报错,所以这里不使用这个format-->
<format>OCI</format>

下面是SpringBoot项目中pom.xml的jib-maven-plugin插件配置信息:

······
    <properties>
······
        <!-- jib-maven-plugin插件版本,代码打包docker -->
        <jib.maven.plugin.version>3.3.2</jib.maven.plugin.version>
······
    </properties>
······
                <!-- Docker 打包插件 -->
                <plugin>
                    <groupId>com.google.cloud.tools</groupId>
                    <artifactId>jib-maven-plugin</artifactId>
                    <version>${jib.maven.plugin.version}</version>
                    <!-- 绑定到Maven的install生命周期 ,此处如果不使用https,会有问题,需要设置sendCredentialsOverHttp=true-->
                    <executions>
                        <execution>
                            <phase>install</phase>
                            <goals>
                                <goal>build</goal>
                            </goals>
                        </execution>
                    </executions>
                    <configuration>
                        <!--允许非https-->
                        <allowInsecureRegistries>true</allowInsecureRegistries>
                        <!-- 相当于Docerkfile中的FROM -->
                        <from>
                            <image>openjdk:11-jre</image>
                        </from>
                        <to>
                            <image>${docker.harbor.addr}/${docker.harbor.project}/${project.artifactId}:${project.version}</image>
                            <auth>
                                <username>${docker.harbor.username}</username>
                                <password>${docker.harbor.password}</password>
                            </auth>
                        </to>
                        <container>
                            <!--jvm内存参数-->
                            <jvmFlags>
                                <jvmFlag>-Xms512m</jvmFlag>
                                <jvmFlag>-Xmx8g</jvmFlag>
                            </jvmFlags>
                            <!-- 容器内的目录-->
                            <volumes>
                                <value>/tmp</value>
                                <value>/log</value>
                            </volumes>
                            <workingDirectory>/gitegg</workingDirectory>
                            <environment>
                                <TZ>Asia/Shanghai</TZ>
                            </environment>
                            <!--使用该参数保证镜像的创建时间与系统时间一致-->
                            <creationTime>USE_CURRENT_TIMESTAMP</creationTime>
                            <!--K8S时,使用OCI,非K8S时,load会报错-->
<!--                            <format>OCI</format>-->
                        </container>
                    </configuration>
                </plugin>
二、服务器Docker运行环境配置

  前面我们讲了如何安装Docker,以及相关配置,所以这里不再赘述,直接按照自己的服务器实际情况进行安装配置Docker即可,这里讲解如何为运行SpringBoot的Fat Jar做环境准备,以及说明镜像包传输到服务器之后执行的部署脚本。

1. 部署及备份目录准备
  • 新建 /opt/tmp 目录,用于Jenkins打包后,通过 Publish Over SSH插件将包传输到服务器的临时目录。
  • 新建 /opt/bak 目录,用于存储所有部署过的包备份,方便后续版本回滚。此目录可能会占用很大空间,所以需要选择一个磁盘空间大的挂载目录。
  • 新建 /opt/script 目录,用于Jenkins将包传输完成之后,执行安装、备份操作的相关命令脚本。
  • 新建 /data/container/docker_server/tmp 目录,用于映射容器内/tmp目录,/tmp目录是SpringBoot内置Tomcat默认运行目录。
  • 新建 /data/container/docker_server/logs目录,用于映射容器内/var/log目录,/var/log目录是项目配置的日志存放目录,映射到宿主机之后,方便查看不同级别的日志。
mkdir -p /opt/tmp /opt/bak /opt/script /data/container/docker_server/tmp /data/container/docker_server/logs

chmod -R 777 /opt/tmp /opt/bak /opt/script /data/container/docker_server/tmp /data/container/docker_server/logs
2. 部署脚本编写说明
  • 定义入参,可以通过Jenkins任务将参数传入脚本中,我们定义了下面5个参数:
    container_name=gitegg-server : 容器名称
    image_name=gitegg-server : 镜像名称
    version=latest : 镜像版本
    image_port=8182 : 宿主主机端口映射
    server_port=8080 : 容器内服务端口
  • 对参数进行检查,是否未传入参数,这里根据自己的实际情况判断,比如必须传入哪些参数,就设置参数的个数不能小于几。
echo "param validate"
if [ $# -lt 1 ]; then  
  echo "you must use like this : ./publish_docker_server.sh <container_name> <image_name> <version> [image port] [server port]"  
  exit  
fi 
  • 入参赋值,如果有参数传入,则取服务参数,如果没有参数传入则取默认值
if [ "$1" != "" ]; then
   container_name="$1"
fi
echo "container_name=" $container_name
if [ "$2" != "" ]; then
   image_name="$2"
fi
if [ "$3" != "" ]; then
   version="$3"
fi
echo "version=" $version
if [ "$4" != "" ]; then
   image_port="$4"
fi
echo "image_port=" $image_port
if [ "$5" != "" ]; then
   server_port="$5"
fi
echo "server_port=" $server_port
  • 停止并删除容器
echo "执行docker ps"
docker ps 
if [[ "$(docker inspect $container_name 2> /dev/null | grep $container_name)" != "" ]]; 
then 
  echo $container_name "容器存在,停止并删除"
  echo "docker stop" $container_name
  docker stop $container_name
  echo "docker rm" $container_name
  docker rm $container_name
else 
  echo $container_name "容器不存在"
fi
  • 停止并删除镜像
# 删除镜像
echo "执行docker images"
docker images
if [[ "$(docker images -q $image_name 2> /dev/null)" != "" ]]; 
then 
  echo $image_name '镜像存在,删除镜像'
  docker rmi $(docker images -q $image_name 2> /dev/null) --force
else 
  echo $image_name '镜像不存在'
fi
  • 备份本次安装镜像包
#bak image
echo "bak image" $image_name
BAK_DIR=/opt/bak/docker/$image_name/`date +%Y%m%d`
mkdir -p "$BAK_DIR"
cp "/opt/tmp/jib-image.tar" "$BAK_DIR"/"$image_name"_`date +%H%M%S`.tar
  • 执行安装镜像包命令
echo "docker load" $image_name
docker load --input /opt/tmp/jib-image.tar
  • 执行运行命令
echo "docker run" $image_name
docker run -d -p $image_port:$server_port --name=$container_name --restart=always -v /data/container/docker_server/tmp:/tmp -v /data/container/docker_server/logs:/var/log $image_name
  • 删除安装文件,因为前面已经备份过了,所以这里将临时安装文件删除
echo "remove tmp " $image_name
rm -rf /opt/tmp/jib-image.tar
  • 打印执行完成的命令
echo "Docker Server is starting,please try to access $container_name conslone url"
3. 完整的安装部署脚本
container_name=gitegg-server
image_name=gitegg-server
version=latest
image_port=8181
server_port=8080
echo "param validate"
if [ $# -lt 1 ]; then  
  echo "you must use like this : ./publish_docker_server.sh <container_name> <image_name> <version> [image port] [server port]"  
  exit  
fi
if [ "$1" != "" ]; then
   container_name="$1"
fi
echo "container_name=" $container_name
if [ "$2" != "" ]; then
   image_name="$2"
fi
if [ "$3" != "" ]; then
   version="$3"
fi
echo "version=" $version
if [ "$4" != "" ]; then
   image_port="$4"
fi
echo "image_port=" $image_port
if [ "$5" != "" ]; then
   server_port="$5"
fi
echo "server_port=" $server_port

echo "执行docker ps"
docker ps 
if [[ "$(docker inspect $container_name 2> /dev/null | grep $container_name)" != "" ]]; 
then 
  echo $container_name "容器存在,停止并删除"
  echo "docker stop" $container_name
  docker stop $container_name
  echo "docker rm" $container_name
  docker rm $container_name
else 
  echo $container_name "容器不存在"
fi
# 删除镜像
echo "执行docker images"
docker images
if [[ "$(docker images -q $image_name 2> /dev/null)" != "" ]]; 
then 
  echo $image_name '镜像存在,删除镜像'
  docker rmi $(docker images -q $image_name 2> /dev/null) --force
else 
  echo $image_name '镜像不存在'
fi

#bak image
echo "bak image" $image_name
BAK_DIR=/opt/bak/docker/$image_name/`date +%Y%m%d`
mkdir -p "$BAK_DIR"
cp "/opt/tmp/jib-image.tar" "$BAK_DIR"/"$image_name"_`date +%H%M%S`.tar

echo "docker load" $image_name
docker load --input /opt/tmp/jib-image.tar
echo "docker run" $image_name
docker run -d -p $image_port:$server_port --name=$container_name --restart=always -v /data/container/docker_server/tmp:/tmp -v /data/container/docker_server/logs:/var/log $image_name
echo "remove tmp " $image_name
rm -rf /opt/tmp/jib-image.tar

echo "Docker Server is starting,please try to access $container_name conslone url"
三、新建Jenkins配置打包任务,部署SpringBoot项目Docker镜像
1. Dashboard > 新建任务,输入任务名称,选择“构建一个maven项目”,点击确定。

【微服务部署】三、Jenkins+Maven插件Jib一键打包部署SpringBoot应用Docker镜像步骤详解,微服务,jenkins,maven,docker,容器,spring boot,java
【微服务部署】三、Jenkins+Maven插件Jib一键打包部署SpringBoot应用Docker镜像步骤详解,微服务,jenkins,maven,docker,容器,spring boot,java

2. 项目配置,进入到任务配置页
  • 丢弃旧的构建 :这里在保持构建的最大个数填写5,当然可以根据自己情况填写,否则旧的构建包会一直存在占用磁盘空间。
    【微服务部署】三、Jenkins+Maven插件Jib一键打包部署SpringBoot应用Docker镜像步骤详解,微服务,jenkins,maven,docker,容器,spring boot,java
  • 源码管理:配置git代码地址、用户名密码和版本分支,如果是需要用户名密码的git库,那么下面需要选择访问的用户名密码,这里一定要使用用户名密码方式,使用token的方式无法选中。可以在下方add,也可以在Jenkins全局Credentials 中添加,方便其它任务使用。
    【微服务部署】三、Jenkins+Maven插件Jib一键打包部署SpringBoot应用Docker镜像步骤详解,微服务,jenkins,maven,docker,容器,spring boot,java

【微服务部署】三、Jenkins+Maven插件Jib一键打包部署SpringBoot应用Docker镜像步骤详解,微服务,jenkins,maven,docker,容器,spring boot,java

  • 构建触发器:可选可不选,这个根据自己的需求选择,任务在什么情况下出发构建。
    【微服务部署】三、Jenkins+Maven插件Jib一键打包部署SpringBoot应用Docker镜像步骤详解,微服务,jenkins,maven,docker,容器,spring boot,java
  • 构建环境:这里不需要选择,在介绍构建NodeJS项目时,需要选中NodeJS环境。
    【微服务部署】三、Jenkins+Maven插件Jib一键打包部署SpringBoot应用Docker镜像步骤详解,微服务,jenkins,maven,docker,容器,spring boot,java
  • Build:这里填写Maven打包命令,可以添加参数选择打包环境test或prod,定义镜像名称和版本等。
clean package -Dmaven.test.skip=true -Ptest -Dimage=gitegg jib:buildTar -f pom.xml

【微服务部署】三、Jenkins+Maven插件Jib一键打包部署SpringBoot应用Docker镜像步骤详解,微服务,jenkins,maven,docker,容器,spring boot,java

  • Post Steps:将打包后的文件发送到服务器,并执行设置好的脚本,这里选择Run only if build succeeds,当构建成功时Post。

【微服务部署】三、Jenkins+Maven插件Jib一键打包部署SpringBoot应用Docker镜像步骤详解,微服务,jenkins,maven,docker,容器,spring boot,java

  • Exec command:将打好的包发布到环境之后,在环境上执行的部署脚本命令。publish_docker_server.sh 是脚本文件、第一个gitegg 是容器名称、第二个gitegg 是镜像名称、latest 是镜像版本、8181 是宿主机端口号、8080 是容器内服务口号。
/opt/script/publish_docker_server.sh gitegg gitegg latest 8181 8080

【微服务部署】三、Jenkins+Maven插件Jib一键打包部署SpringBoot应用Docker镜像步骤详解,微服务,jenkins,maven,docker,容器,spring boot,java

3. 运行构建任务
  • 立即构建
    【微服务部署】三、Jenkins+Maven插件Jib一键打包部署SpringBoot应用Docker镜像步骤详解,微服务,jenkins,maven,docker,容器,spring boot,java

  • 查看构建日志:点击立即构建之后,下方会出现进度条,点击进度条就可以进入构建日志界面。
    【微服务部署】三、Jenkins+Maven插件Jib一键打包部署SpringBoot应用Docker镜像步骤详解,微服务,jenkins,maven,docker,容器,spring boot,java

【微服务部署】三、Jenkins+Maven插件Jib一键打包部署SpringBoot应用Docker镜像步骤详解,微服务,jenkins,maven,docker,容器,spring boot,java文章来源地址https://www.toymoban.com/news/detail-703924.html

  • 构建成功后,下方会给出构建成功提示,此时登录远程服务器查看文件是否部署成功即可。
    【微服务部署】三、Jenkins+Maven插件Jib一键打包部署SpringBoot应用Docker镜像步骤详解,微服务,jenkins,maven,docker,容器,spring boot,java
4. Docker镜像部署成功之后,可以使用以下Docker常用命令查看运行情况
  • 查看镜像
docker images
  • 查看有哪些容器在运行
docker ps
  • 停止容器
docker stop 容器id
  • 删除容器、删除镜像
docker rm 容器id
docker rmi 镜像id
  • 查看容器运行日志
docker logs -f 容器id
  • 进入到容器
docker exec -it 容器id /bin/bash

到了这里,关于【微服务部署】三、Jenkins+Maven插件Jib一键打包部署SpringBoot应用Docker镜像步骤详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Jenkins配置maven项目,打包、部署、发布

    Jenkins和项目在两台服务器上 Jenkins的下载安装部署省略,可自行上官网。 1.安装maven插件 完成后,会出现“success”,并且勾选“安装完成后重启Jenkins(空闲时)” 2.部署有Jenkins的服务器上,下载maven,配置环境变量,我在opt/目录下放着。  执行命令: Jenkins配置maven 配置maven,

    2024年02月09日
    浏览(33)
  • 记录使用jenkins配置maven,并且打包,部署,发布maven项目的过程

    专栏的前面几篇博客已经把jenkins和gitlab集成起来了,接着我们开始打包,部署发布maven项目 首先在jenkins中安装maven,docker安装的maven默认安装了java,但是没有安装maven,所以这里我们需要自己进入到jenkins容器中,然后安装maven。 我这里的maven是自己在官网传送门下载的最新版

    2024年02月02日
    浏览(71)
  • Jenkins+Maven+Gitlab+Tomcat 自动化构建打包,部署

    1、安装服务 Jenkins工具、环境、插件配置 全局变量配置 Manage JenkinstoolsJDK 安装 安装插件 Deploy to container 安装此插件,才能将打好的包部署到tomcat上     配置国内mvn源 创建maven项目 1  2   3    4    5    6    7    8     9 10  

    2024年02月05日
    浏览(39)
  • Jenkins + Docker + Maven + Windows 一键部署 Spring Boot 程序到远程 Linux 服务器

    本地:Windows 10 ; 本地:Jenkins + Publish Over SSH 插件; 本地:Maven ; 远程:Linux ; 远程:Docker ; 准备步骤 使用 Dockerfile 构建镜像; 基本思路 第一步:使用 mvn clean package -DskipTests 打包 Spring Boot 程序为 jar 包; 第二步:使用 Windows 命令将 jar 包复制到 jenkins 项目工作目录;

    2024年02月12日
    浏览(44)
  • 【Maven】SpringBoot项目使用maven-assembly-plugin插件多环境打包

    1.创建SpringBoot项目并在pom.xml文件中添加maven-assembly-plugin配置 2.创建 在src/main/assembly目录下创建assembly.xml文件 3.在src/main/bin创建在linux环境启动jar包的脚本 4.配置application.yml文件 5.启动项目 6.打包 7.打包后的目录结构 8.上传到linux服务器并启动jar包 9.调用接口测试 10.源码地址

    2024年02月12日
    浏览(34)
  • Jenkins + Docker 一键自动化部署 SpringBoot 应用最精简流程

    本文章实现最简单全面的 Jenkins + Docker + Spring Boot 一键自动部署项目。步骤齐全,少走坑路。 环境:CentOS7 + Git (Gitee) 实现步骤:在 Docker 安装 Jenkins,配置 Jenkins 基本信息,利用 Dockerfile 和 Shell 脚本实现项目自动拉取打包并运行。 1安装 Docker 安装社区版本 Docker CE 确保 yum 包

    2024年04月26日
    浏览(33)
  • 【Docker】11、IDEA集成Docker插件实现一键部署SpringBoot项目

    日常开发项目的过程中,我们每次需要部署线上的时候,都需要安装一大堆的运行环境,例如:JDK、MySQL、Redis 等,非常花费时间、我们可以使用 Docker 的容器技术,方便快捷地搭建项目启动所需要的运行环境,本文介绍在开发工具 Idea 中安装 Docker 插件实现一键部署 SpringBo

    2024年02月09日
    浏览(34)
  • jenkins 2.346.1 从git拉取后自动构建部署springboot maven项目

    1、jenkins官网下载 jenkins2.346.1版本(2.346之后不支持java8) Jenkins 的安装和设置 下载的war包通过 java -jar jenkins.war可运行 也可下载安装版本直接安装 http://localhost:8080,端口号8080根据安装时的设定进行对应的变更,安装后需要等待一段时间。 确认发布应用的服务器安装了java g

    2024年02月02日
    浏览(40)
  • 2023全网最细最全保姆级gitlab+Jenkins+maven自动化部署springboot项目教程

    如果没有Linux基础请仔细看好每一个步骤,避免出错,从0到1带你搭建自动化部署环境,包括服务器安装,自动化部署所需各类软件安装配置,详细贴出每一步,不断步骤,让你一次搭建部署完成,希望这篇文章能给大家带来一定的帮助,话不多说开始整 2.0 CentOs安装 2.0.1 下载VM虚拟机 我直

    2024年02月08日
    浏览(43)
  • 【微服务部署】一、使用docker-compose部署Jenkins、SonarQube、PostgreSQL

    一、安装 1、编写docker-compose部署Postgres、SonarQube、Jenkins的yml文件jenkins-compose.yml Postgres:作为SonarQube的数据库存储 SonarQube:代码质量检查 Jenkins:jenkins/jenkins:lts镜像,jenkinsci/blueocean镜像缺少node运行时环境,导致node无法运行。 关键配置说明( 宿主机 : Docker容器): /data/doc

    2024年02月09日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包