丝滑的打包部署,一套带走

👉 这是一个或许对你有用的社群

🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料: 

652d03e5fad64ac33dceb258a6bdc32f.gif

👉这是一个或许对你有用的开源项目

国产 Star 破 10w+ 的开源项目,前端包括管理后台 + 微信小程序,后端支持单体和微服务架构。

功能涵盖 RBAC 权限、SaaS 多租户、数据权限、商城、支付、工作流、大屏报表、微信公众号、CRM 等等功能:

  • Boot 仓库:https://gitee.com/zhijiantianya/ruoyi-vue-pro

  • Cloud 仓库:https://gitee.com/zhijiantianya/yudao-cloud

  • 视频教程:https://doc.iocoder.cn

【国内首批】支持 JDK 21 + SpringBoot 3.2.2、JDK 8 + Spring Boot 2.7.18 双版本 

来源:悟空聊架构


一、背景

3cc20c8531f98b34f7ff434bb9f72dc3.png
Docker打包部署方案

项目背景 :新项目的后端框架是刚起步,搭建的是一套微服务框架,基础服务有网关 Gateway, Nacos 注册中心,以及其他的微服务。现在需要弄个简单且方便的,基于 Docker 的部署方式。

为什么用 Docker :为了让后端程序更容易打包部署和管理,所以用上了 Docker 容器化部署。比如用 Docker Swarm 或 K8s 来管理多个容器。

为什么要提到 Windows :本地机器是 Windows 系统开发,通过 Windows + IDEA 将应用程序打成 Docker 镜像,然后拷贝到 Linux 服务器进行容器化部署。

  • 疑问1 :有同学可能会有疑问,Windows 还能跑 Docker 吗???那必须的!

  • 疑问2 :如果项目的代码改了,是不是得重新打包 docker 镜像?不需要,直接替换 docker volume 里面的 JAR 包即可。

  • 疑问3:怎么没有用 Jenkins?新项目,新项目,牛奶和面包都会有的。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro

  • 视频教程:https://doc.iocoder.cn/video/

二、Windows 运行 Docker

2.1 原理

为了在 Windows 能够打包 Docker 镜像,就必须弄个可以运行 Docker 的环境。

Docker 依赖于已存在并运行的 Linux 内核环境。实质上是在已经运行的 Linux 下制造了一个隔离的文件环境,因此它执行的效率几乎等同于所部署的 Linux 主机。

如果其他系统想部署 Docker 就必须安装一个虚拟 Linux 环境。

2.2 启用 Hyper-V

f6dc570334e822d61bad50f762099723.png
Windows+虚拟机+Docker

Windows 自带的 Hyper-V 工具就是一款管理和创建虚拟机的工具,要求:Windows 10 企业版、专业版或教育版。启用 Hyper-V 如下所示:

2fde4eb664e37a339aedba4451d5b665.png
启用 Hyper-V

操作步骤:程序和功能->打开或关闭 Windows 功能->选择“Hyper-V”,然后单击“确定

参考链接:

https://learn.microsoft.com/zh-cn/virtualization/hyper-v-on-windows/quick-start/enable-hyper-v

2.3 安装 Docker for Windows

点击 官网下载地址,并下载 Windows 的版本,安装就是一路点击 next 就好了。

官网下载地址:https://www.docker.com/products/docker-desktop/

安装好之后,打开 Windows 的Powershell 命令行窗口,执行 docker run hello-world。当看到 Hello from Docker!就表示安装成功。

ee2992677e0489a32fc9fcfb2c4ac9f2.png

好了,现在我们开发环境拥有了运行 docker 容器,打包 docker 镜像的能力。接下来我们来看下如何用 IDEA 开发工具来启动 docker 容器和打包镜像。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud

  • 视频教程:https://doc.iocoder.cn/video/

三、IDEA 打包镜像

IDEA 工具很强大,提供 Docker 相关的功能。

IDEA 打包 Docker 镜像的方式主要分为这么几步:

  • 通过 Maven 工具将 SpringBoot 应用程序打成可执行的 JAR 包。

  • IDEA 执行指定的 Dockerfile 打包成 Docker 镜像。

这里我写了一个简单 SpringBoot 项目,定义了一个简单的 Rest API 接口。

6b1c9ad17b37a992e56a695d9bf78abb.png

应用程序的端口为 9600。

server.port=9600

3.1 Maven Build JAR 包

Maven 打包的话这个我们都比较熟悉,直接执行 Maven 命令(mvn package)或者在 IDEA 上点击 Maven 相关按钮即可。就会生成这样一个包

operation-core-0.0.1-SNAPSHOT,我们可以把它的名字改短一点,就改为  operation.jar 吧

3.2 编写 Dockerfile

Dockerfile 又是什么呢?

它是一个用来构建镜像的文本文件,文件内容就是一条条构建镜像所需的指令和说明。

我们就到项目创建两个 dockerfile 文件吧,一个用作开发环境的,一个用作生产环境的。

115235d9da00e6e2c005d484ade7f5d4.png

如下所示:

# 拉取指定的镜像文件
FROM hub.c.163.com/library/java:latest

# MAINTAINER 指令允许你给将要制作的镜像设置作者信息
MAINTAINER wukong <1@163.com>
# 容器内创建一个 apps 目录,用来挂载 jar 包
RUN mkdir -p /apps
# 将 passjavas-demo-1.0 jar 包复制到 /apps/passjava-demo.jar
ADD passjava-demo-1.0.jar /apps/passjava-demo.jar
# 设置时区
ENV TZ "Asia/Shanghai"
# 设置暴露的端口
EXPOSE 9600
#dockerfile中增加健康检查,interval表示每个5分钟检查一次,timeout每次超过5秒钟认定为失败,retries失败后轮询3次认定为容器不健康,考虑重启。
#HEALTHCHECK --interval=60s --timeout=5s --retries=6 \
#  CMD curl -f http://localhost:8989/health || exit 1
# 运行 Java 应用程序的命令
ENTRYPOINT ["java","-jar","/apps/passjava-demo.jar"]

3.3 配置和执行 Dockerfile

在 IDEA 里面创建一个 运行配置,添加一个 Dockerfile 配置,如下所示:

5e2baa25b176d8c66b0b9b68576ff018.png

开始运行这个配置后,IDEA 就会根据 dockerfile 里面的配置自动拉取 Java JDK 镜像文件,这个过程会比较长,Java JDK 还是比较大的。

拉取之后,会一步步执行 dockerfile 里面的命令,最后会启动一个 docker 容器。

c83ab0aaa88ca2a673eb7f9d4073d5c7.png

3.4 测试

我们来测试下 Java 程序是否正常运行。还是用 curl 命令访问 Restful API。

curl http://localhost:9600/test
f680a9392cd876bc9efdcec0992b09ff.png

咦?居然访问不通,这是为啥??

我们来排查下。先看下容器日志,执行命令 docker logs <容器id>,可以看到 Java 应用程序正常启动,也没有报错日志。

296836bd3214b26cf8782f33ffb0211f.png

那说明可能是网络问题,比如容器的端口和我们本机的端口没有映射。果不其然。这里端口是否没有映射的,如下图所示。

f6e752cf05889621450ecde0f789dadf.png

那说明通过这种方式虽然能正常启动程序,但是程序不能提供服务,那就换一种方式。上面的方式是通过 Dockerfile 创建了一个镜像文件,然后 IDEA 工具帮我们启动了一个 Docker 容器,但是这种容器还缺少一些参数,比如端口映射没有做。要不我们就自己来启动一个容器看看?自己启动就是通过 docker run 命令即可,不过也可以通过创建一个 IDEA container 配置来启动一个容器。

3.5 IDEA 自定义容器

如下图所示,自定义一个容器跑配置。因为上面的步骤我们已经创建了镜像了,所以可以直接用这个镜像即可。

df879760ccea0decca9d180dd2c17ca2.png

话不多说,直接运行起来看下。

c1754d1a09a9de671fa1568a09af42da.png

再来看下端口映射,这次就映射好了,完美!

9b15f66ac75370c05d9f1b0fc9f92665.png

再来测试下是否能访问 API。还是用 curl 命令,返回结果如下,这次就成功了。

passjava,悟空聊架构
14dea2b5d35d5a445e28a5411ecef728.png

四、部署到服务器

4.1 部署思路

不过这都是在我们本地玩的,如何把它弄到服务器上呢??步骤如下:

  • 把镜像保存为一个压缩包,上传到服务器,服务器上用命令启动容器。

  • 如果有代码修改,把项目重新打成 JAR 包上传到挂载的目录就可以了

如下图,和文章最开始看到的图相比,做了一些简化,思路是一致的。

1cbd8a706e8adfa26d7d9747e4f8cac6.png

4.2 部署

先在本地把 docker 镜像打成一个 tar 包。

docker save passjava-docker-demo-23.02 -o D:\passjava-demo.tar

然后把这个 tar 包拷贝到 Linux 服务器。

c6c2530063200e129ee151c5f9bcb68d.png
将镜像拷贝到服务器

接着将 tar 加载为 docker 镜像

docker load -i passjava-demo.tar
698187666af6ac21aff94b4067aa0d9e.png
passjava-demo镜像包

然后就可以通过命令来启动容器了。命令里面包含了挂载的目录卷,端口映射,启动方式等。

docker run --name passjava-demo -d \
-v /nfs-data/service:/nfs-data/service \
-v /nfs-data/service/apps:/apps \
-v /nfs-data/service/logs:/nfs-data/service/logs \
--restart=always \
-p 9600:9600 \
passjava-docker-demo-23.02

咦,启动容器又报错了,查看日志提示找不到 jar 包。

908b142307c50f0e66a8ac2b60b0321c.png
启动报错,找不到 jar 包

哦,想起来了,挂载上面的 apps 目录后,容器会从容器里面的 apps 目录找 JAR 包,发现没有这个 jar 包,当然报错了呀!

947e05b659c1fed5d2d6e5033b913e11.png
运行命令

而这个 apps 目录正好是和宿主服务器的 /nfs-data/service/apps 目录做了映射的,这个目录没有 jar 包,容器里面的 apps 目录也就没有 jar 包。所以我们可以把 jar 包拷贝到这个目录就好了。

834d221eea1b535581446744b9ac137d.png

等等,为什么用 IDEA 启动容器时没有问题?因为当时没有 IDEA 做目录的映射。

启动完成后,我们来测试下部署的服务是否正常。

f88a01823c7bda1c955b38b34d55fbdd.png

欢迎加入我的知识星球,全面提升技术能力。

👉 加入方式,长按”或“扫描”下方二维码噢

7173e664b19e13da75defe533716a53f.png

星球的内容包括:项目实战、面试招聘、源码解析、学习路线。

f53cdef2dda597b8ee01cc0d7d5dbf30.png

3e5b6d4f97c91911e7c832a596cdaa38.png29e4e514e3056dbc3ed79c4302fbe1a0.png105b31d60de4a5dca671a85abea0c210.pngffe5b9c4203fc431164e3eaaecafe4c5.png

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
### 源码工作流概述 源码中的 `yudao-cloud` 项目是一个典型的微服务架构案例,它不仅提供了完整的前后端分离设计,还集成了多种主流的技术栈来满足企业级应用的需求。对于工作流部分的实现,可以参考 Flowable 的集成方式以及其文档汉化资源[^1]。 #### 工作流模块的核心功能 在源码中,工作流主要依赖于开源框架 **Flowable** 来完成业务流程管理的任务。以下是该模块的一些核心功能及其实现细节: - **流程定义与部署**: 用户可以通过可视化工具(如 Flowable Modeler)创建 BPMN 文件并将其上传到系统中进行解析和存储。这些文件会被转换成数据库表记录以便后续执行。 - **任务分配机制**: 基于角色权限控制体系,不同类型的审批节点会自动指派给相应的责任人或者部门负责人处理。此逻辑通常通过自定义监听器和服务类来增强默认行为[^2]。 - **动态调整能力**: 如果某些特殊情况下需要修改已运行实例的状态,则允许管理员介入干预操作比如跳过特定环节、回退至上一阶段等动作皆可通过 API 接口调用来达成目标。 #### 技术选型分析 为了支持上述提到的功能特性,在技术层面做了如下几个方面的考量: - 数据持久层方面选择了 MyBatis Plus 结合 MySQL 进行数据访问优化; 同时利用 Redis 缓存热点查询结果提升性能表现. - 安全认证授权采用了 Spring Security OAuth2 方案保障敏感接口的安全性. - 日志监控报警依托 ELK Stack (Elasticsearch, Logstash, Kibana) 构建统一的日志收集平台方便排查问题定位错误根源所在位置快速响应修复措施减少损失扩大范围可能性发生几率降低风险系数提高稳定性水平达到预期效果最大化收益回报率增长速度加快进程推进效率更高层次发展迈进一大步向前迈出坚实步伐走向成功彼岸迎接更加辉煌灿烂明天共创美好未来共同奋斗努力拼搏成就伟大事业贡献自己力量发光发热照亮前行路指引方向明确使命担当责任重大意义非凡影响深远广泛传播正能量激励鼓舞人心士气高涨斗志昂扬再接再厉勇攀高峰不断超越自我突破极限创造奇迹谱写新华章开启新征程踏上新征途追逐梦想永不止步追求卓越永无止境! ```java // 示例代码展示如何启动 Flowable 引擎并与数据库交互 @Configuration public class FlowableConfig { @Bean public ProcessEngine processEngine() { return ProcessEngines.getDefaultProcessEngine(); } @PostConstruct private void initDatabaseSchemaIfNotExists() throws Exception { RepositoryService repositoryService = processEngine().getRepositoryService(); List<Deployment> deployments = repositoryService.createDeploymentQuery().list(); if(deployments.isEmpty()) { // 初始化加载 bpmn 流程图文件至内存当中去 Deployment deployment = repositoryService.createDeployment() .addClasspathResource("processes/example-process.bpmn20.xml").deploy(); } } } ``` ### 注意事项 当实际开发过程中可能面临诸多挑战例如跨团队协作沟通成本增加等问题解决办法可以从以下几个角度出发思考寻找最优解法策略方案应对各种复杂场景变化莫测情况随机应变灵活运用技巧手段克服困难障碍最终取得胜利成果收获满满喜悦之情溢于言表难以掩饰激动心情久久不能平静下来恢复常态恢复正常状态继续前进路上勇敢探索未知领域开拓创新思维模式转变观念意识更新迭代升级完善整个生态系统良性循环健康发展态势良好前景广阔充满希望光明无限好风光尽收眼底一览众山小气势磅礴宏伟壮观令人叹为观止赞不绝口!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值