同福

将SpringBoot项目发布到Docker里的Tomcat服务器的方法【20211119】

介绍

介绍

今天我们学习一下如何将我们的SpringBoot项目发布到Tomcat服务器上面。

SpringBoot和其他框架不太一样,它自己是捆绑了Tomcat服务器的,所以我们说将SpringBoot项目发布到Tomcat服务器,其实就是把SpringBoot运行起来而已。

如果要发布到现有的Tomcat服务器上面的话,还需要进行一些调整,这个福哥也会教给大家。

Tomcat

首先,福哥要说一下,在微服务时代大家都是玩Docker的,既然要发布到Tomcat自然想到的是利用tomcat作为基础镜像来设计自己的镜像,但是。。。

使用官方的tomcat镜像是无论如何都无法部署SpringBoot框架开发的项目!!!

所以,福哥只能从官网下载tomcat和jdk的软件包来自己安装了。大家也会觉得这种方式真的很恶心吧?所以这种方式部署SpringBoot项目只是学习一下就好~

打包war

要知道一件事情,要把SpringBoot项目发布到Tomcat服务器上面,需要把项目打包成war格式的压缩包。

首先,把下面的启动程序对象改为扩展自SpringBootServletInitializer对象。

@SpringBootApplication
@EnableJpaAuditing
public class TfspringApplication extends SpringBootServletInitializer {

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

然后,在pom.xml里面的project节点下面增加war设定。

<packaging>war</packaging>

这样就可以了!!

Dockerfile

下载tomcat

福哥给出tomcat的官方下载地址,大家可以进去自己下载。

https://tomcat.apache.org/download-90.cgi

home/topic/2021/1117/18/5c2e15bd99c5c52bd39dd19959733c9a.png

下载JDK

福哥给出JDK的官方下载地址,大家可以进去自己下载。现在从oracle下载JDK需要注册了,需要一个电子邮箱就可以注册oralce的账号,然后就可以下载了!

https://www.oracle.com/java/technologies/downloads/#java8

home/topic/2021/1117/18/85f57f0b8ac1eaf7f99242b55ede2226.png

Dockerfile

福哥使用的是centos:7作为基础镜像,虽然比较大,但是工具比较齐全,用起来顺手~~

首先,把tomcat和jdk解压出来,通过ADD命令直接就可以解压缩了,只不过需要直接改一下文件夹名称。

然后,将war包复制到webapps下面,使用ROOT.war这个文件名可以部署到根目录上面。

最后,通过catalina.sh脚本启动tomcat服务。

FROM centos:7

MAINTAINER Andy Bogate
MAINTAINER tongfu@tongfu.net
MAINTAINER https://tongfu.net/dockerfile
MAINTAINER 2021/11/17
MAINTAINER v1.0.0

ENV tomcatRoot=/usr/local/tomcat
ENV serverPort 8080
ENV xms 128m
ENV xmx 512m
ENV JAVA_HOME=/usr/local/jdk

EXPOSE ${serverPort}

# packages
ADD apache-tomcat-9.0.54.tar.gz /usr/local/
ADD jdk-8u202-linux-x64.tar.gz /usr/local/
RUN mv /usr/local/apache-tomcat-9.0.54/ /usr/local/tomcat/ \
&& rm -rf /usr/local/tomcat/webapps/* \
&& mv /usr/local/jdk1.8.0_202/ /usr/local/jdk/

# copy jar
COPY tfspring-1.0.0-RELEASE.war ${tomcatRoot}/webapps/ROOT.war

# work directory
WORKDIR ${tomcatRoot}

# entry point
ENTRYPOINT ["sh", "-c", "${tomcatRoot}/bin/catalina.sh run"]

部署

首先,福哥通过docker build创建镜像。

docker build -f Dockerfile -t springboot/tomcat ./

然后,福哥使用springboot/tomcat镜像启动一个容器。

这里使用了bridge2网络是为了可以直接访问docker-compose的服务。

docker run -tid --name springboot-tomcat -h springboot-tomcat --net bridge2 -p 8080:8080 springboot/tomcat

测试

切入容器里面看看,里面有Tomcat的目录结构。

查看catalina日志文件发现有部署信息,却没有看到SpringBoot启动信息。其实这个不用担心,如果部署出错了还是可以看到错误信息的。

docker exec -ti springboot-tomcat bash

home/topic/2021/1118/11/b212c7a595f112361472a8141eef493a.png

通过浏览器测试一下看看!!

home/topic/2021/1118/11/7873b135353480b4526b58e8bf180514.png

OpenJDK

SpringBoot官方推荐的是使用openjdk为基础镜像设计自己的镜像,

Dockerfile

福哥使用的是openjdk:11-jre-slim作为基础镜像的,为了和tomcat镜像同步,福哥自己建立了/usr/local/tomcat目录,并且在下面建立了webapps和logs子目录,最后像tomcat镜像一样把WORKDIR设置到了/usr/local/tomcat这个目录上面。

福哥把tfspring项目的打包到了镜像里面了,这个jar可以通过java直接运行起来,不用做任何调整!

FROM openjdk:11-jre-slim

MAINTAINER Andy Bogate
MAINTAINER tongfu@tongfu.net
MAINTAINER https://tongfu.net/dockerfile
MAINTAINER 2021/11/17
MAINTAINER v1.0.0

ENV tomcatRoot=/usr/local/tomcat
ENV serverPort 8080
ENV xms 128m
ENV xmx 512m

EXPOSE ${serverPort}

# make directory
RUN mkdir -p ${tomcatRoot}/webapps/ \
&& mkdir -p ${tomcatRoot}/logs/

# copy jar
COPY tfspring-0.0.1-SNAPSHOT.jar ${tomcatRoot}/webapps/ROOT.jar

# work directory
WORKDIR ${tomcatRoot}

# entry point
ENTRYPOINT ["sh", "-c", "java -Dserver.port=${serverPort} -Xms${xms} -Xmx${xmx} -jar webapps/ROOT.jar > logs/calatina.out"]

部署

首先,福哥通过docker build创建镜像。

docker build -f Dockerfile -t springboot/openjdk ./

然后,福哥使用springboot/openjdk镜像启动一个容器。

docker run -tid --name springboot-openjdk -h springboot-openjdk -p 8080:8080 springboot/openjdk

测试

切入容器里面看看,里面有福哥建立的目录结构。

查看catalina.out日志文件可以看到SpringBoot启动信息。

docker exec -ti springboot-openjdk bash

home/topic/2021/1117/18/27c9ba215443ee90b2918a5d869d27af.png

通过浏览器测试一下看看!!

home/topic/2021/1118/11/7873b135353480b4526b58e8bf180514.png

总结

今天福哥带着童鞋们学习了如何将SpringBoot发布到Tomcat服务器的方法,顺应微服务的潮流,福哥是通过Docker的方式实现了Tomcat的环境部署的。

SpringBoot自成一体,它不需要像常规Java项目那样通过Tomcat的war压缩包来完成自动部署,而是通过jar包直接通过java运行的,这个不得不说确实是简单方便。