本文详细介绍了如何使用传统的 nohup 方法和 Docker 容器化部署 Spring Boot 项目,包括步骤、注意事项和两种方法的对比。


1. 使用 nohup 部署 JAR 包

nohup 是一个常用的 Linux 命令,可以在后台运行进程,即使关闭终端,进程仍然会继续运行。

1.1 部署步骤

  1. 上传 JAR 文件到服务器

    例如,将 your-application.jar 文件上传到服务器的 /home 目录。

  2. 使用 nohup 命令启动 JAR 文件

    nohup java -jar your-application.jar > output.log 2>&1 &

    解释:

    • nohup:在后台运行命令。

    • java -jar your-application.jar:执行 JAR 文件。

    • > output.log 2>&1:将标准输出和错误输出重定向到 output.log 文件。

    • &:将进程放到后台运行。

  3. 查看日志和进程状态

    • 查看日志:

      tail -f output.log
      
    • 查看运行中的进程:

      ps -ef | grep java
      

1.2 注意事项

  • 数据库连接:确保数据库连接配置正确。如果连接到 Docker 容器中的 MySQL 数据库,连接地址应设置为容器的服务名。

  • 端口占用:确保端口未被其他服务占用。

  • 日志管理:定期清理日志文件,以避免占用过多磁盘空间。


2. 使用 Docker 部署 JAR 包

Docker 提供了一种高效的应用程序及其依赖项管理方式,通过容器化实现。

2.1 编写 Dockerfile

在项目根目录下创建一个 Dockerfile 文件,内容如下:

# 使用 OpenJDK 8 基础镜像
FROM openjdk:8-jdk-alpine

# 设置工作目录
WORKDIR /app

# 将 JAR 文件复制到 Docker 镜像中
COPY your-application.jar /app/your-application.jar

# 运行 JAR 文件的命令
CMD ["java", "-jar", "/app/your-application.jar"]

2.2 构建 Docker 镜像

运行以下命令构建 Docker 镜像:

docker build -t your-application:v1.0 .

解释:

  • -t your-application:v1.0:将镜像命名为 your-application,版本为 v1.0

2.3 创建 Docker 网络

为了确保容器之间能够相互通信,需要创建一个自定义 Docker 网络:

docker network create my-network

2.4 启动 MySQL 容器并添加到网络

如果使用 MySQL,启动 MySQL 容器并将其添加到同一网络中:

docker run -d \
  --name my-mysql-container \
  --network my-network \
  -e MYSQL_ROOT_PASSWORD=root \
  -e MYSQL_DATABASE=my_database \
  mysql:8.0

2.5 启动 Spring Boot 容器

运行以下命令启动 Spring Boot 容器:

docker run -d \
  --name your-application-container \
  --network my-network \
  -p 8080:8080 \
  -e SPRING_DATASOURCE_URL="jdbc:mysql://my-mysql-container:3306/my_database?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&useSSL=false" \
  -e SPRING_DATASOURCE_USERNAME="your-username" \
  -e SPRING_DATASOURCE_PASSWORD="your-password" \
  your-application:v1.0

解释:

  • -d:在后台运行容器。

  • --name:为容器指定名称。

  • --network:将容器连接到指定网络。

  • -p:将容器端口映射到主机端口。

  • -e:设置数据库连接的环境变量。

2.6 查看容器日志

为了排查问题,可以查看容器日志:

docker logs your-application-container

2.7 将现有容器添加到网络

如果 MySQL 容器未在同一网络中,可以手动将其连接到网络:

docker network connect my-network my-mysql-container

2.8 通用命令中的替换项

  • your-application:替换为你的应用程序名称。

  • my-network:替换为你的 Docker 网络名称。

  • my-mysql-container:替换为你的 MySQL 容器名称。

  • my_database:替换为你的数据库名称。

  • your-usernameyour-password:替换为你的数据库用户名和密码。


3. 对比 nohup 和 Docker 部署方法

对比项

nohup 部署

Docker 部署

复杂度

简单,适用于小型项目

略复杂,适用于容器化应用

环境一致性

环境可能存在差异

确保环境一致

资源隔离

无资源隔离

良好的资源隔离

可扩展性

手动扩展困难

支持 Docker Compose 和 Kubernetes

日志管理

需要手动管理日志

可以使用 Docker 日志驱动

维护性

进程管理较复杂

容器管理更简单


4. 总结

  • nohup 部署:适合简单的小型项目,部署过程简单但扩展性较弱。

  • Docker 部署:适合容器化环境,提供更好的扩展性、资源管理和一致的部署环境。

根据项目需求选择合适的部署方法。如果项目依赖较多且更新频繁,推荐使用 Docker。对于简单应用,nohup 方式也足够。