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(五)——配置邮件通知功能

   Docker容器化构建大致可分为三种方式:
    1、Docker镜像内置JDK,jar包存放在物理机上,使用docker数据映射功能,将物理机存放jar包的目录映射到容器实例中。这种方式适合小型团队的中小型项目,更新时一般只要将本机存放的jar包替换,然后重启docker。
    2、使用dockerfile文件,将jar包直接打包到镜像中,自动化制作新的镜像,然后根据新的镜像生成容器运行。这种方式适合云原生环境的中小型项目。
    3、在第二种方法的基础上,将制作好的镜像直接发送到docker私有化仓库(例如:harbor、JFrog Artifactory(一种通用制品库)),然后由k8s集群拉取仓库中的镜像,然后运行。这种方式适合云原生环境的大型项目。

 (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命令各位根据自己的需求进行修改。

image

image

image

image

  2)修改构建对象

    Build-->Root POM

image

  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

image

  4)测试

    Jenkins点击立即构建。

image

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

image

(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

image

  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

image

  4)测试

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

image

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

image

(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

posted @ 2026-06-06 17:32  苦逼运维  阅读(8)  评论(0)    收藏  举报