1. 需求
当前的操作流程是:
将springboot项目上传到svn库以后,执行jenkins的build操作,然后jenkins build完以后将项目jar包复制到目标服务器上,通过启动脚本来启动jar包
需要做到的功能是:
将SpringBoot项目上传到svn库以后,执行jenkins的build操作时,jenkins在构建项目后会将项目打成docker镜像,并且将镜像上传到私服,最后jenkins控制目标服务器从私服拉取镜像并启动。
2. 首先需要在jenkins服务器和目标服务其上面安装docker
2.1 安装docker
- 检查内核版本,必须是3.10及以上
uname -r
- 安装docker
yum install docker
- 启动docker
systemctl start docker
- 查看docker 版本
docker -v
或者docker version
- 开机启动docker
systemctl enable docker
- 停止docker
systemctl stop docker
ps: 理论上应该是一切顺利的,但是实际上在安装的过程中也许就会遇到一些问题,比如内核版本过低,比如网络防火墙,比如不支持systemctl等等原因。这里不再追溯,因为问题可能千奇百怪。
2.1 docker配置远程访问
这步操作的目的是让docker可以远程访问你,这样程序就可以在其他机器上将镜像打包到docker所在的机器上了。
-
修改/usr/lib/systemd/system/docker.service
重新加载配置文件
systemctl daemon-reload
重启服务
systemctl restart docker.service
-
查看端口是否开启
netstat -nptl
- 直接curl看是否生效
curl http://127.0.0.1:2375/info
3. 配置私服
docker 的仓库是docker hub,我们使用自己的私服harbor
3.1 搭建harbor
略
在harbor上创建项目
3.2 docker 连接私服
- 修改/etc/docker/daemon.json
{
"insecure-registries":["ip"],
"registry-mirrors": ["https://registry.docker-cn.com"]
}
修改完以后,重启docker
登陆私服
docker login ip
ip就是私服的ip,然后需要填写harbor的用户名和密码
完了之后,可以在/root/.docker/config.json看到信息
{
"auths": {
"ip": {
"auth": "emhvdWh1aTpaaG91aHVpMTIzNDU2"
}
}
}
可以检验一下,私服能不能用,先从docker hub上拉下来一个镜像,然后把它上传到私服上去。
- 搜索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 项目打镜像并上传私服
需要引入maven插件docker-maven-plugin
4.1 无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服务器,前面配置docker远程访问的作用就在此,会将docker构建在dockerHost配置的机器上 - imageName
镜像名称 - serverId
配置上传远程私服的serverId,需要在maven的setting.xml文件中配置对应的server
<servers>
<server>
<id>harbor</id>
<username>harbor的用户名</username>
<password>harbor的密码</password>
</server>
</servers>
registryUrl
私服的urlbaseImage
底包entryPoint
镜像入口forceTags
覆盖之前相同tag的镜像imageTags
镜像的tag,可制定多个
执行打包上传命令
mvn clean package docker:build -DskipTests -DpushImageTag
在目标机器上就会有镜像,并且push到了远程
4.2 dockerfile方式
在比较简单的场景下,不使用dockerfile就可以都建docker了,但是复杂一点的情况,就需要使用dockerfile了,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>
<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将所有流程串起来
5.1 在jenkins的maven中添加构建和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文件
因为settings.xml中包含了harbor的用户名密码的server
5.3 post steps中控制目标服务器拉取镜像并运行
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:开放端口
--add-host ahhx-yf-elkserver-node03:ip:添加host
到此结束,构建jenkins的时候,就会自动执行docker的一系列操作了。