Linux系統中部署java服務(docker)

1、不使用docker

? 1. 檢查并安裝 Java 環境

檢查 Java 是否已安裝:

java -version

?

? 2. 上傳 Java 項目 JAR 文件

可以創建一個server文件夾,然后上傳目錄?

查看當前目錄

?然后創建目錄上傳jar包

? 3. 啟動 Java 服務?

java -jar hywl-server.jar

這個命令會 阻塞當前終端,關閉終端后服務會終止?

? 4. 后臺啟動 Java 服務??

nohup java -jar hywl-server.jar > app.log 2>&1 &
nohup java -jar -Dspring.profiles.active=dev hywl-server.jar > app.log 2>&1 &
tail -f app.log

停止服務:

通過 ps 命令查找并終止進程

ps -ef | grep hywl-server.jar

?PID 是 5007,然后執行:

kill -9 5007

補充:

信號數字信號名稱作用
1SIGHUP掛起信號,重新加載配置
2SIGINT中斷(Ctrl + C)
9SIGKILL強制終止進程
15SIGTERM終止進程(默認信號)
18SIGCONT繼續運行停止的進程
19SIGSTOP暫停進程

?

? 5.腳本后臺啟動 Java 服務??

啟動腳本:

vi start.sh
#!/bin/bash# 項目名稱(JAR文件名稱)
APP_NAME="hywl-server.jar"# JVM 參數(可根據需要調整)
JAVA_OPTS="-Xms512m -Xmx1024m -Dspring.profiles.active=dev"# 日志文件路徑
LOG_FILE="app.log"# 檢查進程是否已啟動
PID=$(pgrep -f "$APP_NAME")if [ -n "$PID" ]; thenecho "服務已啟動,PID: $PID"exit 0
fi# 啟動服務
echo "啟動服務: $APP_NAME"
nohup java -jar $JAVA_OPTS $APP_NAME > $LOG_FILE 2>&1 &# 獲取新的PID
PID=$(pgrep -f "$APP_NAME")
echo "服務啟動成功,PID: $PID"
echo "日志文件:$LOG_FILE"

然后設置腳本權限

chmod +x start.sh

最后啟動服務

./start.sh

再編寫一個停止腳本 stop.sh:?

vi stop.sh
#!/bin/bash# 項目名稱(JAR文件名稱)
APP_NAME="hywl-server.jar"# 獲取PID
PID=$(pgrep -f "$APP_NAME")if [ -z "$PID" ]; thenecho "服務未運行"exit 0
fi# 停止服務
echo "停止服務,PID: $PID"
kill -9 $PIDecho "服務已停止"
chmod +x stop.sh

再編寫一個 restart.sh

vi restart.sh
#!/bin/bash./stop.sh
sleep 2
./start.sh
chmod +x restart.sh

?? 6.腳本后臺啟動 Java 服務?(plus)

#!/bin/bash
set -eDATE=$(date +%Y%m%d%H%M)
# 基礎路徑(絕對路徑)
BASE_PATH=/root/service
# 服務名稱。同時約定部署服務的 jar 包名字也為它。
SERVER_NAME=hywl-server
# 環境
PROFILES_ACTIVE=dev# heapError 存放路徑
HEAP_ERROR_PATH=$BASE_PATH/heapError
# JVM 參數
JAVA_OPS="-Xms512m -Xmx512m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$HEAP_ERROR_PATH"# SkyWalking Agent 配置
#export SW_AGENT_NAME=$SERVER_NAME
#export SW_AGENT_COLLECTOR_BACKEND_SERVICES=192.168.0.84:11800
#export SW_GRPC_LOG_SERVER_HOST=192.168.0.84
#export SW_AGENT_TRACE_IGNORE_PATH="Redisson/PING,/actuator/**,/admin/**"
#export JAVA_AGENT=-javaagent:/work/skywalking/apache-skywalking-apm-bin/agent/skywalking-agent.jar# 停止:優雅關閉之前已經啟動的服務
function stop() {echo "[stop] 開始停止 $BASE_PATH/$SERVER_NAME"PID=$(ps -ef | grep $BASE_PATH/$SERVER_NAME | grep -v "grep" | awk '{print $2}')# 如果 Java 服務啟動中,則進行關閉if [ -n "$PID" ]; then# 正常關閉echo "[stop] $BASE_PATH/$SERVER_NAME 運行中,開始 kill [$PID]"kill -15 $PID# 等待最大 120 秒,直到關閉完成。for ((i = 0; i < 120; i++))dosleep 1PID=$(ps -ef | grep $BASE_PATH/$SERVER_NAME | grep -v "grep" | awk '{print $2}')if [ -n "$PID" ]; thenecho -e ".\c"elseecho '[stop] 停止 $BASE_PATH/$SERVER_NAME 成功'breakfidone# 如果正常關閉失敗,那么進行強制 kill -9 進行關閉if [ -n "$PID" ]; thenecho "[stop] $BASE_PATH/$SERVER_NAME 失敗,強制 kill -9 $PID"kill -9 $PIDfi# 如果 Java 服務未啟動,則無需關閉elseecho "[stop] $BASE_PATH/$SERVER_NAME 未啟動,無需停止"fi
}# 啟動:啟動后端項目
function start() {# 開啟啟動前,打印啟動參數echo "[start] 開始啟動 $BASE_PATH/$SERVER_NAME"echo "[start] JAVA_OPS: $JAVA_OPS"echo "[start] JAVA_AGENT: $JAVA_AGENT"echo "[start] PROFILES: $PROFILES_ACTIVE"# 開始啟動nohup java -server $JAVA_OPS $JAVA_AGENT -jar $BASE_PATH/$SERVER_NAME.jar --spring.profiles.active=$PROFILES_ACTIVE > nohup.out 2>&1 &echo "[start] 啟動 $BASE_PATH/$SERVER_NAME 完成"
}# 部署
function deploy() {cd $BASE_PATH# 第一步:停止 Java 服務stop# 第二步:啟動 Java 服務start
}deploy

?一般修改

?

?

啟動:

tail -f nohup.out

注意:這里是stop還是啟動,所以

ps -ef | grep hywl-server.jar | grep -v grep
kill -15 12345


?

2、使用docker

02Docker(mysql、nginx)-CSDN博客

首寫編寫一個Dockerfile文件

## AdoptOpenJDK 停止發布 OpenJDK 二進制,而 Eclipse Temurin 是它的延伸,提供更好的穩定性FROM m.daocloud.io/docker.io/eclipse-temurin:8-jre## 創建目錄,并使用它作為工作目錄
RUN mkdir -p /hywl-server
WORKDIR /hywl-server
## 將后端項目的 Jar 文件,復制到鏡像中
COPY hywl-server.jar app.jar## 設置 TZ 時區
## 設置 JAVA_OPTS 環境變量,可通過 docker run -e "JAVA_OPTS=" 進行覆蓋
ENV TZ=Asia/Shanghai JAVA_OPTS="-Xms512m -Xmx512m" BASE_PATH="/hywl-server"## 暴露后端項目的 48080 端口
EXPOSE 48080## 啟動后端項目
ENTRYPOINT java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -Dapp.home=${BASE_PATH} -jar app.jar

然后如下:

執行

docker build -t hywl-server .

制作完鏡像后需要啟動容器:

新建 Shell 腳本?deploy.sh,使用 Docker 啟動后端項目。編寫內容如下:

#!/bin/bash
set -e## 第一步:刪除可能啟動的老 hywl-server 容器
echo "開始刪除 hywl-server 容器"
docker stop hywl-server || true
docker rm hywl-server || true
echo "完成刪除 hywl-server 容器"## 第二步:啟動新的 hywl-server 容器 \
echo "開始啟動 hywl-server 容器"
docker run -d \
--name hywl-server \
-p 48080:48080 \
-e "SPRING_PROFILES_ACTIVE=dev" \
-v /opt/service/mall-docker/logs:/hywl-server/logs/ \
hywl-server
echo "正在啟動 hywl-server 容器中,需要等待 60 秒左右"

執行

sh deploy.sh

 docker logs -f hywl-server

-fdocker logs 命令中的一個選項,表示 --follow(跟隨/實時輸出日志)。?

日志也掛載了:

快速構建:

?第一次構建后

1、然后下次代碼更新先打包上傳

2、然后構建鏡像

docker build -t hywl-server .

3、然后?

sh deploy.sh

4、實時查看日志

 docker logs -f hywl-server

5、我們也可以直接進入容器查看:

docker exec -it hywl-server /bin/sh
docker exec -it hywl-server ls /bin

?

?

exit

?

或者?

CTRL + P + Q

然后停止容器:

docker stop

然后重啟:

?

sh deploy.sh

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

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

相關文章

遨游科普:三防平板是什么?有什么功能?

清晨的露珠還掛在帳篷邊緣&#xff0c;背包里的三防平板卻已開機導航&#xff1b;工地的塵土飛揚中&#xff0c;工程師正通過它查看施工圖紙&#xff1b;暴雨傾盆的救援現場&#xff0c;應急隊員用它實時回傳災情數據……這些看似科幻的場景&#xff0c;正因三防平板的普及成為…

Flask Docker Demo 項目指南

首先&#xff0c;創建一個新的項目目錄并創建必要的文件&#xff1a; mkdir flask-docker-demo cd flask-docker-demo創建一個簡單的Flask應用 (app.py)&#xff1a; from flask import Flaskapp Flask(__name__)app.route(/) def hello_world():return Hello, Docker World…

GO語言語法---if語句

文章目錄 1. 基本語法1.1 單分支1.2 雙分支1.3 多分支 2. Go特有的if語句特性2.1 條件前可以包含初始化語句2.2 條件表達式不需要括號2.3 必須使用大括號2.4 判斷語句所在行數控制 Go語言的if語句用于條件判斷&#xff0c;與其他C風格語言類似&#xff0c;但有一些獨特的語法特…

自動化 NuGet 包打包與上傳:完整批處理腳本詳解(含 SVN 支持)

在大型項目中&#xff0c;我們常常需要定期打包多個 .csproj 項目為 NuGet 包&#xff0c;并上傳到私有 NuGet 服務。這篇文章分享一份實戰腳本&#xff0c;支持以下自動化流程&#xff1a; 自動讀取、更新 .csproj 文件中的 Version、PackageOutputPath 等節點&#xff1b; 自…

刷leetcodehot100返航版--雙指針5/16

for (int i 0, j 0; i < n; i ) { while (j < i && check(i, j)) j ; // 具體問題的邏輯 } 常見問題分類&#xff1a; (1) 對于一個序列&#xff0c;用兩個指針維護一段區間 (2) 對于兩個序列&#xff0c;維護某種次序&#xff0c;比如歸并排序中…

手撕四種常用設計模式(工廠,策略,代理,單例)

工廠模式 一、工廠模式的總體好處 解耦&#xff1a;客戶端與具體實現類解耦&#xff0c;符合“開閉原則”。統一創建&#xff1a;對象創建交由工廠處理&#xff0c;便于集中控制。增強可維護性&#xff1a;新增對象種類時不需要大改動調用代碼。便于擴展&#xff1a;易于管理…

阿里通義萬相 Wan2.1-VACE:開啟視頻創作新境界

2025 年 5 月 14 日&#xff0c;阿里巴巴為視頻創作領域帶來了重磅驚喜 —— 開源通義萬相 Wan2.1-VACE。這一模型堪稱視頻生成與編輯領域的集大成者&#xff0c;憑借其全面且強大的功能&#xff0c;為廣大創作者、開發者以及企業用戶開辟了全新的視頻創作天地。它打破了以往視…

自定義類、元組、字典和結構體對比——AutoCAD C# 開發中建立不同對象之間的聯系

以下是對它們的詳細分析和對比&#xff1a; 1. 自定義類&#xff08;Class&#xff09; 優勢 封裝性強&#xff1a;可以定義字段、屬性、方法和事件&#xff0c;實現復雜的行為和邏輯。繼承與多態&#xff1a;支持繼承體系&#xff0c;可通過接口或抽象類實現多態。引用類型…

MVC架構模式

mvc架構是一種常見的開發模式,以下是三個核心部分 Model&#xff08;模型&#xff09;&#xff1a;負責應用程序的數據和業務邏輯。它與數據庫交互&#xff0c;處理數據的存儲、檢索和更新&#xff0c;是應用程序的核心業務所在。View&#xff08;視圖&#xff09;&#xff1a…

Python實例題:Python百行制作登陸系統

目錄 Python實例題 題目 python-login-systemPython 百行登錄系統腳本 代碼解釋 用戶數據庫&#xff1a; 注冊功能&#xff1a; 登錄功能&#xff1a; 主程序&#xff1a; 運行思路 注意事項 Python實例題 題目 Python百行制作登陸系統 python-login-systemPython…

uniapp使用全局組件,

在 Uniapp 中&#xff0c;如果你的組件是應用層組件&#xff08;例如全局懸浮按鈕、全局通知欄等&#xff09;&#xff0c;并且希望它自動出現在所有頁面而無需在每個頁面模板中手動添加組件標簽&#xff0c;可以通過以下兩種方案實現&#xff1a; 方案一&#xff1a;通過 app.…

(8)python開發經驗

文章目錄 1 下載python2 pip安裝依賴無法訪問3 系統支持4 下載python文檔5 設置虛擬環境6 編譯安裝python 更多精彩內容&#x1f449;內容導航 &#x1f448;&#x1f449;Qt開發 &#x1f448;&#x1f449;python開發 &#x1f448; 1 下載python 下載地址盡量不要下載最新版…

【原創】基于視覺大模型gemma-3-4b實現短視頻自動識別內容并生成解說文案

&#x1f4e6; 一、整體功能定位 這是一個用于從原始視頻自動生成短視頻解說內容的自動化工具&#xff0c;包含&#xff1a; 視頻抽幀&#xff08;可基于畫面變化提取關鍵幀&#xff09; 多模態圖像識別&#xff08;每幀圖片理解&#xff09; 文案生成&#xff08;大模型生成…

每日算法刷題計劃Day5 5.13:leetcode數組3道題,用時1h

11. 26. 刪除有序數組中的重復項(簡單&#xff0c;雙指針) 26. 刪除有序數組中的重復項 - 力扣&#xff08;LeetCode&#xff09; 思想: 1.我的思想: 雙指針遍歷集合儲存已有元素 2.官方思想&#xff1a; 題目條件有序數組刪除重復元素&#xff0c;所以重復元素都是連續存在…

Transformer 架構在目標檢測中的應用:YOLO 系列模型解析

目錄 Transformer 架構在目標檢測中的應用&#xff1a;YOLO 系列模型解析 一、YOLO 模型概述 二、YOLO 模型的核心架構 &#xff08;一&#xff09;主干網絡 &#xff08;二&#xff09;頸部結構 &#xff08;三&#xff09;頭部結構 三、YOLO 模型的工作原理 &#xf…

一個完整的項目示例:taro開發微信小程序

前一周完成了一個項目&#xff0c;體測成績轉換的工具&#xff0c;沒做記錄&#xff0c;。這次計劃開發一個地圖應用小程序&#xff0c;記錄一下。方便給使用的人。 一、申請微信小程序&#xff0c;填寫相應的信息&#xff0c;取得開發者ID。這個要給騰訊地圖使用的。 二、申…

動態規劃-LCR 166.珠寶的最大價值-力扣(LeetCode)

一、題目解析 frame二維矩陣中每個值代表珠寶的價值&#xff0c;現在從左上角開始拿珠寶&#xff0c;只能向右或向下拿珠寶&#xff0c;到達右下角時停止拿珠寶&#xff0c;要求拿的珠寶價值最大。 二、算法解析 1.狀態表示 我們想要知道的是到達[i,j]為位置時的最大價值&am…

安裝nerdctl和buildkitd腳本命令

#!/bin/bash set -euo pipefail # 檢查是否以root權限運行 if [ "$(id -u)" -ne 0 ]; then echo "錯誤&#xff1a;請使用root權限或sudo運行本腳本" >&2 exit 1 fi # 檢測openEuler系統&#xff08;兼容大小寫&#xff09; detect_distrib…

實現視頻分片上傳 OSS

訪問 OSS 有兩種方式&#xff0c;本文用到的是使用臨時訪問憑證上傳到 OSS&#xff0c;不同語言版本的代碼參考&#xff1a; 使用STS臨時訪問憑證訪問OSS_對象存儲(OSS)-阿里云幫助中心 1.安裝并使用 首先我們要安裝 OSS&#xff1a; npm install ali-oss --save 接著我們…

動態規劃(3)學習方法論:構建思維模型

引言 動態規劃是算法領域中一個強大而優雅的解題方法,但對于許多學習者來說,它也是最難以掌握的算法范式之一。與貪心算法或分治法等直觀的算法相比,動態規劃往往需要更抽象的思維和更系統的學習方法。在前兩篇文章中,我們介紹了動態規劃的基礎概念、原理以及問題建模與狀…