基于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-dockerfile
、ruoyi-dockerfile
、test-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-server
和 test
是后端服務,各自用對應的 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 --version
和 docker compose --version
(或者 docker-compose --version
,看版本 )看看裝了沒 。要是沒裝,就根據自己的操作系統(Windows、Linux、macOS ),去官方文檔找安裝方法 。另外,把若依前端構建好的 dist
靜態資源、后端 ruoyi.jar
、測試服務 test.jar
放到對應目錄(html/dist
、jar/ruoyi.jar
、jar/test.jar
)。
(二)構建并啟動服務
打開終端,進入項目目錄 D:\app\project\集成docker實現一鍵部署
,執行命令:
docker compose up -d
Docker Compose 會按照 docker-compose.yml
的配置,構建各個服務的鏡像(用對應的 Dockerfile ),創建并啟動容器 。過程中能看到構建日志和容器啟動狀態 。
(三)驗證部署結果
- 訪問前端和 Nginx:打開瀏覽器,輸入
http://localhost:180
(本地部署的話 ),要是能正常顯示若依前端頁面,說明 Nginx 服務和前端資源掛載沒問題 。 - 測試后端服務:用 Postman 之類的工具,訪問若依后端接口,比如
http://localhost:8085/xxx/api
(具體路徑看若依項目 ),能拿到正常響應,就說明ruoyi-server
運行正常 。 - 測試測試服務:同樣,訪問測試服務的接口(
http://localhost:8086/xxx/test-api
,看實際服務 ),驗證test
服務工作咋樣 。 - 檢查日志和數據卷:去
ruoyi/logs
目錄,看看有沒有服務運行日志;要是服務能上傳文件,往ruoyi/uploadPath
傳個文件,瞅瞅容器里對應的路徑有沒有這個文件,驗證數據卷掛載對不對 。
三、常見問題及解決辦法
(一)鏡像構建失敗
構建鏡像時出錯,比如 COPY
指令找不到 JAR 文件,或者基礎鏡像拉不下來 。
解決:檢查 Dockerfile
里 COPY
指令的路徑對不對,確保 JAR 文件在指定位置 。要是基礎鏡像拉取失敗,看看網絡,或者換國內的 Docker 鏡像源(像阿里云的 ),重新構建 。
(二)容器啟動失敗
容器啟動后又退出,或者看日志發現應用啟動報錯(端口被占、配置文件錯了 )。
解決:用 netstat -ano
(Windows )或者 lsof -i :端口號
(Linux、macOS )查查端口是不是被別的進程占用了 。看看容器日志(docker logs 容器名稱
),根據報錯改配置文件,改完重啟服務(docker compose restart 服務名稱
)。
(三)服務間網絡通信有問題
ruoyi-nginx
沒法反向代理到 ruoyi-server
,或者測試服務和其他服務通信失敗 。
解決:Docker Compose 會給項目建默認網絡,服務間能用服務名稱(比如 ruoyi-server
、test
)當主機名通信 。檢查服務間調用的 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 配置,能快速構建、啟動和管理若依的前端反向代理、后端服務、測試服務