本帖最后由 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文件
4、stock.sh
5、创建目录
- 将Dockerfile、docker-compose.yml、stock.sh、jar文件 将这个四个文件放在同一文件夹中。注意文件夹的替换
6、示例:
-
查看当前镜像、跟容器:docker images、docker ps -a
-
执行stock.sh脚本
-
再次查看镜像和容器 docker images、docker ps
-
验证 curl http://localhost:8182
可能会有的疑问:
-
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 指定网络
可能会遇到的问题:
-
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打包镜像推送至私有仓库、然后在目标服务器来取最新镜像运行。这种方案实现就比较复杂,但管理也相比较完善。
第一次写贴子、有错误或不足之处欢迎各位迎指正
|