简言
相信大家都知道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”这个模块。
项目目录结构描述
项目结构截图
pom.xml 配置Docker插件
<build>
<plugins>
<!-- Docker镜像构建插件 -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.11</version>
<configuration>
<!-- 构建后的新镜像名称 -->
<imageName>${project.artifactId}</imageName>
<!-- Dockerfile文件所在的位置 -->
<dockerDirectory>src/main/docker</dockerDirectory>
<!-- resources是指哪些文件需要和 Dockerfile 放在一起;在构建镜像时使用的文件,一般应用 jar 包需要纳入。 -->
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<!--
因为我们要部署到Docker容器的是这个应用jar,而target目录下有很多是打包时候生成的文件,对于我们这个应用jar来说没有任何作用,
所以,我们需要使用include标签来指定我们需要构建镜像时候所需的文件。不然的话,会把target目录下所有文件都打包到容器中,就会出现很多无用文件,让镜像大小变得很大。
-->
<include>${project.artifactId}-${project.version}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
Dockerfile文件所在目录的说明
网上很多的教程文章,都是把Dockerfile文件放在 /src/main/docker 目录下(当前项目用例也是这样的做法),这是一种网上流行的做法; 当然了,这个Dockerfile也可以放在其他空目录下的。
比如下图,是把Dockerfile文件放在了项目根目录下的“docker”目录下,并未放在 /src/main/docker 目录下:
那么,需要在pom.xml中修改docker构建插件的一个配置项 dockerDirectory,如下图:
至于将Dockerfile放在什么目录下,这个就看个人喜好了。
项目打包
通过根据进行package打包即可,这个就不用多说了吧~
【可选】 如果你是想将应用部署到服务器上的话,这段内容可以直接忽略。
要想在本地检测一下pom.xml中的docker插件配置的是否OK,可以通过cmd命令行窗口进入Dockerfile文件所在的目录,然后执行:
mvn package docker:build
根据命令行的输出信息,来检测是否可以正常构建镜像。
一般情况下,如果看到类似下面的信息,说明在pom.xml中配置的Docker构建插件的配置是没有问题的,可以正常构建镜像的:
上传项目文件至服务器
因为我们这个jar应用是需要部署到我的阿里云服务器上的,所以需要将打包好的项目jar以及Dockerfile文件,一同上传到服务器某目录下。
这里我是上传在了 /opt/projects/springboot_maven 目录下(目录可以随意指定,只要保证它们2个文件在一个目录下即可,最好不要存在其他无关的文件),如下图:
构建镜像
进入到 /opt/projects/springboot_maven 目录下,在命令行执行以下命令进行构建镜像:
docker build -t springboot-maven .
其中,我们为镜像命名为“springboot-maven”。注意最后面的一个“.”千万别遗漏掉了。 Docker服务端默认情况下,是通过Dockerfile文件来构建镜像的
命令行输出内容如下:
我们可以看到,信息中打印出Step的字样,代表着Docker在构建镜像的时候,是按照这样的步骤来的。也就是我们在Dockerfike文件中定义的命令。 如果没有什么问题的话,最下面会输出“Successfully”的字样。
查看镜像列表
说明镜像已经构建成功了!
运行新镜像,启动容器
运行镜像和我们平时的run命令是一样的。
docker run -d -p 18080:8080 --name springboot-maven-web-dockerfile springboot-maven
因为我的宿主机上的8080端口被其他容器占用了,因此这里我们进行映射新的端口号 18080 。要知道的是,容器中的应用,启动的时候默认就是8080端口,对springboot了解的话,应该都知道springboot的默认启动端口就是8080.
访问springboot应用
浏览器访问:
http://www.2b2b92b.com:18080
我的阿里云服务器域名是 www.2b2b92b.com
效果如下
出现上面的结果,说明我们的springboot应用已经正常部署到了Docker容器中了。
当然,实际项目中肯定是需要连接比如mysql、redis等服务的,其实也没有什么难的,项目中该怎么配置mysql、redis连接就怎么配置。mysql、redis单独运行在Docker容器中即可,只要外部系统可以正常连接访问到就行。
结语
springboot框架的项目在Docker中部署其实也很简单的。
建议使用Dockerfile来定制镜像,因为在Dockerfile文件中的构建命令我们是可以看的一目了然的,也知道构建镜像的时候都执行了哪些命令。同时Dockerfile可以和项目源代码放在一起,也方便我们维护管理。
Dockerfile本身包含的命令是很多的,有兴趣的可以自行网上查阅资料学习。
转载 https://www.yuque.com/zhoubang/docker/docker-deploy-springboot-maven#stinil