Spring Boot + 外置tomcat + docker 打包部署
前言
最近这段时间在做一个有关于"Docker Graceful shutdown",于是自己就开始做起了各种"小实验"。
虽然说过程有点痛苦,但是结果总是好的,让我对于docker有了一些新的认识。
正文
言归正传,今天我们的主题是Spring Boot + 外置tomcat + Docker,然后用做好的镜像可以去做部署。
我们需要修改两大块的地方:
- Spring boot
- 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"]
下面做一下基本的讲解:
- FROM 指令告诉我们需要使用的Docker应该使用哪一个basic的镜像
- 拷贝我们的war包到docker中的tomcat的一个路径下。
- 暴露8080端口
- 启动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/
如果遇到了什么问题,可以在下方评论区告诉我们,我会尽量进行解答。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Java描述设计模式(21):状态模式
本文源码:GitHub·点这里 || GitEE·点这里 一、生活场景 1、场景描述 变色龙是爬行动物,是非常奇特的动物,它有适于树栖生活的种种特征和行为,身体也会随着环境的变化而变化出适应环境的颜色,非常神奇。下面基于状态模式对该变化过程进行描述。 2、代码实现 public class C01_InScene { public static void main(String[] args) { Chameleon chameleon = new Chameleon("红色","花丛环境") ; LifeContext lifeContext = new LifeContext() ; // 树叶环境 BodyColor bodyColor = new GreenColor (); lifeContext.setBodyColor(bodyColor); lifeContext.change(chameleon); // 树枝环境 bodyColor = new GrayColor() ; lifeContext.setBodyColor(bodyColor); lifeContex...
- 下一篇
容器日志知多少 (2) 开源日志管理方案 ELK/EFK
本篇已加入《.NET Core on K8S学习实践系列文章索引》,可以点击查看更多容器化技术相关系列文章。上一篇《你必须知道的容器日志(1)》中介绍了Docker自带的logs子命令以及其Logging driver,本篇将会介绍一个流行的开源日志管理方案ELK。 一、关于ELK 1.1 ELK简介 ELK 是Elastic公司提供的一套完整的日志收集以及展示的解决方案,是三个产品的首字母缩写,分别是ElasticSearch、Logstash 和 Kibana。 Elasticsearch是实时全文搜索和分析引擎,提供搜集、分析、存储数据三大功能 Logstash是一个用来搜集、分析、过滤日志的工具 Kibana是一个基于Web的图形界面,用于搜索、分析和可视化存储在 Elasticsearch指标中的日志数据 1.2 ELK日志处理流程 上图展示了在Docker环境下,一个典型的ELK方案下的日志收集处理流程: Logstash从各个Docker容器中提取日志信息 Logstash将日志转发到ElasticSearch进行索引和保存 Kibana负责分析和可视化日志信息 由于Lo...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS关闭SELinux安全模块
- CentOS7,CentOS8安装Elasticsearch6.8.6