IDEA+Docker一键部署项目SpringBoot项目

更多 IDEA 的使用技巧可以查看 IDEA 专栏:IDEA

1. 部署项目的传统方式

我们先来看一下部署项目的传统方式:

  1. 将项目打成 jar 包
  2. 将本地打包出来的 jar 包上传到服务器上
  3. 通过 java -jar 指令启动项目

如果项目需要重新部署,需要重新执行一次以上步骤,非常麻烦,而且传统的部署项目方式也不方便查看日志

今天为大家介绍的 IDEA + Docker 一键部署项目正是为了解决这个问题,不仅操作简单,而且查看日志也非常方便


本次演示使用的是安装了汉化插件的 IDEA,英文版的 IDEA 操作类似

2. SSH配置

由于需要连接服务器进行远程部署,所以要先配置 SSH


打开 IDEA 的设置界面

在这里插入图片描述

在设置界面中找到 SSH 配置

在这里插入图片描述

点击 +,创建一个新的 SSH 连接,填入主机、用户名和密码后点击测试连接

在这里插入图片描述

3. 连接Docker守护进程

成功连接 Docker 守护进程后才能执行与 Docker 相关的操作


在设置中找到 Docker,点击 +,选择以 SSH 方法连接到 Docker 守护进程,接着点击下拉列表,选择刚才创建的 SSH 配置

在这里插入图片描述

完成以上操作后点击应用,再点击确定

4. 创建SpringBoot应用程序

4.1 编写接口

我们在 SpringBoot 应用程序中编写一个简单的接口,在 11020 端口上启动项目

在这里插入图片描述

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloWorldController {

    @GetMapping("/")
    public String index() {
        return "<h1>Hello, world</h1>";
    }

}

4.2 日志相关配置

对日志不太了解的同学,可以参考我的另一篇文章:在SpringBoot项目中优雅地记录日志(日志框架选型、SpringBoot默认的日志实现框架、如何使用日志框架、如何切换日志的具体实现框架、与日志相关的配置、记录日志的最佳实践)


我们在 resources 目录下新建一个名为 logback.xml 的文件,用于编写与日志相关的配置

logback.xml

将以下内容粘贴到 logback.xml 文件中,重点修改两个部分:

  • APP_NAME:应用程序的名称
  • LOG_FILE_PATH:日志文件的存储路径
<?xml version="1.0" encoding="UTF-8"?>

<configuration debug="true">
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>

    <!-- 定义应用程序名称 -->
    <property name="APP_NAME" value="one-click-deployment"/>
    <!-- 定义日志文件的存储路径 -->
    <property name="LOG_FILE_PATH" value="/${APP_NAME}/logs"/>
    <!-- 定义日志文件的文件名,通过拼接日志文件的存储路径、应用程序名称、log扩展名来创建完整的日志文件 -->
    <property name="LOG_FILE_NAME" value="${LOG_FILE_PATH}/${APP_NAME}.log"/>

    <!-- Console 输出配置 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 编码器配置,用于格式化日志输出 -->
        <encoder>
            <!-- 定义日志消息的输出格式,包括日期、进程ID、线程名、日志级别、日志器名和日志消息 -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [${PID:- }] [%thread] %-5level %logger{36} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- File 输出配置 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 编码器配置,用于格式化日志输出 -->
        <encoder>
            <!-- 定义日志消息的输出格式,包括日期、进程ID、线程名、日志级别、日志器名和日志消息 -->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [${PID:- }] [%thread] %-5level %logger{36} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <!-- 滚动策略配置,基于时间的滚动策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 定义滚动日志文件的命名模式,文件名包含日期,并且每天生成一个新的日志文件 -->
            <fileNamePattern>${LOG_FILE_NAME}.%d{yyyy-MM-dd}.log</fileNamePattern>
        </rollingPolicy>

    </appender>

    <!-- 异步输出配置 -->
    <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 队列大小,定义了在内存中存储日志事件的队列的最大容量 -->
        <queueSize>512</queueSize> <!-- 队列大小 -->

        <!-- 丢弃阈值,当队列剩余容量小于这个值时,将丢弃低于指定级别的日志事件 -->
        <!-- 0 表示不丢弃任何级别的日志事件 -->
        <discardingThreshold>0</discardingThreshold> <!-- 丢弃阈值,0 表示不丢弃 -->

        <!-- 队列满时是否阻塞主线程,true 表示即使队列满了也不会阻塞主线程 -->
        <!-- 这可能会导致日志事件丢失 -->
        <neverBlock>true</neverBlock> <!-- 队列满时是否阻塞主线程,true 表示不阻塞 -->

        <!-- 指定异步日志输出要引用的appender,此处只能引用一个appender,如果引用了多个appender,只有第一个appender生效 -->
        <!-- 异步appender会将日志事件转发给这里指定的appender -->
        <appender-ref ref="FILE"/> <!-- 生效的日志目标 -->
    </appender>

    <!-- 设置日志级别为INFO,即INFO级别及以上的日志事件才会被处理 -->
    <root level="INFO">
        <!-- 引用名为CONSOLE的appender,将日志输出到控制台 -->
        <appender-ref ref="CONSOLE"/>

        <!-- 引用名为FILE的appender,将日志输出到文件 -->
        <!--<appender-ref ref="FILE"/>-->

        <!-- 引用名为ASYNC的异步appender,提高日志记录性能 -->
        <appender-ref ref="ASYNC"/>
    </root>

</configuration>

5. 编写Dockerfile文件

对 Dockerfile 文件不是很了解的同学,可以参考我的另一篇博文:Dockerfile详解(Dockerfile的基本结构、使用Dockerfile自定义镜像示例、主流编程语言和中间件的基础Docker镜像、编写Dockerfile的最佳实践)


接着需要编写一个用于定义和构建 Docker 镜像的文本文件,文件名为 Dockerfile,Dockerfile 中的配置可根据自身项目情况进行调整

# 基础镜像
FROM openjdk:17-jdk-alpine

# 复制jar包至镜像内
# 复制的目录需放置在与 Dockerfile 文件同级的目录下
COPY target/one-click-deployment-0.0.1-SNAPSHOT.jar /one-click-deployment-0.0.1-SNAPSHOT.jar

# 容器启动执行命令
ENTRYPOINT ["java", "-jar", "/one-click-deployment-0.0.1-SNAPSHOT.jar", "--spring.profiles.active=prod"]

# 对外暴露的端口号
EXPOSE 11020

jar 包的名称需要与 pom.xml 文件中的配置保持一致

在这里插入图片描述


也可以在 Maven 管理界面执行 package 操作后直接复制 jar 包的名称

在这里插入图片描述

在这里插入图片描述


jar 包所在的目录(一般是 target 目录)需放置在与 Dockerfile 文件同级的目录下

在这里插入图片描述

至此准备工作已经全部完成,接下来即可正式开始配置远程一键部署

6. 配置远程部署

首次配置可能比较繁琐,但后续部署项目是真的方便,赶紧动手试一下吧

6.1 创建配置

在这里插入图片描述

点击 +,选择 Dockerfile

在这里插入图片描述

  • 勾选存储为项目文件,这样 IDEA 重启后改配置也会继续保存
  • 自定义名称
  • 服务器选择我们刚才连接的 Docker 守护进程(如果没有自动识别,可以点击后面的三个小点自行配置)
  • 选择我们刚才编写的 Dockerfile 文件
  • 自定义镜像标记
  • 自定义容器名称
one-click-deployment:1.0.0

在这里插入图片描述

6.2 绑定端口

在这里插入图片描述

在这里插入图片描述

根据实际情况填写端口

在这里插入图片描述

6.3 目录挂载

因为 jar 包运行后产生的日志文件是在容器内的,为了方便查看日志,我们将日志文件所在的目录挂载宿主机的 /home/ubuntu/one-click-deployment/logs 目录上

/home/ubuntu/one-click-deployment/logs

点击修改,接着点击绑定挂载

在这里插入图片描述

点击浏览

在这里插入图片描述

点击添加

在这里插入图片描述

填写完主机路径和容器路径后点击确定

在这里插入图片描述

6.4 添加执行前要运行的任务

在这里插入图片描述

选择运行 Maven 目标

在这里插入图片描述

添加 clean 和 package 操作

在这里插入图片描述

在这里插入图片描述

最后点击应用和确定

在这里插入图片描述

至此,所有配置都已完成

7. 部署项目

点击绿色小三角即可自动完成项目部署(如果项目需要重新部署,再次点击绿色小三角即可)

在这里插入图片描述

成功部署之后,就能够很方便地在 IDEA 的控制台看到项目的运行日志了

在这里插入图片描述

并且日志文件也成功挂载到了宿主机上(由于在容器中是以 root 用户执行所有命令的,所以宿主机上对应文件的权限也是 root)

在这里插入图片描述

8. 开放防火墙的 11020 端口

  • 如果你使用的是云服务器,在安全组中放行 11020 端口
  • 如果你安装了宝塔,除了在安全组中放行 11020 端口,可能还要在宝塔中放行 11020 端口

9. 访问项目

在浏览器输入以下网址,访问项目(将 ip 地址更改为你的服务器的地址)

http://127.0.0.1:11020/

访问成功后的界面

在这里插入图片描述

10. 可能遇到的问题

10.1 Cannot connect to the Docker daemon. Is the docker daemon running?

如果你点击小三角后部署失败,并且 IDEA 给出了以下提示,可能是因为 SSH 配置中的用户并没有连接 Docker 的权限

Cannot connect to the Docker daemon. Is the docker daemon running?

在这里插入图片描述


解决方法:将 SSH 配置中的用户添加到 docker 用户组

sudo usermod -aG docker $USER

在这里插入图片描述

运行以下指令,确保SSH 配置中的用户已经成功添加到 docker 用户组

getent group docker

在这里插入图片描述

注意:添加用户到 docker 用户组后需要重启 IDEA

成功连接 Docker 后的界面

在这里插入图片描述

10.2 no main manifest attribute, in /one-click-deployment-0.0.1-SNAPSHOT.jar

在这里插入图片描述

错误信息 “no main manifest attribute, in /one-click-deployment-0.0.1-SNAPSHOT.jar” 表明 JAR 文件中没有指定主类(即程序的入口点)

之所以产生这种情况,有可能是因为项目的 pom.xml 文件没有指定主类,也有可能是因为 SpringBoot 打包插件没生效


解决方法:修改项目的 pom.xml 文件,同时确保 SpringBoot 打包插件生效了(skip 属性默认为 false,表示启用打包插件)

在这里插入图片描述

10.3 Please refer to F:\Blog\one-click-deployment\target\surefire-reports for the individual test results.

Please refer to F:\Blog\one-click-deployment\target\surefire-reports for the individual test results.
Please refer to dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date].dumpstream.

在这里插入图片描述

在这里插入图片描述

错误原因:我们在 logback.xml 文件中指定的日志文件的存放路径 /one-click-deployment/logs 在本地 Windows 操作系统上找不到

因为我们的 jar 包最终是要部署在 Linux 服务器上的,这个报错不影响我们正常部署,我们只需要跳过 MAVEN 的测试阶段就可以了


双击 package 步骤

在这里插入图片描述

在 package 后面添加 -DskipTests 参数后点击确定

-DskipTests

在这里插入图片描述

最后点击应用和确定

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

聂 可 以

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值