今天小編來分享下如何將本地寫的Java Web程序部署到Linux上。
小編介紹兩種方式:
部署基于Linux Systemd服務、基于Docker容器化部署
首先部署基于Linux Systemd服務
那么部署之前,要對下載所需的環境
軟件下載
Linux(以ubuntu)
以下命令,為了方便,均以root用戶操作
下載jdk
Shell |
如何不小心下載錯了,可以自行卸載
Shell |
下載MySQL
Shell |
查看MySQL狀態
Shell |
執行MySQL安全腳本
執行此命令,會讓MySQL運行安全性進一步提高
Shell |
后面的內容篇幅過長,就不截圖了
內容大致如下:
-
設置密碼驗證插件:可以配置密碼強度策略,確保用戶設置強密碼。
-
更改 root 用戶密碼:如果你沒有在初始化時設置 root 密碼,或者想要修改現有的 root 密碼,可以通過此步驟完成。
-
移除匿名用戶:默認情況下,MySQL 可能包含一個或多個匿名用戶賬戶,這些賬戶允許任何人登錄到 MySQL 服務器。移除這些賬戶可以增加安全性。
-
禁止 root 遠程登錄:確保 root 用戶只能從本地機器登錄 MySQL,減少被遠程攻擊的風險。
-
移除測試數據庫:MySQL 默認提供了一個名為
test
的數據庫,任何人都可以訪問。刪除這個數據庫可以避免潛在的安全風險。 -
重新加載權限表:確保所有的更改都立即生效
卸載MySQL(出意外)
Shell |
登錄數據庫
SQL |
導出sql文件
如若你的數據庫創建在本地,比如windows,那么這里提供兩種方式
命令行方式
SQL |
圖形化界面(navicat)
連接數據庫
右鍵其中一個表
然后選擇是否是僅結構或是結構和數據
點擊后,會讓你保存到自定義目錄,然后等待導出即可
導出的sql文件,依舊通過rz命令上傳或是拖拽上傳,然后通過命令行方式恢復文件即可
SQL |
數據準備好后,接下來還有端口開放。
端口開放
如若在騰訊云、華為云、京東云等廠商購買服務器,還需官網上開啟端口
進入官網頁面:
進入控制臺頁面,點擊輕量應用服務器
進入詳情頁面
點擊防火墻
點擊添加規則
配置參數
如若本地Java程序端口開放是9091,那么這里應用類型選自定義,來源選全部ipv4地址,端口填寫9091,點擊確定即可
查看防火墻
SQL |
如若是inactive,則可以不用管,直接跳到后面即可
如若是active,那么可以通過以下命令進行關閉防火墻
SQL |
如若是想更加安全措施,參考以下命令
SQL |
本地文件編寫
先介紹幾個環境
? 開發環境: 開發?員寫代碼?的機器.
? 測試環境: 測試?員測試程序使?的機器.
? ?產環境(線上環境): 最終項?發布時所使?的機器. 對穩定性要求很?.
多環境配置
打開你的spring boot項目
打開application.yml文件
然后將此文件復制兩份文件,命名如下
application-dev.yml(開發環境文件)、application-prod(生產環境文件).yml
為什么?
這是因為,復制兩份文件,是為了不頻繁改動applicaiton.yml文件內容,比如數據庫密碼
然后application.yml文件內容如下:
SQL |
pom.xml修改
與<dependencies>標簽同級下,新建以下標簽及其內容
XML |
一個環境文件,就寫一個<profile>標簽,添加<activeByDefault>可以使得打包的時候,默認選中的是dev環境
重要一步!!!不要忘記刷新maven
刷新后,內容如下:
此時,你勾選prod,那就以生成環境配置為主,否則就是默認的dev。
點擊Lifecycle下的package,打出jar包。
注意,如若想跳過測試,則點擊圖片中,長方形標出的按鈕。
回到Linux服務器,使用rz命令把jar包上傳到你選定的目錄
動態獲取不同環境的配置文件,這是Spring Boot 與 Maven 構建系統結合使用時的一種 “配置參數占位替換機制”
核心機制:Maven 構建時資源過濾 + profile 替換變量
選擇prod時
Maven 會:
-
激活
<id>prod</id>
的配置 -
將
<properties>
中的變量值(如profile.name=prod
)注入 -
然后自動替換
application.yml
中的@profile.name@
→prod
如若發現不生效,可以使用該設置,進行開啟掃描過濾
XML |
Linux文件配置
創建文件
Shell |
添加文件內容
Bash |
重新加載配置
Shell |
啟動服務
Shell |
查看狀態
Shell |
然后可以通過http://你的公網ip地址:配置的端口/首頁html文件 進行網站訪問
其工作原理大致如下:
-
systemctl daemon-reload
讓 systemd 重新加載配置 -
systemctl start xxxx
時,systemd 會:-
檢查網絡是否就緒(After=network.target)
-
切換到指定工作目錄
-
以 root 用戶執行 Java 命令
-
監控進程狀態,按策略處理異常
-
記錄標準輸出和錯誤到日志文件
-
即.service文件中規定了如何做,那么systemd就執行什么。
快速測試jar包
Shell |
這個nohup指令,全稱是no hang up 用于在系統后臺不掛斷的運行命令,退出終端不受影響
Docker部署
那么接著,接下來小編介紹,基于Docker容器化部署
進入Linux命令行、小編以root用戶進行操作,非root用戶,建議命令加上sudo
一:準備工作
1.更新軟件包:
Java |
2.安裝docker前置依賴:
Java |
安裝組件說明:
包名 | 作用 |
apt-transport-https | 支持通過 HTTPS 下載軟件源 |
ca-certificates | 驗證網站安全證書(防釣魚) |
curl | 命令行下載工具,用于獲取密鑰和配置 |
software-properties-common | 提供 add-apt-repository 命令 |
3.添加docker官方的GPG密鑰(信任源)
Java |
注意:使用阿里云鏡像站點的GPG密鑰,速度快且穩定
命令意思是:
從阿里云鏡像站點下載GPG公鑰
用 GPG 工具把它處理成 apt 能識別的格式
保存在 /etc/apt/keyrings/docker.gpg
中
-fsSL參數解釋:
-
-f
:表示在服務器錯誤時阻止返回錯誤頁面,直接返回錯誤碼 22。 -
-s
:啟用安靜模式,不顯示進度條或錯誤信息。 13 -
-S
:啟用 SSL 加密協議,確保數據傳輸安全
4.添加docker軟件源:
Java |
參數解釋: deb
:表示這是一個Ubuntu的二進制軟件源(非源碼包)
[arch=amd64]
:指定該源適合于64位x86架構
$(lsb_release -cs)
:獲取當前Ubuntu系統發行版代號
stable
:使用docker的穩定版本,(非測試版edge或nightly)
tee
:寫入文件(tee
既能輸出到屏幕又能寫入文件)。
5.再次更新軟件包列表
讓系統再次添加剛剛的docker的源:
Java |
如若發生NO_PUBKEY,返回第三步重新導入密鑰
6.安裝docker引擎
Java |
軟件包功能如下:
1. docker-ce
(Docker Community Edition)
-
作用:Docker 的核心引擎(主程序),負責容器的創建、運行和管理。
-
包含的主要功能:
-
dockerd
:Docker 守護進程(后臺服務)。 -
Docker 的 REST API(供客戶端如
docker
命令行工具調用)。 -
容器生命周期管理(
create
/start
/stop
/rm
等)。
-
2. docker-ce-cli
(Docker 命令行工具)
-
作用:Docker 的官方命令行客戶端(
docker
命令)。 -
關鍵功能:
-
提供
docker
命令(如docker run
、docker ps
等)。 -
與
dockerd
守護進程通信(通過/var/run/docker.sock
)。
-
3. containerd.io
(容器運行時)
-
作用:Docker 依賴的底層容器運行時(由 Docker 剝離出的核心組件)。
-
功能:
-
管理容器的底層操作(如鏡像拉取、容器啟動、存儲管理)。
-
被
dockerd
調用,負責與 Linux 內核交互(通過runc
等工具)。
-
7.驗證docker是否安裝成功
Java |
類似信息如下:
Docker version 28.3.3, build 980b856
還可以查看docker詳細信息
Java |
8.配置鏡像加速器
配置鏡像加速器,后續進行docker pull操作的時候,可以解決拉取緩慢/失敗問題
值得注意的是:2024年底起,阿里云已經停用公共鏡像加速器
詳情如下:配置鏡像加速器_容器鏡像服務(ACR)-阿里云幫助中心
1.創建docker配置文件:
小編使用的是騰訊云服務器,所以使用了騰訊云的鏡像加速器
Bash |
值得注意的是,該網址,不可直接在瀏覽器訪問,
原因:
-
該地址是一個 Docker Registry 鏡像服務,遵循 Docker 的 API 協議(如
v2
),僅響應 Docker 客戶端的請求(如docker pull
)。 -
瀏覽器訪問會返回
404
或401 Unauthorized
,因為它期望的是 Docker 客戶端的特定 HTTP 請求。
你可以通過以下命令進行測試:
Java |
常見的鏡像加速器:
方案 | 推薦度 | 說明 |
騰訊云加速器 mirror.ccs.tencentyun.com | ????? | 推薦!內網加速,穩定免費 |
中科大鏡像 docker.mirrors.ustc.edu.cn | ???? | 社區維護,較穩定 |
網易云 hub-mirror.c.163.com | ??? | 可用,偶爾不穩定 |
2.重啟docker使配置生效
Java |
3.驗證加速器是否生效
Java |
4.運行第一個容器,測試
Java |
注意,首次運行,會沒有該容器,然后會從hub中,拉取hello-world
二:構建容器,并運行
1.修改application-prod.yml文件
URL替換:
Java |
原因: docker容器的網絡隔離性,每個容器有獨立的網絡命名空間,127.0.0.1僅指向容器內部,不是主機的數據庫
為什么是 172.17.0.1
?
-
Docker 默認創建網橋
docker0
,子網通常是172.17.0.0/16
。 -
宿主機在該網絡中的 IP 固定為
172.17.0.1
(類似路由器角色)。 -
容器內訪問
172.17.0.1
即訪問宿主機。
前提是MySQL得監聽:0.0.0.0.
那么小編使用的時MySQL監聽:0.0.0.0,修改MySQL配置文件的操作,文章末尾會介紹另一種方案
2.修改MySQL配置文件以及權限
Java |
重啟防火墻:
Java |
修改MySQL權限
Java |
如若防火墻關閉了,那么可以到下一步了,沒有,那么推薦使用以下操作
Java |
3.首先創建一個目錄,用來存放jar包和Dockerfile文件
Java |
然后把jar包進行復制到該目錄,或者直接傳輸到該目錄
小編這里重命名為blog-docker.jar
4.編寫Dockerfile文件
Bash |
5.構建鏡像
Shell |
注意 .表示,你需要在當前創建的Dockerfile目錄進行該操作
查看該鏡像是否存在
Shell |
6.運行容器
Shell |
接下來通過http://你的公網ip地址:配置的端口/首頁html文件 進行網站訪問
刪除容器和鏡像
Shell |
7.查看日志
如若發現網站有訪問接口報錯,或者,想查看后端日志
可通過以下命令:
Shell |
那么剛剛一種部署方式是docker連接宿主機的數據庫的,那么接下來分享另一種方法
獨立使用MySQL容器
1.創建docker網絡
Shell |
2.拉取MySQL鏡像
Shell |
3.啟動Mysql容器并導入數據
如需本地Windows電腦數據庫中的數據,可參考導出本文sql文件導出方式Java Web部署
導出的文件,要上傳到Linux指定的目錄下
運行MySQL容器:
Shell |
注意,如若之前沒有拉取鏡像,這一步,docker也會拉取MySQL鏡像
參數說明:
參數 | 作用 |
-v init.sql:/docker-entrypoint-initdb.d/init.sql | 自動執行 SQL 文件初始化數據庫 |
-v mysql_data:/var/lib/mysql | 數據持久化(重啟容器不丟失) |
--network blog-network | 允許其他容器通過容器名訪問 |
3.驗證數據是否導入
Shell |
通過此命令,可進入MySQL命令行交互
docker exec
是 Docker 命令行工具中用于在運行中的容器內執行命令的一個非常有用的命令。
常用選項
-
-d
或--detach
:在后臺運行指定的命令。 -
-i
或--interactive
:即使沒有附加也保持 STDIN 開放。通常與-t
一起使用。 -
-t
或--tty
:分配一個偽終端。這對于交互式命令(如 bash shell)非常有用。 -
--privileged
:給予執行命令的容器額外的權限。 -
-u
或--user
:以指定的用戶身份(格式為 UID:GID)運行命令。
4.修改yml文件
Shell |
5.構建鏡像
Shell |
6.運行容器
Shell |
最后,訪問url,進行驗證即可
最后小編分享下,對于docker中的build 、run命令常見選項
構建
命令格式:
docker build [OPTIONS] PATH | URL | -
選項 | 作用 | 示例 | 說明 |
-f | 指定 Dockerfile 文件路徑 | -f Dockerfile.prod | 默認找 ./Dockerfile,你也可以自定義 |
-t | 指定鏡像名和標簽 | -t blog:1.0 | 常用寫法:鏡像名:標簽 |
--no-cache | 構建時不使用緩存 | --no-cache | 確保每一步都重新執行 |
--build-arg | 傳構建參數(配合 Dockerfile 中 ARG 使用) | --build-arg version=1.2.3 | 給 Dockerfile 傳入動態變量 |
--progress | 設置構建日志樣式 | --progress=plain | 可設為 auto, plain, tty |
. | 指定構建上下文目錄 | . | COPY 指令只能訪問此目錄下的文件 |
常用示例:
Shell |
運行
命令格式:
Shell |
選項 | 作用 | 示例 | 說明 |
-d | 后臺運行容器 | -d | 不阻塞當前終端 |
--name | 指定容器名稱 | --name blog | 否則會隨機生成名稱 |
-p | 端口映射 | -p 8080:8080 | 宿主機:容器 |
-v | 掛載卷(目錄或文件) | -v /mydata:/app/data | 持久化數據 |
--rm | 容器退出時自動刪除 | --rm | 不保留痕跡(臨時測試用) |
-e | 設置環境變量 | -e SPRING_PROFILES_ACTIVE=prod | 相當于傳遞配置參數 |
--network | 使用指定網絡 | --network mynet | 用于容器間通信 |
--restart | 設置自動重啟策略 | --restart=always | 推薦生產使用 |
--entrypoint | 覆蓋 Dockerfile 中的 ENTRYPOINT | --entrypoint /bin/sh | 啟動一個命令行環境 |
常用示例:
Shell |