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/

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

目录
相关文章
|
10月前
|
安全 Java 持续交付
如何实现上传jar直接部署成功,这篇文章直接带你上手springboot实现jar包热更新!
本文详细讲解了在Spring Boot应用中实现Jar包热更新的实践方法。通过自定义类加载器(`HotClassLoader`),动态加载和卸载指定目录下的Jar包,结合Spring Bean动态注册机制,使新加载的类能够被Spring容器管理。同时,提供了文件上传接口,方便用户手动触发Jar包更新。文章还强调了安全性、依赖管理和线程安全等注意事项,并给出了测试步骤和总结,帮助开发者高效实现热更新功能,减少服务中断和提升开发效率。
|
5月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
853 5
|
7月前
|
Java Linux 网络安全
Linux云端服务器上部署Spring Boot应用的教程。
此流程涉及Linux命令行操作、系统服务管理及网络安全知识,需要管理员权限以进行配置和服务管理。务必在一个测试环境中验证所有步骤,确保一切配置正确无误后,再将应用部署到生产环境中。也可以使用如Ansible、Chef等配置管理工具来自动化部署过程,提升效率和可靠性。
727 13
|
10月前
|
前端开发 Java 物联网
智慧班牌源码,采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署
智慧班牌系统是一款基于信息化与物联网技术的校园管理工具,集成电子屏显示、人脸识别及数据交互功能,实现班级信息展示、智能考勤与家校互通。系统采用Java + Spring Boot后端框架,搭配Vue2前端技术,支持SaaS云部署与私有化定制。核心功能涵盖信息发布、考勤管理、教务处理及数据分析,助力校园文化建设与教学优化。其综合性和可扩展性有效打破数据孤岛,提升交互体验并降低管理成本,适用于日常教学、考试管理和应急场景,为智慧校园建设提供全面解决方案。
589 70
|
6月前
|
Java jenkins 应用服务中间件
结合Jenkins与Tomcat,实施Maven项目的自动构建和部署流程。
任何项目构建和部署的自动化流程,总离不开对各个环节精细把控与密切配合。涉及到源代码管理、构建工具、持续集成服务器以及最终的运行时环境的协调。通过上述简洁实用的步骤,可以实现Maven项目从源代码到运行状态的无缝过渡,进而提升软件开发的效率与质量。
359 0
|
9月前
|
Java 关系型数据库 MySQL
在Linux平台上进行JDK、Tomcat、MySQL的安装并部署后端项目
现在,你可以通过访问http://Your_IP:Tomcat_Port/Your_Project访问你的项目了。如果一切顺利,你将看到那绚烂的胜利之光照耀在你的项目之上!
472 41
|
9月前
|
开发框架 Java 关系型数据库
在Linux系统中安装JDK、Tomcat、MySQL以及部署J2EE后端接口
校验时,浏览器输入:http://[your_server_IP]:8080/myapp。如果你看到你的应用的欢迎页面,恭喜你,一切都已就绪。
598 17
|
9月前
|
Java 关系型数据库 MySQL
在Linux操作系统上设置JDK、Tomcat、MySQL以及J2EE后端接口的部署步骤
让我们总结一下,给你的Linux操作系统装备上最强的军队,需要先后装备好JDK的弓箭,布置好Tomcat的阵地,再把MySQL的物资原料准备好,最后部署好J2EE攻城车,那就准备好进军吧,你的Linux军团,无人可挡!
216 18
|
7月前
|
Prometheus 监控 Cloud Native
Docker 部署 Prometheus 和 Grafana 监控 Spring Boot 服务
Docker 部署 Prometheus 和 Grafana 监控 Spring Boot 服务实现步骤
678 0
|
9月前
|
开发框架 关系型数据库 Java
Linux操作系统中JDK、Tomcat、MySQL的完整安装流程以及J2EE后端接口的部署
然后Tomcat会自动将其解压成一个名为ROOT的文件夹。重启Tomcat,让新“植物”适应新环境。访问http://localhost:8080/yourproject看到你的项目页面,说明“植物”种植成功。
280 10

热门文章

最新文章