CentOS服务器上搭建Jenkins+maven+GitLab(六)——Docker容器化构建的三种方式
CentOS服务器上搭建Jenkins+maven+GitLab(一)——环境搭建
CentOS服务器上搭建Jenkins+maven+GitLab(二)——创建一个maven项目
CentOS服务器上搭建Jenkins+maven+GitLab(三)——GitLab钩子实现自动化
CentOS服务器上搭建Jenkins+maven+GitLab(四)——Jenkins的构建触发器介绍
CentOS服务器上搭建Jenkins+maven+GitLab(五)——配置邮件通知功能
(1).实验环境
4核8G CentOS7.9.2009 192.168.142.102/103 GitLab(yum/docker)
1核1G CentOS7.9.2009 192.168.142.104 Jenkins+maven+git
1核1G CentOS7.9.2009 192.168.142.105 测试服务器(git+docker)
所有服务器均已设置阿里云yum源,并且yum -y install epel-release,关闭SELinux和防火墙。
以下内容基于CentOS服务器上搭建Jenkins+maven+GitLab(一)——环境搭建的环境继续构建。
(2).105测试服务器安装docker环境
1、安装docker,参考:Docker容器(一)——Docker的介绍与部署
2、获取镜像
最快的方法是直接使用已有的Docker容器镜像服务,但Docker官方提供的仓库https://hub.docker.com/需要魔法才能在浏览器上访问,docker search也一样。阿里云的容器镜像服务我试了不太行,然后找到了轩辕镜像https://xuanyuan.cloud/,以及他们在腾讯云上发布的文章:Docker 拉取部署 OpenJDK 全指南:替代方案、实操步骤与最佳实践。如果不会魔法,可以在轩辕镜像看中文版说明,他们类似于Docker官方仓库的中文版,可以作为中文说明文档使用。
官方仓库的 library/openjdk 已正式弃用,并建议所有用户尽快寻找并使用合适的替代方案,给出了一些其他官方镜像替代方案示例:amazoncorretto、eclipse-temurin、ibm-semeru-runtimes、ibmjava、sapmachine。我这里找了一下这5个镜像的区别,如下:
| 维护方 | 核心特点 | 适用场景 | |
| Amazon Corretto (amazoncorretto) | Amazon Web Services (AWS) | AWS 原生支持,深度集成 AWS 云服务(如 Lambda, ECS, EKS 等)。提供免费的长期支持(LTS),安全补丁发布速度极快(平均早于其他发行版 72 小时)。 | 部署在 AWS 云环境中的微服务、大数据处理(如 Apache Spark)以及金融级交易系统。 |
| Eclipse Temurin (eclipse-temurin) | Eclipse 基金会(由社区驱动,原 AdoptOpenJDK 的继任者) | 跨平台兼容性最强,支持 Windows、Linux、macOS 及多种架构(x86_64, ARM64 等)。它是社区公认的“企业级首选”,提供丰富的镜像变体(如 JDK/JRE、Alpine 轻量版、Debian 版等)。 | 大多数通用 Java 应用、跨平台部署、CI/CD 流水线以及需要极致镜像瘦身的微服务。 |
| IBM Semeru Runtimes (ibm-semeru-runtimes) | IBM | 底层采用 IBM 独立开发的 OpenJ9 JVM(而非传统的 HotSpot JVM)。OpenJ9 针对内存占用进行了极致优化,相比传统 HotSpot JVM 可节省约 30% 的内存,且支持类数据共享(CDS)以加快启动速度。 | 资源受限环境、高密度微服务部署、边缘计算节点(如 ARMv7 设备)以及内存敏感型应用。 |
| IBM Java (ibmjava) | IBM | 这是 IBM 较早推出的 Java 镜像,同样基于 OpenJ9 JVM,主打启动速度快。但相较于 ibm-semeru-runtimes,它属于较早期的版本,目前社区更推荐直接使用 Semeru Runtimes。 |
部分遗留系统或特定依赖该镜像的项目。需要注意的是,在某些特定依赖(如 CentOS 相关库)上可能存在兼容性问题。 |
| SAP Machine (sapmachine) | SAP | 专为 SAP 企业级生态打造,强调 Java SE 认证合规、长期支持(LTS)以及与上游 OpenJDK 同步的安全更新节奏。它在异常栈信息中增加了 host 与 jar 维度,增强了复杂分布式环境的可观测性。 | SAP 生态系统应用(如 S/4HANA、SAP Commerce)、Cloud Foundry 云平台部署,以及对合规性和稳定性要求极高的传统企业级应用。 |
总结建议:
-
- 通用与跨平台:首选
eclipse-temurin。 - AWS 云原生:首选
amazoncorretto。 - 极致省内存/微服务:首选
ibm-semeru-runtimes。 - SAP 业务生态:首选
sapmachine。
- 通用与跨平台:首选
这里我就以eclipse-temurin镜像做演示。
[root@localhost ~]# docker pull eclipse-temurin:25
25: Pulling from library/eclipse-temurin
6f5c5aa4e145: Pull complete
1c24335ddd46: Pull complete
566da077aa04: Pull complete
f1d819569f44: Pull complete
4f4fb700ef54: Pull complete
0c1ad4588d33: Pull complete
Digest: sha256:c2b7ea21649875fb9052237ac4e3cd4ef63968a2a389a0a1b1a72a5e53e5c93f
Status: Downloaded newer image for eclipse-temurin:25
docker.io/library/eclipse-temurin:25
还有一个笨方法,那就是自己做一个,参考:Docker容器(二)——镜像制作
(3).第1种方法:Docker调用物理机Jar包
这里新建了一个Spring Boot项目demo-2,当访问/hello时返回“Hello World!Spring boot web.”。
1)清理正在运行的容器
如果有历史容器运行,则将容器停止。项目名称-->配置-->Pre Steps(前置步骤)-->Add pre-build step(添加构建前置步骤)-->Send files or execute commands over SSH-->“Name”选择SSH服务器-->写入shell命令,如下:
#检查docker运行中的容器是否存在名为demo-2-first_method的容器,如果存在则停止该容器
if [ `docker ps --format "{{.Names}}" | grep demo-2-first_method` ];then
docker stop demo-2-first_method
fi
Shell命令各位根据自己的需求进行修改。




2)修改构建对象
Build-->Root POM

3)修改构建后操作
Post Steps-->Source files-->Remove prefix-->Exec command-->Save。
我这里Exec command简单写了一下,因为需要考虑备份、超时、多个jar包等因素,所以实际上更多是调用编辑好的shell脚本。docker的常用命令可以参考:Docker容器(四)——常用命令
注意:docker run -d java -jar 后面必须跟随具体文件。
cd /root
mkdir -p archive/`date +%Y%m%d`
mv archive/*.jar archive/`date +%Y%m%d`/
rm -rf demo-2/
mkdir -p demo-2/app
cp archive/`date +%Y%m%d`/*.jar demo-2/app
#判断名为demo-2-first_method的容器是否正在运行,如果为否则进入其中
if[ ! `docker ps --format "{{.Names}}" | grep demo-2-first_method` ];then
#判断名为demo-2-first_method的容器是否存在于历史容器中,如果为是则直接启动
if[ `docker ps -a --format "{{.Names}}" | grep demo-2-first_method` ];then
docker start demo-2-first_method
else
docker run -d -p 8080:8080 --name demo-2-first_method -v /root/demo-2/app:/opt/app eclipse-temurin:25 java -jar /opt/app/demo-2-0.0.1-SNAPSHOT.jar
fi
fi

4)测试
Jenkins点击立即构建。

代码中将“Hello World!Spring boot web.”改为“Hello World!”并提交,合并。

(4).第2种方法::Jar文件打包到Docker镜像中
1)准备dockerfile文件
注意:dockerfile中设置的基础镜像如果没有预下载,那么在docker build时会进行下载,可能会Jenkins导致超时。
这里会使用的dockerfile文件,一般来说是由开发者提供,我这里在demo-2目录下新建一个dockerfile,内容如下:
#构建的基础镜像,生产环境推荐使用更稳定的版本,以及使用JRE版本以减小体积
FROM eclipse-temurin:25
#声明容器在运行时监听的端口。这仅起到文档说明作用,并不会真正发布端口
EXPOSE 8080
#容器内创建应用地址
RUN mkdir -p /opt/app
#使用 ARG 接收构建时的参数
ARG BUILD_TIME
#设置环境变量。该变量在构建时和容器运行时均有效。
ENV BUILD_TIME=${BUILD_TIME}
#ADD功能与COPY类似,除了复制本地文件,它还支持自动解压 tar 压缩包,以及通过 URL 下载网络资源
ADD archive/$BUILD_TIME/demo-2-0.0.1-SNAPSHOT.jar /opt/app
#配置容器启动时的入口点。与 CMD 不同,它通常不会被 docker run 的命令行参数轻易覆盖(除非使用 --entrypoint),常与 CMD 结合使用来提供默认参数。
ENTRYPOINT ["java", "-jar", "/opt/app/demo-2-0.0.1-SNAPSHOT.jar"]
# 如果需要默认参数,可以加上 CMD,例如:
# CMD ["--spring.profiles.active=prod"]
2)清理已存在容器和镜像
修改Test01项目Pre Steps配置,将dockerfile文件复制到服务器上,并修改Exec command,其内容如下:
#检查docker运行中的容器是否存在名为demo-2-second_method的容器,如果存在则停止该容器
if [ `docker ps --format "{{.Names}}" | grep demo-2-second_method` ];then
docker stop demo-2-second_method
fi
#检查docker历史运行的容器是否存在名为demo-2-second_method的容器,如果存在删除该容器
if [ `docker ps -a --format "{{.Names}}" | grep demo-2-second_method` ];then
docker rm demo-2-second_method
fi
#检查docker镜像仓库是否存在名为demo-2-second_method的镜像,如果存在删除该镜像
if [ `docker images --format "{{.Repository}}" | grep demo-2-second_method` ];then
docker rmi demo-2-second_method
fi

3)修改构建后操作
修改Test01项目Post Steps配置中的Exec command,内容如下:
cd /root
mkdir -p archive/`date +%Y%m%d`
mv archive/*.jar archive/`date +%Y%m%d`/
#构建镜像
docker build --build-arg BUILD_TIME=`date +%Y%m%d` -t demo-2-second_method .
#运行容器
docker run -d --name demo-2-second_method -p 8080:8080 demo-2-second_method

4)测试
将返回内容改为"Hello World!将jar包打包到docker镜像中1",第一次合并。

将返回内容改为"Hello World!将jar包打包到docker镜像中2",第二次构建。

(5).第3种方法:将打包好的docker镜像上传至私有仓库,k8s集群调用
这里我就不演示了,有需要的先看:Docker容器(六)——创建docker私有化仓库,先将TestServer(105)服务器的/etc/docker/daemon.json配置文件中的地址指向私有化仓库,然后Jenkins中Post Steps配置中Exec command的docker run改为docker push。
再进一步自动化就需要配置k8s自动拉取私有仓库中同名镜像并运行,一般不会这么用,等有时间再开一篇K8s。
参考文档:https://cloud.tencent.com/developer/article/2611444

浙公网安备 33010602011771号