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


1. 使用 nohup 部署 JAR 包

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

1.1 部署步骤

  1. 上传 JAR 文件到服务器

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

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

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

      解释:

      • nohup:在后台运行命令。

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

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

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

    • 查看日志和进程状态

      • 查看日志:

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

        bash
        • 01
        ps -ef | grep java

    1.2 注意事项

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

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

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


    2. 使用 Docker 部署 JAR 包

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

    2.1 编写 Dockerfile

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

    Dockerfile
    • 01
    • 02
    • 03
    • 04
    • 05
    • 06
    • 07
    • 08
    • 09
    • 10
    • 11
    # 使用 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 镜像:

    bash
    • 01
    docker build -t your-application:v1.0 .

    解释:

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

    2.3 创建 Docker 网络

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

    bash
    • 01
    docker network create my-network

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

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

    bash
    • 01
    • 02
    • 03
    • 04
    • 05
    • 06
    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 容器:

    bash
    • 01
    • 02
    • 03
    • 04
    • 05
    • 06
    • 07
    • 08
    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 查看容器日志

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

    bash
    • 01
    docker logs your-application-container

    2.7 将现有容器添加到网络

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

    bash
    • 01
    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 方式也足够。