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.mzph.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)学习方法论:构建思维模型

引言 动态规划是算法领域中一个强大而优雅的解题方法,但对于许多学习者来说,它也是最难以掌握的算法范式之一。与贪心算法或分治法等直观的算法相比,动态规划往往需要更抽象的思维和更系统的学习方法。在前两篇文章中,我们介绍了动态规划的基础概念、原理以及问题建模与状…