背景

微服务架构下,微服务在带来良好的设计和架构理念的同时,也带来了运维上的额外复杂性,尤其是在服务部署和服务监控上。单体应用是集中式的,就一个单体跑在一起,部署和管理的时候非常简单,而微服务是一个网状分布的,有很多服务需要维护和管理,对它进行部署和维护的时候则比较复杂。

下面从Dev的角度来看一下Ops的工作。从Dev提交代码,到完成集成测试的一系列步骤如下:

  1. 首先是开发人员把程序代码更新后上传到Git,然后其他的事情都将由Jenkins自动完成。
  2. 然后Git在接收到用户更新的代码后,会把消息和任务传递给Jenkins,然后Jenkins会自动构建一个任务,下载Maven相关的软件包。下载完成后,就开始利用Maven Build新的项目包,然后重建Maven容器,构建新的Image并Push到Docker私有库中。
  3. 最后删除正在运行的Docker容器,再基于新的镜像重新把Docker容器启动,自动完成集成测试。

整个过程都是自动的,这样就简化了原本复杂的集成工作,一天可以集成一次,甚至是多次。

本文主要关注的第二步,作为Dev使用Maven插件构建Docker镜像。

过程步骤

环境

笔者的电脑系统是MacOS,在进行下面的步骤之前,先具备一下条件:

  • Docker Registry
  • Maven(3.5.0)
  • JDK(1.8.0_131)
  • Docker for Mac (17.09.0-ce-mac35)

Maven 和JDK 就不用过多多了,必须具有的。Docker Registry是私有的hub,mac上装好docker之后,配置一下Docker Registry的地址,配置如下:

因为docker默认需要私服做https支持,我这边之前有个私服做了https支持,所以我这里就不需要配置了

pom 配置

pom文件中需要引入相应的插件。docker-maven-plugin有三款:spotify、fabric8io和bibryam。其中第一款最为流行,资料也多,所以毫不犹豫选择第一款。

插件有两种使用方式,一种是在直接在pom配置中指定baseImage和entryPoint。另一种适合于复杂的构建,使用dockerfile,只需要在配置中指定dockerfile的位置。前一种比较简单,此处略过,主要讲下第二种的配置

<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>${maven.docker.version}</version>
<!--插件绑定到phase-->
<executions>
<execution>
<phase>install</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
<configuration>
<!--配置变量,包括是否build、imageName、imageTag,非常灵活-->
<skipDocker>${docker.skip.build}</skipDocker>
<imageName>${docker.image.prefix}/${project.artifactId}</imageName>
<!--最后镜像产生了两个tag,版本和和最新的-->
<imageTags>
<imageTag>${project.version}</imageTag>
<imageTag>latest</imageTag>
</imageTags>
<forceTags>true</forceTags>
<env>
<TZ>Asia/Shanghai</TZ>
</env>
<!--时区配置-->
<runs>
<run>ln -snf /usr/share/zoneinfo/$TZ /etc/localtime</run>
<run>echo $TZ > /etc/timezone</run>
</runs>
<dockerDirectory>${project.basedir}</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
<!--push到私有的hub-->
<serverId>docker-registry</serverId>
</configuration> </plugin>

${maven.docker.version}${docker.skip.build}${docker.image.prefix}都是可配置的变量。${project.basedir}${project.build.directory}${project.build.finalName}${project.version}分别对应项目根目录、构建目录、打包后生成的结果名称、项目版本号。

上面的pom插件配置,指定了dockerfile的位置和镜像的命名规则。并将docker的build目标,绑定在install这个phase上。

dockerfile

FROM java:8

COPY target/maven-docker-image-0.0.1-SNAPSHOT.jar /app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar" ,"/app.jar"]

setting.xml

在pom插件中,还有一个serverId的配置。这个配置是必要的,对于需要将image上传到私有hub上,在如上配置之后,只需要加上-DpushImage即可实现。serverId是与maven的配置文件setting.xml相对应,setting.xml中增加的配置:

<server>
<id>docker-registry</id>
<username>用户名</username>
<password>密码</password>
<configuration>
<email>邮箱</email>
</configuration>
</server>

结果

**如感觉文章对你有所帮助,可以关注微信公众号【五彩的颜色】鼓励一下**
![](https://img2018.cnblogs.com/blog/1821244/201910/1821244-20191018160424382-1665520539.jpg)

Maven插件构建Docker镜像的更多相关文章

  1. 使用maven插件构建docker镜像

    为什么要用插件 主要还是自动化的考虑,如果额外使用Dockerfile进行镜像生成,可能会需要自己手动指定jar/war位置,并且打包和生成镜像间不同步,带来很多琐碎的工作. 插件选择 使用比较多的是 ...

  2. docker(七) 使用dockerfile-maven-plugin插件构建docker镜像

    在dockerfile-maven-plugin插件出现之前,还有一个maven插件是docker-maven-plugin,是由同一个作者创造,作者明确表示推荐使用dockerfile-maven- ...

  3. docker(六) 使用docker-maven-plugin插件构建docker镜像(已过时)

    可以参考博客:https://blog.csdn.net/aixiaoyang168/article/details/77453974 docker-maven-plugin官网推荐在新项目中使用do ...

  4. 使用docker-maven-plugin插件构建docker镜像(已过时)

    可以参考博客:https://blog.csdn.net/aixiaoyang168/article/details/77453974 docker-maven-plugin官网推荐在新项目中使用do ...

  5. 使用docker Maven插件本地构建docker镜像并发布到远程服务器

    1.登录网站https://start.spring.io/,生成一个基本的SpringBoot应用. 2.将应用导入Eclipse IDE并创建Application类.目录结构如下: Applic ...

  6. 使用Maven插件构建Spring Boot应用程序镜像

    使用Maven插件构建Spring Boot应用程序的Docker镜像. 环境准备 1.Linux系统 2.安装JDK,Maven 3.安装Docker 应用实践 1.在应用程序根目录下添加Docke ...

  7. 在sun jdk 8镜像基础上构建maven 3的docker镜像

    2019独角兽企业重金招聘Python工程师标准>>> 在https://my.oschina.net/ytqvip/blog/1595054文章的sun jdk 8镜像基础上构建m ...

  8. 使用Jenkins pipeline流水线构建docker镜像和发布

    新建一个pipeline job 选择Pipeline任务,然后进入配置页面. 对于Pipeline, Definition选择 "Pipeline script from SCM" ...

  9. 使用Buildpacks高效构建Docker镜像

    1. 前言 Spring Boot 2.3.0.RELEASE 正式发布了几天了,其中有个新的特性:可以将Spring Boot应用代码直接打包为Docker镜像.这是什么科技?我赶紧去官网查了一番才 ...

随机推荐

  1. 通过网上的webservice自己编写两个客户端

    1.根据电话号码查询归属地等信息 根据http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl采用jdk生成所需的代码,编写一个contro ...

  2. 洛谷 P1181数列分段Section I

    星爆气流(弃疗)斩!                                            ——<刀剑神域> 题目:https://www.luogu.org/proble ...

  3. python列表排序用法

    错误用法::: a=list('hdfoiegfjil').sort()

  4. Android开发学习路线的七个阶段和步骤

    Android开发学习路线的七个阶段和步骤           Android学习参考路线     第一阶段:Java面向对象编程 1.Java基本数据类型与表达式,分支循环. 2.String和St ...

  5. ASP.NET Core SignalR:集线器Hubs

    一.什么是集线器hubs 通过SignalR的集线器hubs中定义的方法,服务器可以调用连接中的客户端定义的方法,而客户端也可以调用服务器端集线器中定义的方法.SignalR负责实现了客户端和服务器之 ...

  6. Net基础篇_学习笔记_第十一天_面向对象(类)

    类语法:[public] class 类名{ 字段; 属性; 方法;}写好了一个类之后,我们需要创建这个类的对象,那么,我们管创建这个类的对象过程称之为类的实例化.使用关键字 new. this:表示 ...

  7. Python实现语音识别和语音合成

    声音的本质是震动,震动的本质是位移关于时间的函数,波形文件(.wav)中记录了不同采样时刻的位移. 通过傅里叶变换,可以将时间域的声音函数分解为一系列不同频率的正弦函数的叠加,通过频率谱线的特殊分布, ...

  8. C++ std::thread概念介绍

    C++ 11新标准中,正式的为该语言引入了多线程概念.新标准提供了一个线程库thread,通过创建一个thread对象来管理C++程序中的多线程. 本文简单聊一下C++多线程相关的一些概念及threa ...

  9. vue2.0生成二维码图片并且下载图片到本地兼容写法

    vue生成二维码图片,这里使用的是qrcode.js 这个插件(亲测写法,兼容没有问题) 第一步,下载插件 需要注意,这里下载的是qrcodejs2 cnpm install --save qrcod ...

  10. [Pandas] 01 - A guy based on NumPy

    主要搞明白NumPy“为什么快”. 学习资源 Panda 中文 易百教程 远程登录Jupyter笔记本 效率进化 四步效率优化 NumPy 底层进行了不错的优化. %timeit 对于任意语句,它会自 ...