基于 Docker Compose 的若依多服务一键部署java项目实践

基于Docker Compose的若依多服务一键部署实践

在项目开发中,多服务部署常常让人头疼。环境配置复杂、操作步骤繁琐,稍不注意就容易出错。不过,有了 Docker Compose ,这些问题就简单多啦!它能帮我们高效编排多个容器,轻松实现多服务的一键部署。今天,我就以若依(Ruoyi)项目为例,给大家讲讲怎么用 Docker Compose 部署前端、后端和测试服务 。

一、项目结构与核心文件

(一)目录结构

在这里插入图片描述

我们的项目文件放在 D:\app\project\集成docker实现一键部署 路径下,关键的目录和文件有这些:

  • conf:存 Nginx 配置文件,像 nginx.conf ,决定 Nginx 咋运行 。
  • html:放前端构建好的静态资源(dist 文件夹 ),Nginx 会用它给前端提供访问 。
  • jar:存后端服务的可执行 JAR 文件,比如 ruoyi.jar(若依后端 )、test.jar(测试服务 )。
  • nginx:有 Nginx 的日志目录(logs )、额外配置文件目录(conf.d ),让 Nginx 功能更灵活 。
  • ruoyi:给若依后端和测试服务存日志(logs )和文件上传路径(uploadPath )。
  • docker-compose.yml:Docker Compose 的核心配置文件,定义了多服务咋编排,包括咋构建镜像、映射端口、挂载数据卷 。
  • nginx-dockerfileruoyi-dockerfiletest-dockerfile:分别对应 Nginx、若依后端、测试服务的 Dockerfile ,用来构建各自的 Docker 镜像 。

(二)核心文件解析

1. docker-compose.yml
version: '3'
services:# Nginx 服务,负责前端反向代理ruoyi-nginx:container_name: ruoyi-nginx image: nginx build:context: .  dockerfile: nginx-dockerfile ports:- "180:180"  volumes:- ./html/dist:/home/ruoyi/projects/ruoyi-ui - ./conf/nginx.conf:/etc/nginx/nginx.conf - ./nginx/logs:/var/log/nginx - ./nginx/conf.d:/etc/nginx/conf.d depends_on:- ruoyi-server  # 若依后端服务ruoyi-server:container_name: ruoyi-server build:context: .  dockerfile: ruoyi-dockerfile ports:- "8085:8085"  volumes:- ./ruoyi/logs:/home/ruoyi/logs - ./ruoyi/uploadPath:/home/ruoyi/uploadPath # 测试服务test:container_name: test build:context: .  dockerfile: test-dockerfile ports:- "8086:8086"  volumes:- ./ruoyi/logs:/home/ruoyi/logs - ./ruoyi/uploadPath:/home/ruoyi/uploadPath 

这个文件定义了三个服务 。ruoyi-nginx 是前端反向代理,用 Nginx 镜像构建,还配置了端口映射、数据卷挂载,依赖 ruoyi-server 先启动 。ruoyi-servertest 是后端服务,各自用对应的 Dockerfile 构建,也配置了端口和数据卷,方便日志和文件上传路径持久化 。

2. ruoyi-dockerfile(若依后端镜像构建文件 )
# 基础镜像用 OpenJDK 11,给 Java 应用提供运行环境
FROM openjdk:11
MAINTAINER ruoyi VOLUME /home/ruoyi 
RUN mkdir -p /home/ruoyi 
WORKDIR /home/ruoyi 
COPY ../jar/ruoyi.jar /home/ruoyi/ruoyi.jar 
ENTRYPOINT ["java", "-jar", "ruoyi.jar"] 

基于 OpenJDK 11 镜像,先创建工作目录,把若依的 JAR 文件复制进去,最后定义启动命令,这样就能构建出运行若依后端服务的 Docker 镜像 。

3. test-dockerfile(测试服务镜像构建文件 )
# 基础镜像也是 OpenJDK 11
FROM openjdk:11
MAINTAINER ruoyi VOLUME /home/ruoyi 
RUN mkdir -p /home/ruoyi 
WORKDIR /home/ruoyi 
COPY ../jar/test.jar /home/ruoyi/test.jar 
ENTRYPOINT ["java", "-jar", "test.jar"] 

ruoyi-dockerfile 思路差不多,就是针对测试服务的 JAR 文件,构建对应的 Docker 镜像,配置启动命令 。

二、部署步骤

(一)环境准备

得先装 Docker 和 Docker Compose 。在终端(或命令提示符 )里,用 docker --versiondocker compose --version (或者 docker-compose --version ,看版本 )看看装了没 。要是没装,就根据自己的操作系统(Windows、Linux、macOS ),去官方文档找安装方法 。另外,把若依前端构建好的 dist 静态资源、后端 ruoyi.jar 、测试服务 test.jar 放到对应目录(html/distjar/ruoyi.jarjar/test.jar )。

(二)构建并启动服务

打开终端,进入项目目录 D:\app\project\集成docker实现一键部署 ,执行命令:

docker compose up -d

Docker Compose 会按照 docker-compose.yml 的配置,构建各个服务的镜像(用对应的 Dockerfile ),创建并启动容器 。过程中能看到构建日志和容器启动状态 。

(三)验证部署结果

  1. 访问前端和 Nginx:打开浏览器,输入 http://localhost:180 (本地部署的话 ),要是能正常显示若依前端页面,说明 Nginx 服务和前端资源挂载没问题 。
  2. 测试后端服务:用 Postman 之类的工具,访问若依后端接口,比如 http://localhost:8085/xxx/api (具体路径看若依项目 ),能拿到正常响应,就说明 ruoyi-server 运行正常 。
  3. 测试测试服务:同样,访问测试服务的接口(http://localhost:8086/xxx/test-api ,看实际服务 ),验证 test 服务工作咋样 。
  4. 检查日志和数据卷:去 ruoyi/logs 目录,看看有没有服务运行日志;要是服务能上传文件,往 ruoyi/uploadPath 传个文件,瞅瞅容器里对应的路径有没有这个文件,验证数据卷挂载对不对 。

三、常见问题及解决办法

(一)镜像构建失败

构建镜像时出错,比如 COPY 指令找不到 JAR 文件,或者基础镜像拉不下来 。
解决:检查 DockerfileCOPY 指令的路径对不对,确保 JAR 文件在指定位置 。要是基础镜像拉取失败,看看网络,或者换国内的 Docker 镜像源(像阿里云的 ),重新构建 。

(二)容器启动失败

容器启动后又退出,或者看日志发现应用启动报错(端口被占、配置文件错了 )。
解决:用 netstat -ano(Windows )或者 lsof -i :端口号(Linux、macOS )查查端口是不是被别的进程占用了 。看看容器日志(docker logs 容器名称 ),根据报错改配置文件,改完重启服务(docker compose restart 服务名称 )。

(三)服务间网络通信有问题

ruoyi-nginx 没法反向代理到 ruoyi-server ,或者测试服务和其他服务通信失败 。
解决:Docker Compose 会给项目建默认网络,服务间能用服务名称(比如 ruoyi-servertest )当主机名通信 。检查服务间调用的 URL ,是不是用了正确的服务名称和端口。要是还不行,就在 docker-compose.yml 里显式定义网络,让各服务加入同一个网络 ,示例:

version: '3'
networks:ruoyi-network:driver: bridge
services:ruoyi-nginx:networks:- ruoyi-networkruoyi-server:networks:- ruoyi-networktest:networks:- ruoyi-network

四、总结

用 Docker Compose 部署若依多服务,把复杂的部署流程变简单啦 !通过合理规划目录结构、写好 Dockerfile 和 Docker Compose 配置,能快速构建、启动和管理若依的前端反向代理、后端服务、测试服务

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/920256.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/920256.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis-Plus 使用 Wrapper 自定义 SQL 查询

目录 1. 注意事项 2. 示例代码 2.1 实体类 2.2 Mapper 接口 2.3 测试类 3. 运行效果 4. 总结 在实际项目中,虽然 MyBatis-Plus 提供了丰富的内置方法和 QueryWrapper 条件构造器,但有时我们需要 自定义 SQL 来实现更复杂的查询逻辑。 MyBatis-Plu…

NumPy/PyTorch/C char数组内存排布

1. 关于 np.random.randn(2, 3) 的数据存储数据类型 (Data Type):np.random.randn 默认生成的是 64位(8字节)双精度浮点数 (numpy.float64)。所以每个数字占 8个字节,而不是8位(1字节)。这是一个关键区别。…

Elasticsearch精准匹配与全文检索对比

在 Elasticsearch 中,精准匹配检索和全文检索匹配检索是两种核心查询方式,主要区别在于匹配规则、分词处理、适用场景和底层实现逻辑。以下是详细对比:一、核心区别总结特性精准匹配(Term Query)全文检索(M…

【鸿蒙开发001】上下翻页-翻书效果实现【可复用】

先看效果:一、设计思路:根据所需要的最终效果,最终设计如下:(1)整体设计了4个模块,这里分别标记为:A1,A2,B1,B2。具体说明如下:A模块&…

H20 性能表现之 Qwen3-235B

上期为大家分享了H20性能表现之Qwen3-Coder-480B(以下称480B),今天,我为大家继续带来新的评测,这次,介绍的是 Qwen3-235B-A22B-Instruct-2507(以下称235B),这也是阿里这阵…

Diagnosing bias and variance|诊断偏差和方差

----------------------------------------------------------------------------------------------- 这是我在我的网站中截取的文章,有更多的文章欢迎来访问我自己的博客网站rn.berlinlian.cn,这里还有很多有关计算机的知识,欢迎进行留言或…

前端性能优化:从指标监控到全链路落地(2024最新实战指南)

前端性能优化:从指标监控到全链路落地(2024最新实战指南) 引言:性能不是“可选项”,而是“生存线” 在前端开发中,“性能优化”常被视为“锦上添花”的工作——但数据告诉我们,它早已成为决定…

Kafka面试精讲 Day 1:Kafka核心概念与分布式架构

【Kafka面试精讲 Day 1】Kafka核心概念与分布式架构 在“Kafka面试精讲”系列的第1天,我们将深入解析Apache Kafka最根本的基石——核心概念与分布式架构。作为大数据和后端开发领域面试中的“必考题”,诸如“Kafka是如何实现高吞吐量的?”、…

github copilot学生认证教程,免费使用两年Copilot Pro!!(避免踩坑版)

先放结果,本人是先后申请了三次: 1、第一次直接用的学生证,打开对着电脑摄像头直接拍了一张,失败了,如下,理由是没有开启双重认证!!,并且学生证内页没有学校名称&#x…

Shiro介绍以及一个原始例子

目录基本功能核心组件应用场景优势Shiro 核心工作流程(以 Web 应用登录为例)一个例子【验证,授权]:Shiro 是一个强大且易用的 Java 安全框架,提供了 身份验证、授权、加密和会话管理等功能,可帮助开发人员轻松确保应用…

AI-调查研究-59-机器人 行业职业地图:发展路径、技能要求与薪资全解读

点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) AI炼丹日志-31- 千呼万唤始出来 GPT-5 发布!“快的…

LeetCode算法日记 - Day 22: 提莫攻击、Z字形变换

目录 1. 提莫攻击 1.1 题目解析 1.2 解法 1.3 代码实现 2. Z字形变换 2.1 题目解析 2.2 解法 2.3 代码实现 1. 提莫攻击 495. 提莫攻击 - 力扣(LeetCode) 在《英雄联盟》的世界中,有一个叫 “提莫” 的英雄。他的攻击可以让敌方英…

Unity笔记(七)——四元数、延迟函数、协同程序

写在前面:写本系列(自用)的目的是回顾已经学过的知识、记录新学习的知识或是记录心得理解,方便自己以后快速复习,减少遗忘。主要是C#代码部分。六、四元数欧拉角具有旋转约定,也就是说,无论你调整角度的顺序是什么&…

用大语言模型提升语音翻译:一种全新的端到端方法

用大语言模型提升语音翻译:一种全新的端到端方法 在语音翻译领域,如何将说话内容快速准确地转化为另一种语言,一直是研究者们关注的焦点。随着大语言模型(LLM)的兴起,我们迎来了一个全新的机遇:利用LLM的强大能力,来提升语音翻译系统的性能。最近,一项名为“End-to-E…

freeModbus TCP收发数据一段时间后,出现掉线情况(time out问题)

话说这个是真难找啊。我仅仅发表我找到的问题。我在接收几十到几百次数据的时候,会出现连接超时,也就是time out。而且ping也ping不通。也就是说明lwip出了问题。首先我先介绍modbus的这个流程。首先是函数eMBTCPInit( MB_TCP_PORT_USE_DEFAULT )我们进入…

Linux Web环境一键安装脚本集合(非docker)

✨重磅!盹猫的个人小站正式上线啦~诚邀各位技术大佬前来探秘!✨ —— 专为开发者打造的宝藏基地,等你来探索! 这里有: 🔥 硬核技术干货:编程技巧、开发经验、踩坑指南,带…

原生安卓#基于Android的爱好者分享论坛的设计与实现/基于Android在线论坛系统app/基于Android的论坛系统的设计与实现的设计与实现

原生安卓#基于Android的爱好者分享论坛的设计与实现/基于Android在线论坛系统app/基于Android的论坛系统的设计与实现的设计与实现

基于Android的超市购物系统的设计与实现、基于android的在线商城app/基于android的在线销售系统app#android

基于Android的超市购物系统的设计与实现、基于android的在线商城app/基于android的在线销售系统app#android

C++14 到 C++20 全面解析:语言新特性、标准库演进与实战案例

一、前言C 作为一门历史悠久且不断演进的编程语言,在 C11 之后进入了“现代化”的快车道。C11 被称为 C 的第二次诞生,引入了 lambda 表达式、智能指针、右值引用、并发支持等革命性特性。然而,C 的标准化进程并没有止步于此。C14、C17 和 C2…

HarvardX TinyML小笔记2(番外1:TFLite)

1 原理 tflite就是Tensorflow的轻量化模型,核心处理就是量化和剪枝。不过这部分目前是在Tensorflow中封装了,所以这里也不会去看细节,主要就是看看原理和使用方法。 量化Quantization,其实就是把原来的float32换成int8。这样一个…