当前位置: 首页 > news >正文

基于 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.xdnf.cn/news/1373563.html

相关文章:

  • C# OpenCVSharp 实现物体尺寸测量方案
  • 【Java】异常处理:从入门到精通
  • npm run start 的整个过程
  • 文字样式设置
  • Python基础、数据科学入门NumPy(数值计算)、Pandas(数据处理)、Matplotlib(数据可视化)附视频教程
  • 使用Spring Boot和EasyExcel导出Excel文件,并在前端使用Axios进行请求
  • 部署网页在服务器(公网)上笔记 infinityfree 写一个找工作单html文件的网站
  • 趣味学Rust基础篇(变量与可变性)
  • 从传统到创新:用报表插件重塑数据分析平台
  • 基于Spark的白酒行业数据分析与可视化系统的设计与实现
  • 【服务器】用X99主板组装服务器注意事项
  • 【开题答辩全过程】以 微信小程序的医院挂号预约系统为例,包含答辩的问题和答案
  • 在Excel和WPS表格中通过查找替换对单元格批量强制换行
  • 实现基于数据库 flag 状态的消息消费控制
  • PMP项目管理知识点-⑭【①-⑬流程总结】→图片直观表示
  • 让ai写一个类github首页
  • 从文本到二进制:HTTP/2不止于性能,更是对HTTP/1核心语义的传承与革新
  • 深度学习11 Deep Reinforcement Learning
  • 深度学习12 Reinforcement Learning with Human Feedback
  • 如何在阿里云百炼中使用钉钉MCP
  • 深度学习——激活函数
  • 【stm32简单外设篇】-4×4 薄膜键盘
  • 区块链技术探索与应用:从密码学奇迹到产业变革引擎
  • 【PS实战】制作hello标志设计:从选区到色彩填充的流程(大学作业)
  • 开发electron时候Chromium 报 Not allowed to load local resource → 空白页。
  • 【分布式技术】Kafka 数据积压全面解析:原因、诊断与解决方案
  • 基于muduo库的图床云共享存储项目(一)
  • More Effective C++ 条款10:在构造函数中防止资源泄漏
  • Tomcat的VM options
  • 广告推荐模型3:域感知因子分解机(Field-aware Factorization Machine, FFM)