简言

相信大家都知道springboot其实就是对spring框架的更高层次的封装,原理其实还是和spring一样的。

因此,对于springboot + maven结构的项目打包以及部署的流程步骤,完全可以参照章节《在Docker中部署springmvc + maven 结构的项目》中所提及到的部署方式,来实现该项目架构的Docker容器部署。

Docker中部署项目的方式,请参考:《在Docker中部署springmvc + maven 结构的项目》

https://yuque.com/zhoubang/docker/docker-deploy-springmvc-maven

该文档中,选择了基于Dockerfile文件来构建部署应用,其他的部署方式请参考上面的链接文章内容。

使用Dockerfile构建镜像

一步一步的、清晰的描述,通过Dockerfile来让项目容器化。

springboot项目测试用例

当前文章选用的springboot + maven结构的项目,来源于我的开源中国的测试用例。

https://gitee.com/zhoubang85/sea-docker-example 请选用“ springboot-maven”这个模块。

项目目录结构描述

项目结构截图 springboot + maven 结构的项目 - 图1

pom.xml 配置Docker插件

  1. <build>
  2. <plugins>
  3. <!-- Docker镜像构建插件 -->
  4. <plugin>
  5. <groupId>com.spotify</groupId>
  6. <artifactId>docker-maven-plugin</artifactId>
  7. <version>0.4.11</version>
  8. <configuration>
  9. <!-- 构建后的新镜像名称 -->
  10. <imageName>${project.artifactId}</imageName>
  11. <!-- Dockerfile文件所在的位置 -->
  12. <dockerDirectory>src/main/docker</dockerDirectory>
  13. <!-- resources是指哪些文件需要和 Dockerfile 放在一起;在构建镜像时使用的文件,一般应用 jar 包需要纳入。 -->
  14. <resources>
  15. <resource>
  16. <targetPath>/</targetPath>
  17. <directory>${project.build.directory}</directory>
  18. <!--
  19. 因为我们要部署到Docker容器的是这个应用jar,而target目录下有很多是打包时候生成的文件,对于我们这个应用jar来说没有任何作用,
  20. 所以,我们需要使用include标签来指定我们需要构建镜像时候所需的文件。不然的话,会把target目录下所有文件都打包到容器中,就会出现很多无用文件,让镜像大小变得很大。
  21. -->
  22. <include>${project.artifactId}-${project.version}.jar</include>
  23. </resource>
  24. </resources>
  25. </configuration>
  26. </plugin>
  27. </plugins>
  28. </build>

Dockerfile文件所在目录的说明

网上很多的教程文章,都是把Dockerfile文件放在 /src/main/docker 目录下(当前项目用例也是这样的做法),这是一种网上流行的做法; 当然了,这个Dockerfile也可以放在其他空目录下的。

比如下图,是把Dockerfile文件放在了项目根目录下的“docker”目录下,并未放在 /src/main/docker 目录下: springboot + maven 结构的项目 - 图2

那么,需要在pom.xml中修改docker构建插件的一个配置项 dockerDirectory,如下图: springboot + maven 结构的项目 - 图3

至于将Dockerfile放在什么目录下,这个就看个人喜好了。

项目打包

通过根据进行package打包即可,这个就不用多说了吧~

【可选】 如果你是想将应用部署到服务器上的话,这段内容可以直接忽略。

要想在本地检测一下pom.xml中的docker插件配置的是否OK,可以通过cmd命令行窗口进入Dockerfile文件所在的目录,然后执行:

  1. mvn package docker:build

根据命令行的输出信息,来检测是否可以正常构建镜像。

一般情况下,如果看到类似下面的信息,说明在pom.xml中配置的Docker构建插件的配置是没有问题的,可以正常构建镜像的: springboot + maven 结构的项目 - 图4

上传项目文件至服务器

因为我们这个jar应用是需要部署到我的阿里云服务器上的,所以需要将打包好的项目jar以及Dockerfile文件,一同上传到服务器某目录下。

这里我是上传在了 /opt/projects/springboot_maven 目录下(目录可以随意指定,只要保证它们2个文件在一个目录下即可,最好不要存在其他无关的文件),如下图:
springboot + maven 结构的项目 - 图5

构建镜像

进入到 /opt/projects/springboot_maven 目录下,在命令行执行以下命令进行构建镜像

  1. docker build -t springboot-maven .

其中,我们为镜像命名为“springboot-maven”。注意最后面的一个“.”千万别遗漏掉了。 Docker服务端默认情况下,是通过Dockerfile文件来构建镜像的

命令行输出内容如下:
springboot + maven 结构的项目 - 图6

我们可以看到,信息中打印出Step的字样,代表着Docker在构建镜像的时候,是按照这样的步骤来的。也就是我们在Dockerfike文件中定义的命令。 如果没有什么问题的话,最下面会输出“Successfully”的字样。

查看镜像列表
springboot + maven 结构的项目 - 图7

说明镜像已经构建成功了!

运行新镜像,启动容器

运行镜像和我们平时的run命令是一样的。

  1. docker run -d -p 18080:8080 --name springboot-maven-web-dockerfile springboot-maven

因为我的宿主机上的8080端口被其他容器占用了,因此这里我们进行映射新的端口号 18080 。要知道的是,容器中的应用,启动的时候默认就是8080端口,对springboot了解的话,应该都知道springboot的默认启动端口就是8080.

访问springboot应用

浏览器访问:

  1. http://www.2b2b92b.com:18080

我的阿里云服务器域名是 www.2b2b92b.com

效果如下
springboot + maven 结构的项目 - 图8

出现上面的结果,说明我们的springboot应用已经正常部署到了Docker容器中了。

当然,实际项目中肯定是需要连接比如mysql、redis等服务的,其实也没有什么难的,项目中该怎么配置mysql、redis连接就怎么配置。mysql、redis单独运行在Docker容器中即可,只要外部系统可以正常连接访问到就行。

结语

springboot框架的项目在Docker中部署其实也很简单的。
建议使用Dockerfile来定制镜像,因为在Dockerfile文件中的构建命令我们是可以看的一目了然的,也知道构建镜像的时候都执行了哪些命令。同时Dockerfile可以和项目源代码放在一起,也方便我们维护管理。

Dockerfile本身包含的命令是很多的,有兴趣的可以自行网上查阅资料学习。