你想要的Docker自动部署Spring Boot就在这

简介

SpringBoot的快速开发特性,正受越来越多Java开发者的欢迎,配合supervisord可以轻松使其作为一个独立的服务运行。而随着Docker的流行,其轻量级、进程级、资源隔离等特性,使SpringBoot的部署、运行更加灵活,若将其打包成Docker镜像可以真正做到“一次打包,到处运行”,有效的解决了开发、测试、预生产、生产等环境的差异。

下面我们就从Docker手动、自动部署SpringBoot项目来讲解下,Docker是如何轻松部署的。因此你想要的Docker自动部署SpringBoot就在这了。

我们正式开始讲解吧。

手动构建springboot应用

此部分通过直接手动打包、Docker手动部署SpringBoot,运行helloworld项目。

helloworld应用

创建springboot工程

使用IntelliJIDEA的“SpringAssistant”插件创建springweb项目

Groupid:

Artifactid:hellworld

Projectname:helloworld

Packagename:

创建HelloworldController

;;;@RestControllerpublicclassHelloworldController{privatestaticfinalLoggerlogger=();@RequestMapping("/")publicStringindex(){return"Helloworld";}

编译运行

mvncleanpackagejava-jartarget/

maven手动打包后并运行jar包,通过localhost:8080可以直接hellworld项目了,下面手动将jar包放到Docker中运行。

docker构建镜像

Dockerfile

匿名数据卷,在启动容器时忘记挂载数据卷,会自动挂载到匿名卷VOLUMN/tmpARGJAR_FILE=target/*.jarCOPY${JAR_FILE}["java","-jar","/"]

构建镜像并运行容器

dockerbuild-tdocker//helloworldlatest75c3d26e3c578minutesago661MBdockerrun-d-p8080:8080--namehellworlddocker/helloworlddockerps-lCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMESfeb8b6ef9941docker/helloworld"java-jar/hellowor…"8:8080-8080/tcphellworld

利用Dockerfile构建一个运行helloworld的镜像,基与这个镜像启动容器后,我们可以通过localhost:8080访问了helloworld了。

以上两步其实就是Docker自动部署SpringBoot主要完成的两个步骤,整个过程不是手动完成,而下面要讲的是通过maven提供的插件自动完成build、tag、push镜像。

自动构建SpringBoot

配置maven插件

maven插件docker-maven-plugin可以打包应用并将构建docker镜像,推送到docker仓库。

版本已经使用新版本/groupIdartifactIddocker-maven-plugin//versionconfigurationimageNamedocker/helloworld/imageNamedockerDirectorysrc/main/docker/dockerDirectoryresourcesresourcetargetPath//targetPathdirectory${}/directoryinclude${}.jar/include/resource/resources/configuration/plugin

其中:

imageName是构建镜像的名称;

dockerDirectory是Dockerfile位置,最好是只有Dockerfile,因为在mvn打包时此目录下的所有文件包括Dockerfile将会被copy到${}/docker目录下,此目录一般是target/docker目录;

resource作用是将${}目录下的${}.jar,复制到${}/docker目录下;如:将target/文件复制到target/docker/下;

打包构建

maven可以直接将应用打包成docker镜像

[root@test]查看镜像[root@test]运行dockerrun-d-p8080:8080--namehelloworlddocker/helloworld

从以上看出此镜像是没有tag,通过以下方式添加tag:

在命令行直接打tagmvncleanpackagedocker:build-DdockerImageTags=v1dockerimagelsREPOSITORYTAGIMAGEIDCREATEDSIZEdocker/helloworldv16f3b482d2b7810secondsago661MBdocker/helloworldlatest6f3b482d2b7810secondsago661MBdocker/helloworldtest6f3b482d2b7810secondsago661MB

如上,我们通过两种方式给镜像添加了test和v1两个tag。了解如何添加tag后,就会明白后面的push镜像的配置。

以上是通过maven自动构建镜像并添加tag,但是还没有完成自动推送远程仓库,咱们将继续讲解。

推送镜像到远程仓库阿里云镜像库

创建仓库

在阿里云容器镜像服务创建仓库

/test/test

maven配置镜像库认证

在maven配置文件中指定远程的镜像仓库

阿里云开通的账户名usernamexxxx/username阿里云绑定邮箱emailxxxxx/email/configuration/server

配置

配置是因为这些都是maven自动构建、推送镜像的基础参数。

/groupIdartifactIdspring-boot-maven-plugin/artifactId//groupIdartifactIddocker-maven-plugin//versionconfiguration!--镜像名称要于阿里云镜像仓库对应,否则无法push到阿里云仓库--!--功能等于dockertagdocker//test//test/test/imageNamedockerDirectorysrc/main/docker/dockerDirectoryresourcesresourcetargetPath//targetPathdirectory${}/directoryinclude${}.jar/include/resource/resources!--一定与mvn的id对应--serverIddocker-aliyun//test/test/registryUrl/configuration/plugin/plugins/build

构建并push

mvncleanpackagedocker:build-DdockerImageTags=v3-DpushImageTag[root@test]若不加-DdockerImageTags=v3,会将所有构建的镜像(v3及latest)都上传。mvncleanpackagedocker:build-DpushImageTag构建、tag不推送mvncleanpackage跳过整个过程,不执行实际命令,可用测试流程是否正常mvncleandeploy-DskipDocker跳过tagmvnclean-DskipDockerTag#跳过pushmvnclean-DskipDockerPush

注意:

经测试发现,实际goaltag/goal阶段并不会进行tag,而是在/test/test/imageName进行tag,如果你的imageName设置不正确,则不会推送到自定义仓库,而是默认的官方仓库

此方式会将镜像的所有tag版本,如v3和latest都会推送到远程仓库;

通过对比,"docker命令绑定maven各阶段"方式不太灵活,因为这会将镜像所有tag进行推送;而使用不绑定到maven阶段的可以自由设置推送到远程仓库的tag,这点更灵活。我们需要根据实际情况自由选择。

总结

通过以上讲解,我们应该知道Docker部署SpringBoot的原理及细节,剩下只需要在客户端直接运行就可以,真正做到“一次打包,到处运行”。如果你完全掌握那么Docker算是入门了。但是这对于Docker的深入应用还远远不够,在实际过程中我们还需要考虑以下问题:

SpringBoot应用的运行时数据、日志文件的持久化;

镜像命令、目录问题、私有镜像库等的配合使用;

流水线操作实现测试、版本发布等;

Docker健康检查等;

这些需要我们通过不断实践,完善开发、运维、测试等在应用中的需求才能做到的,因此让我们行动起来吧。

免责声明:本文章如果文章侵权,请联系我们处理,本站仅提供信息存储空间服务如因作品内容、版权和其他问题请于本站联系