当前位置: 首页 > 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.dtcms.com/a/354126.html

相关文章:

  • 【深度学习-Day 44】GRU详解:LSTM的优雅继任者?门控循环单元原理与PyTorch实战
  • sparksql的transform如何使用
  • 8.27 网格memo
  • HTTP 头
  • Go 1.25新特性之容器感知功能详解
  • 【C++语法篇】:函数
  • 超越ChatBI!深度解析衡石HENGSHI SENSE 6.0如何实现全流程AI赋能
  • 第二阶段WinFrom-7:文件操作补充,泛型复习,协变和逆变
  • Python LangChain RAG从入门到项目实战09.:LangChain 中的 Retriever(检索器)
  • buuctf——web刷题第5页
  • Vue2 基础用法
  • CVPR深度学习研究指南:特征提取模块仍是论文创新难点
  • 吴恩达机器学习作业二:线性可分逻辑回归
  • CMake构建学习笔记21-通用的CMake构建脚本
  • Liunx内核驱动
  • Java中StringBuilder原理以及使用
  • D4145低功耗GFCI接地故障控制芯片介绍
  • 题目—移除元素
  • 作业帮,途虎养车,得物,途游游戏,三七互娱,汤臣倍健,游卡,快手26届秋招内推
  • JUC多线程个人笔记
  • 【DC工具GUI入门】
  • APP测试全流程以及测试点
  • 【开题答辩全过程】以 基于SpringBoot的流浪动物领养系统的设计与实现 为例,包含答辩的问题和答案
  • 从Java到Go:初遇Go语言的震撼体验
  • 力扣 30 天 JavaScript 挑战 第41天 (第十二题)对异步操作,promise,async/await有了更深理解
  • 【Linux实时内核机制】ww_rt_mutex 的contending_lock异常问题
  • android/java中主线程和子线程的详解
  • Nano Banana揭秘:Google Gemini 2.5 Flash Image正式发布 | AI图像编辑新时代
  • 内网应用如何实现外网访问?外地通过公网地址访问内网服务器的设置方法
  • 动态规划:青蛙跳台阶实践