自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Jenkins部署SpringBoot的Docker鏡像步驟詳解

開發(fā) 架構(gòu)
下面介紹Jib( jib-maven-plugin插件 )如何將SpringBoot應(yīng)用程序分層打包Docker鏡像,充分利用Docker的鏡像分層復(fù)用機(jī)制,解決網(wǎng)絡(luò)限制和占用大量磁盤空間的問題。

前面我們介紹了K8S+Docker+Maven插件打包部署SpringCloud微服務(wù)項(xiàng)目,在實(shí)際應(yīng)用過程中,很多項(xiàng)目沒有用到K8S和微服務(wù),但是用到了Docker和SpringBoot,所以,我們這邊介紹,如果使用Jenkins+jib-maven-plugin插件打包部署SpringBoot項(xiàng)目的Docker鏡像。

網(wǎng)上有多種Docker打包插件使用說明,講解最多的是Spotify開源的,Spotify官方已不再推薦使用docker-maven-plugin插件進(jìn)行打包,而是推薦其最新的docker打包插件dockerfile-maven-plugin,但是dockerfile-maven-plugin也已經(jīng)很久沒有更新了,在使用方面也有局限性,比如:只支持在本機(jī)Docker的鏡像build、tag、push。

經(jīng)過幾個(gè)插件的對比,發(fā)現(xiàn)Google開源的Jib插件功能更強(qiáng)大,它可以不寫Dockerfile,不需要在本地安裝Docker環(huán)境就能實(shí)現(xiàn)Docker打包,而且一直在更新,所以這里選擇這個(gè)插件作為我們的Docker打包插件。Jib構(gòu)建Java的Docker和OCI映像,不需要在本機(jī)安裝Docker daemon,也不需要深入掌握Docker最佳實(shí)踐。它可以作為Maven和Gradle的插件以及Java庫使用。

下面介紹Jib( jib-maven-plugin插件 )如何將SpringBoot應(yīng)用程序分層打包Docker鏡像,充分利用Docker的鏡像分層復(fù)用機(jī)制,解決網(wǎng)絡(luò)限制和占用大量磁盤空間的問題。

Jib( jib-maven-plugin插件 )構(gòu)建的三個(gè)參數(shù):

  • buildTar:本地構(gòu)建,不需要Docker daemon就可以將鏡像生成tar文件,保存在工程的target目錄下。
  • dockerBuild:將構(gòu)建的鏡像存到當(dāng)前環(huán)境的Docker daemon。
  • build:將構(gòu)建的鏡像推送到遠(yuǎn)程倉庫,官方倉庫或者Harbor私有倉庫。

一、SpringBoot項(xiàng)目jib-maven-plugin插件配置說明

我們這里主要使用buildTar命令,將Docker鏡像文件打包在本地,然后通過Jenkins插件發(fā)布到服務(wù)器運(yùn)行,這樣可以不需要搭建使用私有Docker鏡像倉庫Harbor。

  • 打包命令:
    -Dimage可以在打包時(shí)自定義鏡像名稱和版本,這個(gè)可以在Jenkins腳本時(shí)使用,如果不配置默認(rèn)使用pom.xml里面配置的鏡像名稱和版本,如果不設(shè)置版本,默認(rèn)版本是latest。
clean package -Ptest -Dimage=gitegg:1.0.1 jib:buildTar -f pom.xml
  • docker鏡像載入命令:
    docker load用來載入鏡像包,但是不能對載入的鏡像重命名;docker import用來載入容器包,但兩者都會(huì)恢復(fù)為鏡像,可以為鏡像指定新名稱;經(jīng)過測試,jib-maven-plugin插件生成的Docker鏡像文件jib-image.tar只能通過docker load載入,并且在pom.xml配置中format不能選擇OCI(K8S時(shí)使用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,當(dāng)然這里不需要,但是可以配置鏡像名稱和鏡像版本,當(dāng)在運(yùn)行打包命令時(shí),沒有加參數(shù)-Dimage,就會(huì)取此處的配置。
<to>
                            <image>私有倉庫地址/項(xiàng)目名稱/${project.artifactId}:${project.version}</image>
                            <auth>
                                <username>私有倉庫用戶名</username>
                                <password>私有倉庫密碼</password>
                            </auth>
                        </to>
  • volumes 創(chuàng)建容器內(nèi)的目錄,當(dāng)SpringBoot項(xiàng)目記錄日志等需要自定義的目錄地址時(shí),此處需要定義容器內(nèi)的目錄;SpringBoot使用的內(nèi)嵌Tomcat容器默認(rèn)使用/tmp作為工作目錄,這里可以不配置/tmp的valumes。
<!-- 容器內(nèi)的目錄 -->
                            <volumes>
                                <value>/tmp</value>
                                <value>/log</value>
                            </volumes>
  • workingDirectory 容器內(nèi)的工作目錄,容器啟動(dòng)時(shí)執(zhí)行的命令會(huì)在容器內(nèi)的此目錄下執(zhí)行。
<workingDirectory>/gitegg</workingDirectory>
  • format 使用OCI構(gòu)建OCI容器映像。這里直接注釋掉不要使用,否則docker load時(shí)不能載入,在K8S里面可以使用,所以這里不使用這個(gè)format。
<!--K8S時(shí),使用OCI,單獨(dú)只用docker load會(huì)報(bào)錯(cuò),所以這里不使用這個(gè)format-->
<format>OCI</format>

下面是SpringBoot項(xiàng)目中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,會(huì)有問題,需要設(shè)置sendCredentialsOverHttp=true-->
                    <executions>
                        <execution>
                            <phase>install</phase>
                            <goals>
                                <goal>build</goal>
                            </goals>
                        </execution>
                    </executions>
                    <configuration>
                        <!--允許非https-->
                        <allowInsecureRegistries>true</allowInsecureRegistries>
                        <!-- 相當(dāng)于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內(nèi)存參數(shù)-->
                            <jvmFlags>
                                <jvmFlag>-Xms512m</jvmFlag>
                                <jvmFlag>-Xmx8g</jvmFlag>
                            </jvmFlags>
                            <!-- 容器內(nèi)的目錄-->
                            <volumes>
                                <value>/tmp</value>
                                <value>/log</value>
                            </volumes>
                            <workingDirectory>/gitegg</workingDirectory>
                            <environment>
                                <TZ>Asia/Shanghai</TZ>
                            </environment>
                            <!--使用該參數(shù)保證鏡像的創(chuàng)建時(shí)間與系統(tǒng)時(shí)間一致-->
                            <creationTime>USE_CURRENT_TIMESTAMP</creationTime>
                            <!--K8S時(shí),使用OCI,非K8S時(shí),load會(huì)報(bào)錯(cuò)-->
<!--                            <format>OCI</format>-->
                        </container>
                    </configuration>
                </plugin>

二、服務(wù)器Docker運(yùn)行環(huán)境配置

前面我們講了如何安裝Docker,以及相關(guān)配置,所以這里不再贅述,直接按照自己的服務(wù)器實(shí)際情況進(jìn)行安裝配置Docker即可,這里講解如何為運(yùn)行SpringBoot的Fat Jar做環(huán)境準(zhǔn)備,以及說明鏡像包傳輸?shù)椒?wù)器之后執(zhí)行的部署腳本。

1、部署及備份目錄準(zhǔn)備

  • 新建 /opt/tmp 目錄,用于Jenkins打包后,通過 Publish Over SSH插件將包傳輸?shù)椒?wù)器的臨時(shí)目錄。
  • 新建 /opt/bak 目錄,用于存儲(chǔ)所有部署過的包備份,方便后續(xù)版本回滾。此目錄可能會(huì)占用很大空間,所以需要選擇一個(gè)磁盤空間大的掛載目錄。
  • 新建 /opt/script 目錄,用于Jenkins將包傳輸完成之后,執(zhí)行安裝、備份操作的相關(guān)命令腳本。
  • 新建 /data/container/docker_server/tmp 目錄,用于映射容器內(nèi)/tmp目錄,/tmp目錄是SpringBoot內(nèi)置Tomcat默認(rèn)運(yùn)行目錄。
  • 新建 /data/container/docker_server/logs目錄,用于映射容器內(nèi)/var/log目錄,/var/log目錄是項(xiàng)目配置的日志存放目錄,映射到宿主機(jī)之后,方便查看不同級(jí)別的日志。
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、部署腳本編寫說明

  • 定義入?yún)?,可以通過Jenkins任務(wù)將參數(shù)傳入腳本中,我們定義了下面5個(gè)參數(shù):
    container_name=gitegg-server : 容器名稱image_name=gitegg-server : 鏡像名稱version=latest : 鏡像版本image_port=8182 : 宿主主機(jī)端口映射server_port=8080 : 容器內(nèi)服務(wù)端口
  • 對參數(shù)進(jìn)行檢查,是否未傳入?yún)?shù),這里根據(jù)自己的實(shí)際情況判斷,比如必須傳入哪些參數(shù),就設(shè)置參數(shù)的個(gè)數(shù)不能小于幾。
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
  • 入?yún)①x值,如果有參數(shù)傳入,則取服務(wù)參數(shù),如果沒有參數(shù)傳入則取默認(rèn)值
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
  • 執(zhí)行安裝鏡像包命令
echo "docker load" $image_name
docker load --input /opt/tmp/jib-image.tar
  • 執(zhí)行運(yùn)行命令
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
  • 刪除安裝文件,因?yàn)榍懊嬉呀?jīng)備份過了,所以這里將臨時(shí)安裝文件刪除
echo "remove tmp " $image_name
rm -rf /opt/tmp/jib-image.tar
  • 打印執(zhí)行完成的命令
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 "執(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"

三、新建Jenkins配置打包任務(wù),部署SpringBoot項(xiàng)目Docker鏡像

1、Dashboard > 新建任務(wù),輸入任務(wù)名稱,選擇“構(gòu)建一個(gè)maven項(xiàng)目”,點(diǎn)擊確定。

2、項(xiàng)目配置,進(jìn)入到任務(wù)配置頁

  • 丟棄舊的構(gòu)建 :這里在保持構(gòu)建的最大個(gè)數(shù)填寫5,當(dāng)然可以根據(jù)自己情況填寫,否則舊的構(gòu)建包會(huì)一直存在占用磁盤空間。

  • 源碼管理:配置git代碼地址、用戶名密碼和版本分支,如果是需要用戶名密碼的git庫,那么下面需要選擇訪問的用戶名密碼,這里一定要使用用戶名密碼方式,使用token的方式無法選中。可以在下方add,也可以在Jenkins全局Credentials 中添加,方便其它任務(wù)使用。

  • 構(gòu)建觸發(fā)器:可選可不選,這個(gè)根據(jù)自己的需求選擇,任務(wù)在什么情況下出發(fā)構(gòu)建。

  • 構(gòu)建環(huán)境:這里不需要選擇,在介紹構(gòu)建NodeJS項(xiàng)目時(shí),需要選中NodeJS環(huán)境。

  • Build:這里填寫Maven打包命令,可以添加參數(shù)選擇打包環(huán)境test或prod,定義鏡像名稱和版本等。
clean package -Dmaven.test.skip=true -Ptest -Dimage=gitegg jib:buildTar -f pom.xml

  • Post Steps:將打包后的文件發(fā)送到服務(wù)器,并執(zhí)行設(shè)置好的腳本,這里選擇Run only if build succeeds,當(dāng)構(gòu)建成功時(shí)Post。

  • Exec command:將打好的包發(fā)布到環(huán)境之后,在環(huán)境上執(zhí)行的部署腳本命令。publish_docker_server.sh 是腳本文件、第一個(gè)gitegg 是容器名稱、第二個(gè)gitegg 是鏡像名稱、latest 是鏡像版本、8181 是宿主機(jī)端口號(hào)、8080 是容器內(nèi)服務(wù)口號(hào)。
/opt/script/publish_docker_server.sh gitegg gitegg latest 8181 8080

3、運(yùn)行構(gòu)建任務(wù)

  • 立即構(gòu)建

  • 查看構(gòu)建日志:點(diǎn)擊立即構(gòu)建之后,下方會(huì)出現(xiàn)進(jìn)度條,點(diǎn)擊進(jìn)度條就可以進(jìn)入構(gòu)建日志界面。

  • 構(gòu)建成功后,下方會(huì)給出構(gòu)建成功提示,此時(shí)登錄遠(yuǎn)程服務(wù)器查看文件是否部署成功即可。

4、Docker鏡像部署成功之后,可以使用以下Docker常用命令查看運(yùn)行情況

  • 查看鏡像
docker images
  • 查看有哪些容器在運(yùn)行
docker ps
  • 停止容器
docker stop 容器id
  • 刪除容器、刪除鏡像
docker rm 容器id
docker rmi 鏡像id
  • 查看容器運(yùn)行日志
docker logs -f 容器id
  • 進(jìn)入到容器
docker exec -it 容器id /bin/bash
責(zé)任編輯:姜華 來源: 今日頭條
相關(guān)推薦

2023-09-08 23:30:19

2023-09-14 20:55:52

NodeJSDocker

2023-09-12 07:06:04

2010-08-10 13:22:02

2009-07-17 13:17:48

部署Eclipse R

2010-06-03 10:51:09

Hadoop安裝部署

2023-09-08 08:14:14

2013-09-18 14:46:32

StormStorm集群

2022-08-04 10:39:23

Jenkins集成CD

2021-09-08 06:51:53

DockerCoupons項(xiàng)目

2024-03-26 00:00:01

2024-08-12 09:54:00

2009-03-19 11:02:47

Windows Emb

2024-01-05 07:47:04

SpringBootJavajar啟動(dòng)

2024-05-06 08:07:01

Spring項(xiàng)目Java

2010-05-28 12:32:50

2015-07-21 14:38:02

Docker部署

2020-11-16 09:05:08

Docker架構(gòu)容器

2019-07-16 14:44:52

DockerMySQL操作系統(tǒng)

2023-07-03 08:52:31

容器Golang
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)