文章目录
Windows
命令行直接部署
1.配置jdk运行环境
2.java -jar <jar包>
缺点:终端关闭服务进程就停止
注册为Windows服务
下载WinSW工具
将下载的WinSW-x64.exe
文件重命名为与你的服务名称相匹配的名字,例如MyApp.exe
。同时,也需要准备一个配置文件MyApp.xml
,它定义了服务的行为和启动参数。
<service>
<id>myapp</id>
<name>My App Service</name>
<description>This runs Spring Boot as a Service.</description>
<executable>java</executable>
<arguments>-Xmx256m -jar "%BASE%\MyApp.jar"</arguments>
<logpath>%BASE%\logs</logpath>
<logmode>rotate</logmode>
<startmode>Automatic</startmode>
</service>
将MyApp.exe
和MyApp.xml
放置在同一目录下,然后打开命令提示符(以管理员身份),切换到该目录并执行以下命令来安装服务
MyApp.exe install
//启动,停止,卸载服务
MyApp.exe start
MyApp.exe stop
MyApp.exe uninstall
Linux
1.安装运行环境
在Ubuntu或Debian系统上,可以使用如下命令安装Java:
sudo apt update
sudo apt install default-jdk
而在CentOS或Fedora系统上,则可以使用以下命令:
sudo yum update
sudo yum install java-1.8.0-openjdk
2.用工具把jar包上传到Linux预置目录下
3.java -jar 命令启动
nohup
nohup
命令和输出重定向来启动JAR包。这种方式可以保证即使SSH会话结束,程序仍然继续运行,并且所有输出都会被记录到指定的日志文件中,便于后续查看和调试。例如:
nohup java -jar myapp.jar > /path/to/output.log 2>&1 &
//配置jvm参数
nohup java -Xms512m -Xmx1g -Dfile.encoding=UTF-8 -jar myapp.jar > output.log 2>&1 &
这里>
符号用于将标准输出重定向到output.log
文件,而2>&1
则表示将标准错误也重定向到同一个文件。&
符号使得命令在后台执行
结合脚本
#!/bin/bash
# 检查是否已经存在相同名称的服务
if ps ax | grep -v grep | grep myapp.jar > /dev/null
then
echo "Service already running."
else
# 启动服务并记录PID
nohup java -jar /path/to/myapp.jar > /path/to/output.log 2>&1 &
echo $! > /path/to/pid.txt
fi
注册为Linux服务
编写systemd服务配置文件
[Unit]
Description=My Java Application
After=network.target
[Service]
User=youruser
ExecStart=/usr/bin/java -jar /path/to/myapp.jar
Restart=on-failure
[Install]
WantedBy=multi-user.target
保存此文件为/etc/systemd/system/myapp.service后,可以通过以下命令启用并启动服务
sudo systemctl enable myapp
sudo systemctl start myapp
docker
1.写Dockerfile文本文件,然后构建镜像
# 使用官方OpenJDK镜像作为基础镜像
FROM openjdk:8-jdk-alpine
# 设置工作目录
WORKDIR /app
# 将当前目录下的JAR文件复制到容器内的/app目录下
COPY target/*.jar app.jar
# 暴露应用监听的端口(假设为8080)
EXPOSE 8080
# 设置时区(可选)
RUN apk add --no-cache tzdata && \
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
echo "Asia/Shanghai" > /etc/timezone
# 启动命令
ENTRYPOINT ["java", "-jar", "/app/app.jar"]
# 环境变量
ENV SPRING_PROFILES_ACTIVE=production
sudo docker build -t my-java-app .
2.运行包含该镜像的容器
sudo docker run -d --name my-java-app-container \
-p 8080:8080 \
-v /path/to/logs:/app/logs \
my-java-app
为了让容器能够随着Docker守护进程一同启动,可以在运行容器时加上--restart=always
选项。这意味着即使主机重启后,容器也会自动恢复运行状态
注意:对于多服务采用docker-compose.yml进行编排
具体复杂配置参照docker提供的各种命令进行,总体思路如上所示
Ubuntu举例使用docker
su root
apt update
apt install docker.io docker-compose
## 验证是否安装成功
docker -v
启动docker服务并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker
镜像管理
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
docker search
docker images
docker images | grep
docker build -t 镜像名称:版本号
docker rmi 镜像名称:版本号
docker rmi IMAGE_ID
容器管理
docker ps
docker ps -a
docker run
docker run -d -p 8080:80 --name webserver nginx:latest
docker exec -it CONTAINER_NAME /bin/bash
docker stop CONTAINER_NAME
docker start CONTAINER_NAME
docker restart CONTAINER_NAME
当不再需要某个容器时,可以先停止它,然后再用 docker rm CONTAINER_NAME 删除。如果希望连同数据卷一起删除,则可以在命令后面加上 -v 选项
docker logs CONTAINER_NAME
示例命令
docker run \
--name springboot-app \
--restart=always \
--network host \
--read-only \
--cap-drop=all \
--user 1000:1000 \
--env SPRING_PROFILES_ACTIVE=prod \
--env JAVA_OPTS="-Xmx512m -Xms512m" \
--volume /path/to/config:/config:ro \
--volume /path/to/logs:/logs \
-d \
my-springboot-app:latest
解释:
–name springboot-app
指定容器的名字为 springboot-app,方便后续管理和维护9。
–restart=always
设置容器的重启策略为总是重启,这意味着即使容器因为某种原因停止了,Docker 也会尝试重新启动它,以保证服务的高可用性9。
–network host
使用主机网络模式,这样可以避免端口映射的问题,并且通常会带来更好的网络性能。需要注意的是,在某些情况下(如多租户环境),你可能需要更细粒度的网络控制1。
–read-only
将容器的根文件系统设置为只读模式,这有助于提高安全性,防止容器内部的应用程序对文件系统的意外修改9。
–cap-drop=all
移除所有默认赋予容器的能力,进一步增强安全性。你可以根据需要添加特定的能力,例如 --cap-add=NET_BIND_SERVICE 允许绑定到低编号端口9。
–user 1000:1000
指定容器内运行进程的用户 ID 和组 ID,避免使用 root 用户执行任务,从而降低潜在风险20。
–env SPRING_PROFILES_ACTIVE=prod
通过环境变量激活 Spring Boot 的生产环境配置文件,确保应用按照生产环境的要求进行初始化22。
–env JAVA_OPTS=“-Xmx512m -Xms512m”
设置 JVM 启动参数,这里指定了最大和初始堆内存大小为 512MB。你可以根据实际情况调整这些值以满足应用的需求20。
–volume /path/to/config:/config:ro
将主机上的配置目录挂载到容器内的 /config 路径,并设置为只读访问,确保配置文件不会被应用程序修改17。
–volume /path/to/logs:/logs
挂载日志目录,允许将应用的日志输出保存到主机上,便于日后查看和分析17。
-d
让容器以后台守护进程的方式运行,不会占用当前终端窗口9。
my-springboot-app:latest
指定要使用的 Docker 镜像名称及标签,这里是最新版本的镜像
docker-compose使用
首先编写一个 docker-compose.yml 文件,定义各个服务之间的关系及配置。接着使用 docker-compose up -d 启动所有服务,并且可以通过 docker-compose down 来停止并移除这些服务
Docker Compose 文件语法是使用YAML格式编写的配置文件,它用于定义和运行多容器Docker应用程序。这个工具允许开发者在一个单独的文件中定义复杂的应用程序环境,简化了开发、测试和生产环境中应用的设置。下面我们将详细介绍 Docker Compose 文件的主要组成部分及其语法。
版本(Version)
首先,在编写 docker-compose.yml 文件时,必须指定版本号,这决定了文件的语法结构和支持的功能集。例如,version: “3.8” 表示使用的是第3.8版的Compose文件格式6。选择合适的版本非常重要,因为它确保了 Compose 工具与您的文件格式兼容,并且可以利用最新的特性。
服务(Services)
services 是 docker-compose.yml 文件中最核心的部分,用来定义构成应用程序的所有服务。每个服务通常包含以下属性:
image: 指定要使用的 Docker 镜像名称或ID。
build: 如果需要构建镜像,则可以通过此选项指定 Dockerfile 的路径或者构建上下文。
command: 覆盖容器启动后默认执行的命令。
ports: 映射主机端口到容器内部端口。
volumes: 定义卷挂载路径设置,支持相对路径及只读模式。
environment: 设置环境变量,既可以是数组也可以是字典形式。
env_file: 从外部文件加载环境变量。
depends_on: 表示依赖关系,确保某些服务先于其他服务启动。
networks: 加入一个或多个自定义网络。
deploy: 在 Swarm 模式下部署服务的相关配置,如副本数量等。
例如:
version: '3.8'
services:
web:
image: 'nginx:latest'
ports:
- '80:80'
volumes:
- ./html:/usr/share/nginx/html
environment:
- NGINX_HOST=example.com
env_file:
- .env
depends_on:
- db
networks:
- frontend
网络(Networks)
networks 元素允许您创建自定义网络,以便容器之间能够相互通信。默认情况下,Compose 会为应用创建一个桥接网络,但是您可以根据需求定义额外的网络类型,如覆盖网络(overlay)以实现跨节点通信2。
卷(Volumes)
volumes 可以定义持久化存储的数据卷,这些数据卷可以在不同容器间共享,即使容器被删除也不会丢失数据。此外,还可以指定外部存在的卷作为来源。
配置(Configs)和秘密(Secrets)
这两个元素主要用于管理敏感信息,如API密钥、密码等。它们提供了安全的方式将这些信息传递给服务,而不必直接编码在 docker-compose.yml 文件中