Docker部署spring boot体验

总结这篇文章时,微服务已经在很多公司落地,回看之前的博客记录,在2016年其实就已经利用docker做一些简单的实验环境了,但一直没有结合生产好好总结应用场景,现在算是连容器的坎也没跨过去。谨以此文来警戒自己:“今天不走,明天即使跑也不一定跟得上!”

落实于行动,现在实践总结下docker部署springboot的过程,积累docker的应用经验,对未来的应用做好知识储备。

手动构建spring boot应用

一、helloworld应用

1.创建spring boot工程

2.创建HelloworldController

vim HelloworldControllerpackage com.docker.helloworld;

import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;

@RestControllerpublic class HelloworldController {  private static final Logger logger= LoggerFactory.getLogger(HelloworldController.class); @RequestMapping(“/”) public String index(){ return “Hello world”; }}

3.编译运行

mvn clean package && java -jar target/helloworld-0.0.1-SNAPSHOT.jar

此时我们可以通过localhost:8080访问了。

二、docker构建镜像

1.Dockerfile

2.构建镜像并运行容器

此时我们可以通过localhost:8080访问了。

以上是通过手动运行jar包及通过镜像的形式运行应用,其实mvn也提供相应的插件自动构建镜像。

mvn构建docker镜像

一、配置mvn插件

docker-maven-plugin作用是配合Dockerfile构建docker镜像,推送到docker仓库。还可以使用dockerfile-maven-plugin

其中:

(1)imageName 是构建镜像的名称;

(2)dockerDirectory是Dockerfile位置,最好是只有Dockerfile,因为在mvn打包时此目录下的所有文件包括Dockerfile将会被copy到${project.build.directory}/docker目录下,此目录默认是target/docker目录;

(3)resource作用是将${project.build.directory}目录下的${project.build.finalName}.jar,复制到${project.build.directory}/docker目录下;如:将target/helloworld-0.0.1-SNAPSHOT.jar 文件复制到target/docker/下;

二、构建运行

[root@test]

其中:第5,6行可以看到copy过程,对应pom.xml中的<resource>配置,剩下为从Dockerfile构建镜像过程。

从以上看出此镜像只有默认的tag:latest,如果需要加上版本信息,需在pom.xml中添加如下配置:

或者

以上配置或手动添加tag后,最终镜像如下:

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

1.创建仓库

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

registry.cn-qingdao.aliyuncs.com/test/test

2.mvn配置镜像库认证

vim settings.xml

3.pom.xml配置

<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.2.2</version> <configuration> <!–镜像名称要于阿里云镜像仓库对应,否则无法push到阿里云仓库–> <!–功能等于docker tag docker/helloworld registry.cn-qingdao.aliyuncs.com/test/test–> <imageName>registry.cn-qingdao.aliyuncs.com/test/test</imageName> <dockerDirectory>src/main/docker</dockerDirectory> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> <!–一定与mvn的id对应–> <serverId>docker-aliyun</serverId> <registryUrl>registry.cn-qingdao.aliyuncs.com/test/test</registryUrl> </configuration> </plugin> </plugins></build>

注意:

(1)<imageName>名称一定要与与阿里云镜像仓库对应,否则无法push到阿里云仓库,功能等于:

docker tag docker/helloworld registry.cn-qingdao.aliyuncs.com/test/test

(2)<serverId>一定要与mvn镜像库的id对应

以上两项不对,镜像将默认推送至docker.io。

4.构建并push

注意:

四、绑定Docker命令到Maven各个阶段

Docker 构建过程为 build、tag、push,其中build、tag对应mvn的package阶段,push对应mvn的deploy。通过将docker命令绑定到mvn的各个阶段,我们可以通过mvn deploy实现构建并push的过程。

补充:

maven各阶段功能:

(1)package阶段实现项目编译、单元测试、打包功能,但没有把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库;

(2) install阶段实现项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库,但没有布署到远程maven私服仓库;

(3) deploy阶段实现项目编译、单元测试、打包功能,同时把打好的可执行jar包(war包或其它形式的包)布署到本地maven仓库和远程maven私服仓库;

1.pom.xml配置插件

<!–一定添加maven-deploy-plugin,通过skip跳过artifact仓库–><plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-deploy-plugin</artifactId> <configuration> <skip>true</skip> </configuration></plugin><plugin> <groupId>com.spotify</groupId> <artifactId>docker-maven-plugin</artifactId> <version>1.2.2</version> <configuration> <imageName>registry.cn-qingdao.aliyuncs.com/test/test</imageName> <dockerDirectory>src/main/docker</dockerDirectory> <resources> <resource> <targetPath>/</targetPath> <directory>${project.build.directory}</directory> <include>${project.build.finalName}.jar</include> </resource> </resources> <imageTags> <imageTag>${project.version}</imageTag> </imageTags> <serverId>docker-aliyun</serverId> <pushImage>true</pushImage> <registryUrl>registry.cn-qingdao.aliyuncs.com/test/test</registryUrl> </configuration> <executions> <execution> <id>build-image</id> <phase>package</phase> <goals> <goal>build</goal> </goals> </execution> <execution> <id>tag-image</id> <phase>package</phase> <goals> <goal>tag</goal> </goals> <configuration> <image>registry.cn-qingdao.aliyuncs.com/test/test:${project.version}</image> <newName>registry.cn-qingdao.aliyuncs.com/test/test:${project.version}</newName> </configuration> </execution> <execution> <id>push-image</id> <phase>deploy</phase> <goals> <goal>push</goal> </goals> <configuration> <imageName>registry.cn-qingdao.aliyuncs.com/test/test:${project.version}</imageName> </configuration> </execution> </executions></plugin>

注意:一定要通过maven-deploy-plugin设置skip,通过skip跳过artifact仓库,否则mvn deploy  推送时报错:

Deployment failed: repository element was not specified in the POM inside distributionManagement element or in -DaltDeploymentRepository=id::layout::url parameter

2.执行命令

注意:

(1)经测试发现,实际<goal>tag</goal>阶段实际并不会进行tag,而是通过<imageName>registry.cn-qingdao.aliyuncs.com/test/test</imageName>配置进行tag,如果你的imageName设置不正确,则不会推送到自定义仓库,而是默认的官方仓库;

(2)此方式会将镜像的所有tag 版本及历史版本,如v3和latest及所有历史版本v2,v1都会推送到远程仓库;

总结

通过对比,”docker命令绑定mvn各阶段”方式不太灵活,而且会将镜像所有tag进行推送,但提供了一套模板用于自动化流程,可根据实际情况选择。

docker部署springboot的过程算是亲自实践了下,但是在实际过程中还需要考虑以下问题:

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

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

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

4.docker 运行状态监控等;

运维从来都不满足于实现部署的某个过程,需要综合考虑提供一套整体的运维方案,这个还需要不断实践总结。

 

Docker部署spring boot体验》来自互联网,仅为收藏学习,如侵权请联系删除。本文URL:https://www.hashtobe.com/999.html