基于 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
英文地址,請注明出處:http://en.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。這樣一個…