docker 部署前、后端分離項目詳細步驟(從打包到部署)

????????在平常的開發工作中,一個項目經歷需求、開發、測試、上線等步驟。在開發測試完成后,我們需要部署測試環境、生產環境等,那么我們用 docker 方式應該怎么部署呢?前后端分離的項目又該如何部署呢?那么,今天我們總結下前后端分離項目從打包到部署的詳細步驟。

? ? ?一:安裝所需軟件

? ? ? ? 安裝項目所需軟件,如安裝 mysql、redis、nacos等,這些安裝方式在前面已經寫過,這里不再贅述,安裝步驟博客如下:

? ? ? ? 1:docker 安裝 mysql 詳解_本機連接docker mysql-CSDN博客

? ? ? ? 2:docker 安裝 nginx 詳解_docker 拉取nginx-CSDN博客

? ? ? ? 3:docker 安裝 redis 詳解_docker 安裝redis-CSDN博客

? ? ? ? 4:docker 安裝 Rabbitmq 詳解_docker 安裝rabbitmq-CSDN博客

? ? ? ? 5:docker 安裝 MinIO 步驟詳解_docker minio-CSDN博客

? ? ?二:前端打包

????????1:修改 .env.deployment 配置文件接口調用配置,用于部署環境的環境變量配置文件,通常與 .env?文件類似,但專門針對部署階段(如生產環境、預發布環境等)的特定配置,如圖:

????????2:項目打包:npm run build,在 npm run build 時可以添加一些參數來調整打包。例如在 Vue CLI 項目中:npm run build -- --mode development:指定以開發模式進行打包。

????????當看到控制臺輸出如下信息時,表示打包成功:

????????打包成功,前端項目包如圖所示:

? ? ?三:后端打包

????????1:修改數據庫信息為對應數據庫,數據庫配置一般在 application.yml 文件中配置。一般項目中會有多個配置文件,如 dev 開發環境、test 測試環境、prod 生產環境配置文件等,一定要注意每種配置文件中對應的數據庫信息正確。如:

????????2:如果需要修改部署在服務上項目的端口信息,在 application.yml 中修改端口信息,如:

????????3:先點擊 clean,然后點擊 package 打包,操作如圖所示:

? ? ?四:構建后端服務鏡像

????????1:編寫 Dockerfile文件,Dockerfile 是一種純文本文件,文件命名就是 “Dockerfile”,用來構建 Docker 鏡像的文本文件,包含了一系列的指令和參數。通過 Dockerfile 構建的鏡像可以保證開發環境、測試環境和生產環境的鏡像一致,避免了換機器不能運行的問題。通過指令可以自動構建鏡像。Dockerfile 可以與 Jenkins 等集成,實現自動化構建和部署。

# 使用OpenJDK 17基礎鏡像
FROM openjdk:17
# 創建一個名為/litemall/logs的目錄
RUN mkdir -p /litemall/logs
# 切換工作目錄
WORKDIR /litemall
# 配置環境變量
ENV SERVER_PORT=8085 \LANG=C.UTF-8 \LC_ALL=C.UTF-8# 暴露應用端口
EXPOSE 8085# 添加應用Jar包到容器中
ADD litemall-wx-api-0.1.0.jar ./app.jar# 設置啟動命令
ENTRYPOINT ["java", \"-Dserver.port=${SERVER_PORT}", \"-Xlog:gc*:time,tags,level", \"-XX:+UseZGC", \"-jar", "app.jar"]

????????2:docker build -t ?鏡像名:tag ?.? 如:docker build -t litemall-all:v1.0 . ,編寫完 Dockerfile 文件后,這個時候就可以構建鏡像了。注意版本后面有個 空格 點。使用點 . :表示使用當前目錄下的 Dockerfile,如果不加這個點,Docker 不會知道從哪里獲取 Dockerfile。鏡像構建完成后,可以使用 docker images 查看生成的鏡像。
??
? ????????查看鏡像:docker images
?? ?

? ? 五:啟動后端服務

??????1:編寫后端服務 docker-compose.yml 文件。啟動容器,可以直接用docker run ?后面接一堆指令啟動,也可以用 docker-compose.yml 文件管理指令,docker compose 是定義和運行多容器 Docker 應用的工具,用 docker compose 命令啟動,這樣更加的便捷。

services:litemall-all:image: litemall-all:v1.0container_name : litemall-allenvironment:- SERVER_PORT=8085- JAVA_OPTS="-Xmx2g -Xms2g" - TZ=Asia/Shanghairestart: alwaysnetwork_mode: "host"

????????2:啟動后端服務? docker compose up -d 命令,docker compose up 是阻塞窗口的,帶上 -d 是非阻塞的。docker compose up -d 啟動,可以更方便的管理啟動命令。
????????遇到的問題:
? ? ? ? 報錯 1 如下:下載鏡像報錯

?? ?解決方法:
?? ?修改 /etc/daemon.json文件中鏡像加速器配置,如果遇見下載鏡像錯誤,基本都是這種解決方法。但是修改了好久鏡像加速器配置,就是沒有解決,一直以為是加速器沒有配置對,導致問題,后面發現是 docker-compose.yml 中 image 鏡像名稱寫錯了,所以導致下載鏡像一直失敗,Dockerfile 文件中的鏡像,如圖:
? ?

? ? ?報錯 2 如下:無法找到運行的主類

? 解決方法:找到服務所在模塊的 pom.xml 中如下配置:

<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><executions><execution><id>repackage</id><configuration><executable>true</executable><classifier>exec</classifier></configuration> </execution></executions></plugin></plugins>
</build>

?將 <execution> 標簽中的內容改為如下,即可解決:

<goals><goal>repackage</goal><goal>build-info</goal>
</goals>

????????4:測試后端服務
? ??????在服務器上執行:curl -v http://localhost:8085/wx/auth/login ?后面接口為后端服務中的接口,查看返回信息,如果返回 200,則表示接口調用成功;如果連接失敗,-v?會顯示錯誤詳情(如?Connection refused?表示端口未監聽)。

? ? ?六:nginx 配置

????????1:編寫 nginx.conf 文件,主要作用是將 Nginx 服務器配置為監聽 6255 端口,處理前端靜態資源請求和后端接口請求,通過反向代理將以?/wx/?開頭的請求轉發到?http://localhost:8085?后端服務器。

user ?nginx;
worker_processes ?auto;events {worker_connections ?1024;
}http {include ? ? ? /etc/nginx/mime.types;default_type ?application/octet-stream;autoindex on;keepalive_timeout ?65;server {listen 6255;server_name localhost;charset utf-8;# 處理前端靜態資源請求location / {root ?/usr/share/nginx/html;index index.html index.htm;}# 處理后端接口請求location /wx/ {proxy_pass http://localhost:8085;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}}
}

????????2:編寫 docker-compose.yml 文件,定義了使用鏡像及版本,容器名稱、環境配置及端口映射,掛載了宿主機目錄等,使用 docker-compose.yml 文件,可以更好的管理啟動命令,方便使用。

services:nginx:image: nginx:latestcontainer_name: nginx-litemall-testenvironment:TZ: Asia/Shanghaiports:- "8085:8085"volumes:# 配置文件映射- /litemall/nginx/conf/nginx.conf:/etc/nginx/nginx.conf- /litemall/nginx/conf:/etc/nginx/conf# 頁面目錄- /litemall/html/dist:/usr/share/nginx/htmlprivileged: truenetwork_mode: "host"

????????3:啟動 nginx,用 ?docker compose up 啟動,可以實時看到啟動日志。可以 docker ps 查看是否啟動成功。

????????4:遇到的問題:訪問報 404,如下:
??
? ?nginx 報錯如下:無法打開 /html 文件夾,沒有此文件或者目錄
? ??
?? ?解決方法:搜了好多方法,基本都是說文件夾權限問題,chmod 修改文件夾權限,各種修改權限,看目錄路徑是否正確,修改了好久,沒有解決,后面發現是 nginx.conf 中
前端文件目錄寫的是宿主機的文件目錄,而不是容器的目錄,所以導致一直找不到,
????????修改前、后如下圖:

????????

????????
????????此處要注意:nginx 文件掛載目錄映射位置:

????????

? ? ?七:測試

????????根據 http://xx.xx.xx.xx:6255 進行訪問,訪問頁面如下:

????????
????????可能會遇到的問題:項目啟動成功,訪問失敗,可以查看項目端口是否因沒開防火墻導致無法訪問。如果是,解決步驟如下:
????????(1):查看防火墻開的端口:firewall-cmd --zone=public --list-ports
? ? ? ? (2):若端口未開,則添加,比如開放 8008 端口:firewall-cmd --zone=public --add-port=8008/tcp --permanent
? ? ? ? (3):修改完成后,重啟防火墻:firewall-cmd --reload

? ? ?八:總結

????????首先裝需要的軟件,如部署需要的 nginx、redis、rabbitmq、nacos、mysql等,接著就是 打前端包,打后端包,包打完之后,將包上傳到服務器,構建后端服務鏡像,編寫啟動后端服務 docker-compose.yml 文件。創建 nginx.conf 文件,nginx.conf 文件的配置 和 nginx 的 docker-compose.yml 文件中配置尤為重要,監聽的端口,掛載文件目錄,一定要注意書寫正確,否則可能看著都沒問題,但是就是訪問失敗。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/79451.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/79451.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/79451.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

大語言模型理解一般需求到在專業領域中最大限度地發揮其效能的演變軌跡

在人工智能技術飛速發展的當下&#xff0c;大語言模型&#xff08;LLM&#xff09;憑借其強大的語言處理能力和廣泛的應用潛力&#xff0c;成為了各行業關注的焦點。從最初的文本生成、簡單問答&#xff0c;到如今在專業領域的深度應用&#xff0c;大語言模型與用戶的交互模式正…

mindyolo填坑

1、按照gitee上的文檔跑預測代碼&#xff0c;跑不通 更改&#xff1a; 將predict.py復制到跟目錄。如果是cpu&#xff08;本地測試比較常見&#xff09;&#xff0c;那么正確的命令行是&#xff1a; python predict.py --device_targetCPU --config ./configs/yolov7/yolov7.…

Python集合全解析:從基礎到高階應用實戰

一、集合核心特性與創建方法 1.1 集合的本質特征 Python集合&#xff08;Set&#xff09;是一種??無序且元素唯一??的容器類型&#xff0c;基于哈希表實現&#xff0c;具有以下核心特性&#xff1a; ??唯一性??&#xff1a;自動過濾重復元素??無序性??&#xff…

【javascript】競速游戲前端優化:高頻操作與并發請求的解決方案

文章目錄 前言一、性能痛點分析二、核心技術方案1.Web Worker2.Promise高級控制3.智能隊列系統4.游戲化節流設計 三、最佳實踐選擇 前言 在競速類網頁游戲中&#xff0c;玩家高頻點擊與服務器實時交互會引發兩大核心挑戰&#xff1a; 客戶端性能瓶頸&#xff1a;頻繁操作導致…

Linux操作系統系統編程:x86-64架構下的系統調用

在Linux操作系統里&#xff0c;系統編程如同精密儀器的核心部件&#xff0c;掌控著系統運行的關鍵。而 x86-64 架構下的系統調用&#xff0c;更是連接用戶空間程序與內核的關鍵橋梁。你可以把用戶空間的程序想象成一個個 “工匠”&#xff0c;它們有著各式各樣的需求&#xff0…

理解數據湖

目錄 一、數據湖的定義與相關概念 二、數據湖出現的背景 三、數據湖關鍵技術 (一)存儲技術

前端應用開發技術歷程的簡要概覽

前端應用開發技術詳解 一、萌芽期&#xff08;1990s - 2004&#xff09; 技術特征 HTML 3.2 / HTML 4.01 是主流版本。 樣式用 CSS1/CSS2&#xff0c;但大部分樣式寫在 <style> 標簽甚至行內。 動態效果主要通過 JavaScript 控制 DOM&#xff0c;兼容性極差。 代表事…

交換機配置DHCP

交換機配置DHCP 背景先關閉路由器的DHCPconsole口連接到交換機配置交換機 背景 路由器的dhcp分配IP地址變慢&#xff0c;怎么處理 先關閉路由器的DHCP 查看路由器中DHCP地址池范圍; 關閉路由器的DHCP console口連接到交換機 協議Serial端口COMX波特率9600流控無 配置交換機…

解決Flutter項目中Gradle構建Running Gradle task ‘assembleDebug‘卡頓問題的終極指南

解決Flutter項目中Gradle構建Running Gradle task ‘assembleDebug‘卡頓問題的終極指南 前言 在開發Flutter應用時,經常會遇到Gradle構建卡在Running Gradle task assembleDebug階段的問題。本文將分享如何通過配置華為云鏡像和使用自定義腳本下載依賴的方法解決這些問題。…

AI驅動文字冒險游戲

github地址&#xff1a;https://github.com/thornbsj/ImmenseSimGame 雖然游戲比較簡陋&#xff0c;但是由于筆者不想對游戲做過多的“劇透”&#xff0c;因此本文只粗略講一下大致邏輯以及部分代碼&#xff0c;有興趣的朋友可以看上面的倉庫獲得更詳細的部分。 一、狀態機改…

springboot中有關數據庫信息轉換的處理

現代項目一般都是前后端分離的&#xff0c;前端只負責展示數據&#xff0c;不負責對數據處理&#xff0c;所以所有數據處理工作都由后端進行 比如在仿京東中的status&#xff0c;審核信息展示&#xff0c;數據庫中是以0/1顯示&#xff0c;但是前端需要以"審核/未審核&quo…

提示詞版本化管理:AI開發中被忽視的關鍵環節

當我的提示詞"消失"在團隊協作中 上周五下午&#xff0c;我經歷了一場小型"災難"。作為一名AI產品經理&#xff0c;我花了整整三天精心打磨的客服機器人提示詞&#xff0c;在周末更新后突然"失效"了。機器人不再能夠準確識別用戶意圖&#xff0…

Centos Ubuntu RedOS系統類型下查看系統信息

文章目錄 一、項目背景二、頁面三、說明四、代碼1.SysInfo2.EmsSysConfig3.HostInformationController4.HostInfo 一、項目背景 公司項目想展示當前部署系統的&#xff1a;操作系統&#xff0c;軟件版本、IP、主機名。 二、頁面 三、說明 說明點1&#xff1a;查詢系統類型及…

阿里云自動備份網站,阿里云自動備份網站的方法

阿里云提供了多種自動備份網站的方法&#xff0c;適用于不同場景和需求&#xff0c;用戶可根據自身技術能力和業務要求選擇合適的方案。以下是幾種主流的自動備份方法及操作要點&#xff1a; 一、基于云服務器ECS的自動快照備份 適用場景&#xff1a;適用于基于ECS部署的網站…

輸入輸出(python)

open&#xff08;&#xff09;需要和close&#xff08;&#xff09;配合使用 with open () as 不需要用close&#xff08;&#xff09;函數 在python3.0中的一些變動&#xff1a; eval 是編程語言中用于動態執行字符串形式代碼的內置函數 &#xff0c;名稱源于英文 “evaluate”…

Arduino邏輯控制詳細解答,一點自己的想法記錄

一、邏輯控制的基礎概念與核心語法 1.1 邏輯控制的基本原理 邏輯控制是嵌入式系統中最常見的功能之一,其核心在于通過條件判斷(if-else)、循環(for/while)和布爾運算(&&/||)實現對硬件的精確控制。例如,通過按鍵狀態切換LED亮度、根據傳感器數據調整電機轉速…

字符串的相關方法

1. equals方法的作用 方法介紹 public boolean equals(String s) 比較兩個字符串內容是否相同、區分大小寫 示例代碼 public class StringDemo02 {public static void main(String[] args) {//構造方法的方式得到對象char[] chs {a, b, c};String s1 new String(chs);…

JAVA基礎:Collections 工具類實戰指南-從排序到線程安全

在 Java 開發中&#xff0c;集合類幾乎貫穿每一個項目&#xff0c;而Collections工具類提供了一系列強大的方法&#xff0c;用于操作和增強集合的功能。無論是排序、查找還是線程安全的封裝&#xff0c;Collections工具類都是提升代碼效率和質量的重要工具。 一、Collections …

ReLU函數及其Python實現

ReLU函數及其Python實現 文章目錄 ReLU函數及其Python實現1. ReLU函數定義2. Python實現3. 在深度學習中的應用總結 1. ReLU函數定義 ReLU&#xff08;Rectified Linear Unit&#xff0c;修正線性單元&#xff09;函數是深度學習中常用的激活函數之一。它的定義非常簡單&#…

2505ahk,wmi學習

檢索每個服務的狀態和啟動類型 wbemServices : ComObjGet("winmgmts:\\.") //.代表本地計算機. wbemObjectSet : wbemServices.InstancesOf("Win32_Service")For wbemObject In wbemObjectSetMsgBox, % "Display Name: " wbemObject.DisplayNam…