SpringBoot項(xiàng)目整合Jenkins打包docker并上傳私服

1. 需求

當(dāng)前的操作流程是:
將springboot項(xiàng)目上傳到svn庫(kù)以后,執(zhí)行jenkins的build操作,然后jenkins build完以后將項(xiàng)目jar包復(fù)制到目標(biāo)服務(wù)器上,通過(guò)啟動(dòng)腳本來(lái)啟動(dòng)jar包

需要做到的功能是:

將SpringBoot項(xiàng)目上傳到svn庫(kù)以后,執(zhí)行jenkins的build操作時(shí),jenkins在構(gòu)建項(xiàng)目后會(huì)將項(xiàng)目打成docker鏡像,并且將鏡像上傳到私服,最后jenkins控制目標(biāo)服務(wù)器從私服拉取鏡像并啟動(dòng)。

2. 首先需要在jenkins服務(wù)器和目標(biāo)服務(wù)其上面安裝docker

2.1 安裝docker

  • 檢查內(nèi)核版本,必須是3.10及以上
    uname -r
  • 安裝docker
    yum install docker
  • 啟動(dòng)docker
    systemctl start docker
  • 查看docker 版本
    docker -v
    或者docker version
  • 開(kāi)機(jī)啟動(dòng)docker
    systemctl enable docker
  • 停止docker
    systemctl stop docker

ps: 理論上應(yīng)該是一切順利的,但是實(shí)際上在安裝的過(guò)程中也許就會(huì)遇到一些問(wèn)題,比如內(nèi)核版本過(guò)低,比如網(wǎng)絡(luò)防火墻,比如不支持systemctl等等原因。這里不再追溯,因?yàn)閱?wèn)題可能千奇百怪。

2.1 docker配置遠(yuǎn)程訪(fǎng)問(wèn)

這步操作的目的是讓docker可以遠(yuǎn)程訪(fǎng)問(wèn)你,這樣程序就可以在其他機(jī)器上將鏡像打包到docker所在的機(jī)器上了。

  • 修改/usr/lib/systemd/system/docker.service


    不要忘記最后的斜杠
  • 重新加載配置文件
    systemctl daemon-reload

  • 重啟服務(wù)
    systemctl restart docker.service

  • 查看端口是否開(kāi)啟
    netstat -nptl

    image.png

3. 配置私服

docker 的倉(cāng)庫(kù)是docker hub,我們使用自己的私服harbor

3.1 搭建harbor

在harbor上創(chuàng)建項(xiàng)目


3.2 docker 連接私服

  • 修改/etc/docker/daemon.json
{
        "insecure-registries":["ip"],
        "registry-mirrors": ["https://registry.docker-cn.com"]
}
  • 修改完以后,重啟docker

  • 登陸私服
    docker login ip
    ip就是私服的ip,然后需要填寫(xiě)harbor的用戶(hù)名和密碼

完了之后,可以在/root/.docker/config.json看到信息

{
        "auths": {
                "ip": {
                        "auth": "emhvdWh1aTpaaG91aHVpMTIzNDU2"
                }
        }
}

可以檢驗(yàn)一下,私服能不能用,先從docker hub上拉下來(lái)一個(gè)鏡像,然后把它上傳到私服上去。

  • 搜索kafka鏡像
    docker search kafka
  • 拉取kafka鏡像
    docker pull docker.io/spotify/kafka
  • 上傳到私服

給鏡像添加tag
docker tag docker.io/spotify/kafka:latest ip/jcpt/docker.io/spotify/kafka

上傳到私服
docker push ip/jcpt/docker.io/spotify/kafka:latest

4. Spring Boot 項(xiàng)目打鏡像并上傳私服

需要引入maven插件docker-maven-plugin

4.1 無(wú)dockerfile方式

  • 修改pom文件
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>1.2.0</version>
                <configuration>
                    <dockerHost>http://ip:2375</dockerHost>
                    <imageName>ip/jcpt/jcpt-java8-jre</imageName>
                    <serverId>harbor</serverId>
                    <registryUrl>ip/jcpt/</registryUrl>
                    <baseImage>fabric8/java-alpine-openjdk8-jre</baseImage>
                    <entryPoint>["java", "-jar", "./jcpt.jar"]</entryPoint>
                    <forceTags>true</forceTags>
                    <imageTags>
                        <imageTag>2.0.13</imageTag>
                        <imageTag>latest</imageTag>
                    </imageTags>
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                </configuration>
            </plugin>
  • dockerHost
    打包docker鏡像的docker服務(wù)器,前面配置docker遠(yuǎn)程訪(fǎng)問(wèn)的作用就在此,會(huì)將docker構(gòu)建在dockerHost配置的機(jī)器上
  • imageName
    鏡像名稱(chēng)
  • serverId
    配置上傳遠(yuǎn)程私服的serverId,需要在maven的setting.xml文件中配置對(duì)應(yīng)的server
  <servers>
    <server>
        <id>harbor</id>
        <username>harbor的用戶(hù)名</username>
        <password>harbor的密碼</password>
    </server>
  </servers>
  • registryUrl
    私服的url

  • baseImage
    底包

  • entryPoint
    鏡像入口

  • forceTags
    覆蓋之前相同tag的鏡像

  • imageTags
    鏡像的tag,可制定多個(gè)

執(zhí)行打包上傳命令

mvn clean package docker:build -DskipTests -DpushImageTag

在目標(biāo)機(jī)器上就會(huì)有鏡像,并且push到了遠(yuǎn)程

4.2 dockerfile方式

在比較簡(jiǎn)單的場(chǎng)景下,不使用dockerfile就可以都建docker了,但是復(fù)雜一點(diǎn)的情況,就需要使用dockerfile了,dockerfile有一些自己的語(yǔ)法,這里只是簡(jiǎn)單使用

  • 修改pom文件
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>1.2.0</version>
                <configuration>
                    <dockerHost>http://ip:2375</dockerHost>
                    <imageName>ip/jcpt/jcpt-java8-jre</imageName>
                    <serverId>harbor</serverId>
                    <registryUrl>ip/jcpt/</registryUrl>
                    <dockerDirectory>src/main/docker</dockerDirectory>
                    <forceTags>true</forceTags>
                    <imageTags>
                        <imageTag>2.0.13</imageTag>
                        <imageTag>latest</imageTag>
                    </imageTags>
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                </configuration>
            </plugin>

使用dockerDirectory指定dockerfile文件所在的位置,不需要entryPoint和baseImage了,這些都放在dockerfile文件指定了。

  • dockerfile文件
FROM fiadliel/java8-jre
ADD /jcpt.jar //
ENTRYPOINT ["java", "-jar", "./jcpt.jar"]

同樣使用上面的打包命令
mvn clean package docker:build -DskipTests -DpushImageTag

5. 整合Jenkins將所有流程串起來(lái)

5.1 在jenkins的maven中添加構(gòu)建和push docker的指令

clean package docker:build -DskipTests -DpushImageTag -Dproject.build.finalName=${BUILD_NAME} -Dnacos.server=${cloud.nacos} -P${mode}

5.2 在jenkins的maven中指定settings.xml文件

因?yàn)閟ettings.xml中包含了harbor的用戶(hù)名密碼的server


5.3 post steps中控制目標(biāo)服務(wù)器拉取鏡像并運(yùn)行

docker pull 192.168.206.61/jcpt/jcpt-java8-jre:latest
docker run -d --name jcpt --add-host ahhx-yf-elkserver-node01:ip --add-host ahhx-yf-elkserver-node02:ip --add-host ahhx-yf-elkserver-node03:ip -p 9099:9099 ip/jcpt/jcpt-java8-jre:latest

ps:
-p 9099:9099:開(kāi)放端口
--add-host ahhx-yf-elkserver-node03:ip:添加host

到此結(jié)束,構(gòu)建jenkins的時(shí)候,就會(huì)自動(dòng)執(zhí)行docker的一系列操作了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容