掃二維碼與項目經理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網(wǎng)交流
前面我們介紹了K8S+Docker+Maven插件打包部署SpringCloud微服務項目,在實際應用過程中,很多項目沒有用到K8S和微服務,但是用到了Docker和SpringBoot,所以,我們這邊介紹,如果使用Jenkins+jib-maven-plugin插件打包部署SpringBoot項目的Docker鏡像。

在來賓等地區(qū),都構建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產品創(chuàng)新能力,以專注、極致的服務理念,為客戶提供網(wǎng)站建設、成都做網(wǎng)站 網(wǎng)站設計制作按需搭建網(wǎng)站,公司網(wǎng)站建設,企業(yè)網(wǎng)站建設,品牌網(wǎng)站制作,全網(wǎng)營銷推廣,成都外貿網(wǎng)站建設,來賓網(wǎng)站建設費用合理。
網(wǎng)上有多種Docker打包插件使用說明,講解最多的是Spotify開源的,Spotify官方已不再推薦使用docker-maven-plugin插件進行打包,而是推薦其最新的docker打包插件dockerfile-maven-plugin,但是dockerfile-maven-plugin也已經很久沒有更新了,在使用方面也有局限性,比如:只支持在本機Docker的鏡像build、tag、push。
經過幾個插件的對比,發(fā)現(xiàn)Google開源的Jib插件功能更強大,它可以不寫Dockerfile,不需要在本地安裝Docker環(huán)境就能實現(xiàn)Docker打包,而且一直在更新,所以這里選擇這個插件作為我們的Docker打包插件。Jib構建Java的Docker和OCI映像,不需要在本機安裝Docker daemon,也不需要深入掌握Docker最佳實踐。它可以作為Maven和Gradle的插件以及Java庫使用。
下面介紹Jib( jib-maven-plugin插件 )如何將SpringBoot應用程序分層打包Docker鏡像,充分利用Docker的鏡像分層復用機制,解決網(wǎng)絡限制和占用大量磁盤空間的問題。
Jib( jib-maven-plugin插件 )構建的三個參數(shù):
我們這里主要使用buildTar命令,將Docker鏡像文件打包在本地,然后通過Jenkins插件發(fā)布到服務器運行,這樣可以不需要搭建使用私有Docker鏡像倉庫Harbor。
clean package -Ptest -Dimage=gitegg:1.0.1 jib:buildTar -f pom.xmldocker load --input jib-image.tar
install
build
私有倉庫地址/項目名稱/${project.artifactId}:${project.version}
私有倉庫用戶名
私有倉庫密碼
/tmp
/log
/gitegg
OCI 下面是SpringBoot項目中pom.xml的jib-maven-plugin插件配置信息:
······
······
3.3.2
······
······
com.google.cloud.tools
jib-maven-plugin
${jib.maven.plugin.version}
install
build
true
openjdk:11-jre
${docker.harbor.addr}/${docker.harbor.project}/${project.artifactId}:${project.version}
${docker.harbor.username}
${docker.harbor.password}
-Xms512m
-Xmx8g
/tmp
/log
/gitegg
Asia/Shanghai
USE_CURRENT_TIMESTAMP
前面我們講了如何安裝Docker,以及相關配置,所以這里不再贅述,直接按照自己的服務器實際情況進行安裝配置Docker即可,這里講解如何為運行SpringBoot的Fat Jar做環(huán)境準備,以及說明鏡像包傳輸?shù)椒掌髦髨?zhí)行的部署腳本。
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/logsecho "param validate"
if [ $# -lt 1 ]; then
echo "you must use like this : ./publish_docker_server.sh [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_portecho "執(zhí)行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 "執(zhí)行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.tarecho "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_nameecho "remove tmp " $image_name
rm -rf /opt/tmp/jib-image.tarecho "Docker Server is starting,please try to access $container_name conslone url"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 [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 "執(zhí)行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 "執(zhí)行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" clean package -Dmaven.test.skip=true -Ptest -Dimage=gitegg jib:buildTar -f pom.xml/opt/script/publish_docker_server.sh gitegg gitegg latest 8181 8080docker imagesdocker psdocker stop 容器iddocker rm 容器id
docker rmi 鏡像iddocker logs -f 容器iddocker exec -it 容器id /bin/bash 
我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網(wǎng)交流