吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 633|回复: 8
收起左侧

[学习记录] jenkins发布springboot应用到docker中

  [复制链接]
xudaodesu 发表于 2025-11-24 12:48
本帖最后由 xudaodesu 于 2025-11-24 18:10 编辑

Jenkins发布springboot应用到docker

Jenkins已经具备发布springboot程序到服务器中、只是没有集成到docker中再看,Jenkins也不需要装docker相关插件。

大致流程:Jenkins打包jar发送到服务器上->jenkins在通过执行shell脚本启动程序->shell脚本通过Dockerfile将springboot应用做成镜像,再用docker-compose来启动容器

1、环境要求:

1、docker已安装
2、docker-compose已安装

2、Dockerfile将springboot应用做成镜像

  • Dockerfile:

    # 配置jdk基础镜像
    FROM openjdk:8u342
    # 设置环境变量
    ENV LANG=zh_CN.UTF-8
    ENV LANGUAGE=zh_CN.UTF-8
    ENV LC_ALL=zh_CN.UTF-8
    ENV TZ=Asia/Shanghai
    ENV appJar=/app/stock/stock.jar(your-application)
    # 暴露服务端口
    # EXPOSE 8182
    # 设置工作目录
    WORKDIR /app/stock
    #启动命令 注意:/app/stock/stock.jar 是WORKDIR的值加上jar
    ENTRYPOINT ["java","-jar","/app/stock/stock.jar"]

    Dockerfile是将springboot应用做成镜像文件。注意:Dockerfile文件名就叫Dockerfile没有其他后缀

3、docker-compose.yml文件

  • docker-compose

    version: '3.3'
    services:
    stock: #服务名
      build: . #build Dockerfile文件
      container_name: xj-stock  #容器名
      restart: always #设置容器自动重启
      ports:
        - 8182:8182  #映射docker容器端口 第一个8182是代表springboot-web程序的端口,第二个8182代表服务器对外暴露的端口
      volumes:
        - /home/temp/stock:/app/stock  #挂载文件夹 /home/temp/stock:服务器目录(jar文件所在目录),/app/stock:容器工作目录就是Dockerfile中设置WORKDIR的值

4、stock.sh

  • stock.sh

    # 停止正在运行的容器,并删除容器、默认网络和为服务创建的镜像(如果有)
    docker-compose down
    # 打包镜像以及启动容器
    docker-compose up --build -d
    #映射日志
    nohup docker-compose logs -f --tail=500 snowflake >console.out 2>&1   &

5、创建目录

  • 将Dockerfile、docker-compose.yml、stock.sh、jar文件 将这个四个文件放在同一文件夹中。注意文件夹的替换

6、示例:

image.png

  1. 查看当前镜像、跟容器:docker images、docker ps -a

    image.png
    image.png

  2. 执行stock.sh脚本

    image.png

  3. 再次查看镜像和容器 docker images、docker ps

    image.png

    image.png

  4. 验证 curl http://localhost:8182

    image.png

可能会有的疑问:

  • 1、dockerfile中不没有把jar文件复制到容器中:

    因为在docker-compose.yml中把包含jar文件的目录映射到了docker容器工作目录
    就是这句话:- /home/temp/stock:/app/stock  #挂载文件夹
    ​                           /home/temp/stock:服务器目录(jar文件所在目录)
    ​                            /app/stock:容器工作目录就是Dockerfile中设置WORKDIR的值

  • 2、容器控制台的日志如何映射:

    在shell脚本中: nohup docker-compose logs -f --tail=500 snowflake >console.out 2>&1   &
    这种映射控制台日志比较简单、也会用弊端。日志会延 迟

  • 3、jar程序如果通过需要访问本机的redis、mysql之类的,恰好又在本机容器中:需要修改docker-compose.yml指定和redis、mysql相同的网络。百度搜索 docker-compose.yml 指定网络

    image.png

可能会遇到的问题:

  • 1、docker Error: Unable to access jarfile

    这是因为docker-compose.yml中映射的服务器目录中没有包含jar文件、还是参考这句修改:- /home/temp/stock:/app/stock  #挂载文件夹
    ​    /home/temp/stock:服务器目录(jar文件所在目录),
    ​    /app/stock:容器工作目录就是 Dockerfile中设置WORKDIR的值                              

    2、 Caused by: java.util.concurrent.ExecutionException: org.redisson.client.RedisConnectionException: Unable to connect to Redis server: localhost/127.0.0.1:6379  :

    这是因为jar项目中有用localhost访问本机的其他程序、建议将localhost换成ip去访问即可。
    如果实现起来问题比较多、建议:先将jar做成镜像用docker原生命令看能不能跑起来,如果能跑起来说明镜像制作没问题。再试着用docker-compose看能不能启动容器看能不能运行,最后在整合shell脚本。
    这里面也还有很多没有提及到、像容器的启动命令是在dockerfile中还是在docker-compose中比较好。
    集成docker的方式、Jenkins滚动发布、日志处理相关问题。这里采用比较简单粗暴的方式去集成docker(主要是通过shell脚本执行)、也还可以搭建私用镜像仓库、Jenkins打包镜像推送至私有仓库、然后在目标服务器来取最新镜像运行。这种方案实现就比较复杂,但管理也相比较完善。
    第一次写贴子、有错误或不足之处欢迎各位迎指正

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
outdoorreadbook + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

苏紫方璇 发表于 2025-11-24 13:44
好好排一下版吧,论坛编辑器支持插入代码框或者使用markdown的
cyberjoo 发表于 2025-11-24 15:54
感觉jenkins还是直接java -jar启动更方便一些,指定数据存储位置即可,不过还是感谢分享
liran88540773 发表于 2025-12-26 10:59
jiatengxian 发表于 2026-1-20 14:43
个人建议:仅供参考
1、没有看到jenkinsfile,不太清楚你的打包过程
2、根据您描述的“”Jenkins打包jar发送到服务器上->jenkins在通过执行shell脚本启动程序->shell脚本通过Dockerfile将springboot应用做成镜像,再用docker-compose来启动容器-“”  有此判断您的jenkins只是执行了一个maven编译,和一个shell脚本
建议:
1、jenkins是一个全流程的操作,您上述所有的操作都可以通过jenkinsfile来实现
2、可以考虑将shell操作写到jenkinsfile中这样方便管理,可观看及可改造性更强
3、推荐看一下jenkins的pipeline语法
 楼主| xudaodesu 发表于 2026-1-22 09:46
jiatengxian 发表于 2026-1-20 14:43
个人建议:仅供参考
1、没有看到jenkinsfile,不太清楚你的打包过程
2、根据您描述的“”Jenkins打包jar ...

感谢、感谢。再请问下、有没有基于Jenkins实现镜像回滚的方案呢?就是回到上次打包的镜像
jiatengxian 发表于 2026-1-22 09:57
xudaodesu 发表于 2026-1-22 09:46
感谢、感谢。再请问下、有没有基于Jenkins实现镜像回滚的方案呢?就是回到上次打包的镜像

看你打包出来的镜像是latest ,
你可以在打包过程中把latest改成时间或者是其他 ,每次不一样,
需要回滚直接在yml中替换image的镜像名就可以

LiuJH180 发表于 2026-1-24 14:35
是不是漏了空值
 楼主| xudaodesu 发表于 2026-1-26 10:16

漏了,具体什么空值?
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-2-20 15:45

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表