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
- 直接curl看是否生效
curl http://127.0.0.1:2375/info
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
私服的urlbaseImage
底包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的一系列操作了。




