Spring Boot + 外置tomcat + docker 打包部署

简介: 前言最近这段时间在做一个有关于"Docker Graceful shutdown",于是自己就开始做起了各种"小实验"。虽然说过程有点痛苦,但是结果总是好的,让我对于docker有了一些新的认识。

前言

最近这段时间在做一个有关于"Docker Graceful shutdown",于是自己就开始做起了各种"小实验"。

虽然说过程有点痛苦,但是结果总是好的,让我对于docker有了一些新的认识。

正文

言归正传,今天我们的主题是Spring Boot + 外置tomcat + Docker,然后用做好的镜像可以去做部署。

我们需要修改两大块的地方:

  1. Spring boot
  2. Docker

我并不是把tomcat落下了。原因是我们可以让docker引用tomcat的镜像。


首先我们来改造Spring boot 项目,让他"摆脱"内置的tomcat

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.demo</groupId>
    <artifactId>externaltomcattest</artifactId>
    <version>1.0</version>
    <packaging>war</packaging>
    <name>externaltomcattest</name>
    <description>This project is used to test graceful shutdown, and use external tomcat</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                  <!--这个地方时摆脱tomcat的关键-->
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>ch.qos.logback</groupId>
                    <artifactId>logback-classic</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>ch.qos.logback</groupId>
                    <artifactId>logback-core</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

      <!--将tomcat的scope的作用域设置为provided,这个地方和上面说的那个exclusion里面其实选其一就行-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

启动类:

package com.demo.externaltomcattest;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ExternaltomcattestApplication {

    public static void main(String[] args) {
        SpringApplication.run(ExternaltomcattestApplication.class, args);
    }

}

和启动类同级的地方,我们添加上这样一个类,名字叫做ServletInitializer:

package com.demo.externaltomcattest;

import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

public class ServletInitializer extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(ExternaltomcattestApplication.class);
    }

}

关键就是以上三步。

有不懂的可以参考我的github:https://github.com/luckypoison/SpringBootTomcatExternalTest

️只需要注意上面我说的那几个地方就行,剩下的是我为了做grace-shutdown测试用的‍️。


接下来我们需要打出来一个war包用于部署,不知道何为war包的,可以去自行搜索。

使用下面的命令进行打包:

mvn clean package

然后我们就可以在当前项目目录下面的target目录下面找到war包了。


在接下来我们就应该在一个空的文件夹下面,放上dockerfile,和我们的war包。

Dockerfile内容如下:

FROM tomcat:9.0

COPY externaltomcattest-1.0.war /usr/local/tomcat/webapps 

EXPOSE 8080

CMD ["catalina.sh", "run"]

下面做一下基本的讲解:

  1. FROM 指令告诉我们需要使用的Docker应该使用哪一个basic的镜像
  2. 拷贝我们的war包到docker中的tomcat的一个路径下。
  3. 暴露8080端口
  4. 启动tomcat

然后使用下面的命令进行构建:

首先我们需要进到刚刚我们新创建的文件夹下面。

docker build -t external-tomcat-test:1.0 .

-t 后面跟着的是我们需要打包出来的镜像的名字和版本号。

️后面的"."是不可以缺少的。

然后使用下面的命令,如果里面有我们刚刚打包出来的镜像,证明我们构建成功:

docker images

最后启动就可以了。

docker run -p 8080:8080 <imageId>

如果有需要可以把构建镜像和启动放在需要的地方。

后记

这是一个简单的例子,如果对docker上有什么知道的命令可以去官网进行查询:

https://docs.docker.com/engine/reference/run/

如果遇到了什么问题,可以在下方评论区告诉我们,我会尽量进行解答。

目录
相关文章
|
4天前
|
监控 Java 应用服务中间件
Spring Boot整合Tomcat底层源码分析
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置和起步依赖等特性,大大简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是其与Tomcat的整合。
20 1
|
6天前
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
18 2
|
1月前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
54 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
1月前
|
Java Docker 微服务
SpringBoot微服务打包Docker镜像
SpringBoot微服务打包Docker镜像
|
5月前
|
JavaScript 前端开发 数据安全/隐私保护
阿里云云效操作报错合集之流水线中获取不到CI_COMMIT_REF_NAME变量,导致docker镜像打包失败,什么原因
本合集将整理呈现用户在使用过程中遇到的报错及其对应的解决办法,包括但不限于账户权限设置错误、项目配置不正确、代码提交冲突、构建任务执行失败、测试环境异常、需求流转阻塞等问题。阿里云云效是一站式企业级研发协同和DevOps平台,为企业提供从需求规划、开发、测试、发布到运维、运营的全流程端到端服务和工具支撑,致力于提升企业的研发效能和创新能力。
|
1月前
|
Java 应用服务中间件 Maven
idea+maven+tomcat+spring 创建一个jsp项目
这篇文章介绍了如何在IntelliJ IDEA中使用Maven和Tomcat创建一个JSP项目,包括配置Maven依赖、设置Tomcat服务器、编写JSP页面、创建控制器和配置文件,以及项目的运行结果。
168 0
idea+maven+tomcat+spring 创建一个jsp项目
|
1月前
|
缓存 NoSQL Java
Springboot自定义注解+aop实现redis自动清除缓存功能
通过上述步骤,我们不仅实现了一个高度灵活的缓存管理机制,还保证了代码的整洁与可维护性。自定义注解与AOP的结合,让缓存清除逻辑与业务逻辑分离,便于未来的扩展和修改。这种设计模式非常适合需要频繁更新缓存的应用场景,大大提高了开发效率和系统的响应速度。
58 2
|
1月前
|
监控 数据可视化 Java
springBoot:actuator&admin 图形可视化&spring 打包 (七)
本文介绍了Spring Boot Actuator及其图形化管理界面Spring Boot Admin的使用方法,包括依赖导入、服务端与客户端配置、以及如何打包为JAR和WAR文件并部署。通过这些步骤,可以实现应用的监控和管理功能。
|
3月前
|
开发框架 .NET Linux
【Azure Developer】已发布好的.NET Core项目文件如何打包为Docker镜像文件
【Azure Developer】已发布好的.NET Core项目文件如何打包为Docker镜像文件