上海网站排名公司,网站大全全部,建筑室内设计公司,公司网站是怎么做的前面我们介绍了K8SDockerMaven插件打包部署SpringCloud微服务项目#xff0c;在实际应用过程中#xff0c;很多项目没有用到K8S和微服务#xff0c;但是用到了Docker和SpringBoot#xff0c;所以#xff0c;我们这边介绍#xff0c;如果使用Jenkinsjib-maven-plugin插件打… 前面我们介绍了K8SDockerMaven插件打包部署SpringCloud微服务项目在实际应用过程中很多项目没有用到K8S和微服务但是用到了Docker和SpringBoot所以我们这边介绍如果使用Jenkinsjib-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 daemonbuild将构建的镜像推送到远程仓库官方仓库或者Harbor私有仓库
一、SpringBoot项目jib-maven-plugin插件配置说明 我们这里主要使用buildTar命令将Docker镜像文件打包在本地然后通过Jenkins插件发布到服务器运行这样可以不需要搭建使用私有Docker镜像仓库Harbor。
打包命令: -Dimage可以在打包时自定义镜像名称和版本这个可以在Jenkins脚本时使用如果不配置默认使用pom.xml里面配置的镜像名称和版本如果不设置版本默认版本是latest
clean package -Ptest -Dimagegitegg:1.0.1 jib:buildTar -f pom.xmldocker镜像载入命令 docker load用来载入镜像包但是不能对载入的镜像重命名docker import用来载入容器包但两者都会恢复为镜像可以为镜像指定新名称经过测试jib-maven-plugin插件生成的Docker镜像文件jib-image.tar只能通过docker load载入并且在pom.xml配置中format不能选择OCIK8S时使用OCI否则载入不了。
docker load --input jib-image.tar可以将jib-maven-plugin插件的打包命令绑定到Maven的生命周期 executionsexecutionphaseinstall/phasegoalsgoalbuild/goal/goals/execution/executions将Docker镜像推送到私有镜像仓库Harbor当然这里不需要但是可以配置镜像名称和镜像版本当在运行打包命令时没有加参数-Dimage就会取此处的配置 toimage私有仓库地址/项目名称/${project.artifactId}:${project.version}/imageauthusername私有仓库用户名/usernamepassword私有仓库密码/password/auth/tovolumes 创建容器内的目录当SpringBoot项目记录日志等需要自定义的目录地址时此处需要定义容器内的目录SpringBoot使用的内嵌Tomcat容器默认使用/tmp作为工作目录这里可以不配置/tmp的valumes。 !-- 容器内的目录 --volumesvalue/tmp/valuevalue/log/value/volumesworkingDirectory 容器内的工作目录容器启动时执行的命令会在容器内的此目录下执行。
workingDirectory/gitegg/workingDirectoryformat 使用OCI构建OCI容器映像。这里直接注释掉不要使用否则docker load时不能载入在K8S里面可以使用所以这里不使用这个format。 !--K8S时使用OCI单独只用docker load会报错所以这里不使用这个format--
formatOCI/format下面是SpringBoot项目中pom.xml的jib-maven-plugin插件配置信息
······properties
······!-- jib-maven-plugin插件版本代码打包docker --jib.maven.plugin.version3.3.2/jib.maven.plugin.version
······/properties
······!-- Docker 打包插件 --plugingroupIdcom.google.cloud.tools/groupIdartifactIdjib-maven-plugin/artifactIdversion${jib.maven.plugin.version}/version!-- 绑定到Maven的install生命周期 此处如果不使用https会有问题需要设置sendCredentialsOverHttptrue--executionsexecutionphaseinstall/phasegoalsgoalbuild/goal/goals/execution/executionsconfiguration!--允许非https--allowInsecureRegistriestrue/allowInsecureRegistries!-- 相当于Docerkfile中的FROM --fromimageopenjdk:11-jre/image/fromtoimage${docker.harbor.addr}/${docker.harbor.project}/${project.artifactId}:${project.version}/imageauthusername${docker.harbor.username}/usernamepassword${docker.harbor.password}/password/auth/tocontainer!--jvm内存参数--jvmFlagsjvmFlag-Xms512m/jvmFlagjvmFlag-Xmx8g/jvmFlag/jvmFlags!-- 容器内的目录--volumesvalue/tmp/valuevalue/log/value/volumesworkingDirectory/gitegg/workingDirectoryenvironmentTZAsia/Shanghai/TZ/environment!--使用该参数保证镜像的创建时间与系统时间一致--creationTimeUSE_CURRENT_TIMESTAMP/creationTime!--K8S时使用OCI非K8S时load会报错--
!-- formatOCI/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/logschmod -R 777 /opt/tmp /opt/bak /opt/script /data/container/docker_server/tmp /data/container/docker_server/logs2. 部署脚本编写说明
定义入参可以通过Jenkins任务将参数传入脚本中我们定义了下面5个参数 container_namegitegg-server 容器名称 image_namegitegg-server 镜像名称 versionlatest 镜像版本 image_port8182 宿主主机端口映射 server_port8080 容器内服务端口对参数进行检查是否未传入参数这里根据自己的实际情况判断比如必须传入哪些参数就设置参数的个数不能小于几。
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 ! ]; thencontainer_name$1
fi
echo container_name $container_name
if [ $2 ! ]; thenimage_name$2
fi
if [ $3 ! ]; thenversion$3
fi
echo version $version
if [ $4 ! ]; thenimage_port$4
fi
echo image_port $image_port
if [ $5 ! ]; thenserver_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_namedocker stop $container_nameecho docker rm $container_namedocker 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 --restartalways -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 url3. 完整的安装部署脚本
container_namegitegg-server
image_namegitegg-server
versionlatest
image_port8181
server_port8080
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 ! ]; thencontainer_name$1
fi
echo container_name $container_name
if [ $2 ! ]; thenimage_name$2
fi
if [ $3 ! ]; thenversion$3
fi
echo version $version
if [ $4 ! ]; thenimage_port$4
fi
echo image_port $image_port
if [ $5 ! ]; thenserver_port$5
fi
echo server_port $server_portecho 执行docker ps
docker ps
if [[ $(docker inspect $container_name 2 /dev/null | grep $container_name) ! ]];
then echo $container_name 容器存在停止并删除echo docker stop $container_namedocker stop $container_nameecho docker rm $container_namedocker 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.tarecho 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 --restartalways -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.tarecho Docker Server is starting,please try to access $container_name conslone url三、新建Jenkins配置打包任务部署SpringBoot项目Docker镜像
1. Dashboard 新建任务输入任务名称选择“构建一个maven项目”点击确定。 2. 项目配置进入到任务配置页
丢弃旧的构建 这里在保持构建的最大个数填写5当然可以根据自己情况填写否则旧的构建包会一直存在占用磁盘空间。 源码管理配置git代码地址、用户名密码和版本分支如果是需要用户名密码的git库那么下面需要选择访问的用户名密码这里一定要使用用户名密码方式使用token的方式无法选中。可以在下方add也可以在Jenkins全局Credentials 中添加方便其它任务使用。 构建触发器可选可不选这个根据自己的需求选择任务在什么情况下出发构建。 构建环境这里不需要选择在介绍构建NodeJS项目时需要选中NodeJS环境。 Build这里填写Maven打包命令可以添加参数选择打包环境test或prod定义镜像名称和版本等。
clean package -Dmaven.test.skiptrue -Ptest -Dimagegitegg jib:buildTar -f pom.xmlPost Steps将打包后的文件发送到服务器并执行设置好的脚本这里选择Run only if build succeeds当构建成功时Post。 Exec command将打好的包发布到环境之后在环境上执行的部署脚本命令。publish_docker_server.sh 是脚本文件、第一个gitegg 是容器名称、第二个gitegg 是镜像名称、latest 是镜像版本、8181 是宿主机端口号、8080 是容器内服务口号。
/opt/script/publish_docker_server.sh gitegg gitegg latest 8181 80803. 运行构建任务 立即构建 查看构建日志点击立即构建之后下方会出现进度条点击进度条就可以进入构建日志界面。 构建成功后下方会给出构建成功提示此时登录远程服务器查看文件是否部署成功即可。
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