快速构建docker镜像:maven插件

越来越多的项目开始了docker容器化部署的进化,在容器化之前我们部署一个项目,可能由源代码产出一个jar或者war即可直接发布了,启动之后是一个java进程;容器化之后,由源代码产出的是一个docker镜像,而启动的是一个容器。多了这么多步骤是为了容器化之后的运维便利性,从现在来看,容器化是势不可挡的趋势。为了实现的我们CI/CD的终极目标:一键发布,这里介绍一个maven plugin(输入源代码,输出docker镜像)。

00 前言

在实施CI/CD的过程中,实现一键发布用的最多的工具就是Jenkins了,在Jenkins上通过配置将每一个步骤串联起来,现在出现了pipeline让这个过程更简单了,一般的持续集成的流程是:

  1. 从代码仓库下载代码(git或者svn);
  2. 通过工具(maven或者gradle)编译出可执行程序包(jar或者war);
  3. 使用dockerfile配置build出docker镜像;
  4. 将docker镜像发布至镜像仓库;
  5. 将镜像部署到云平台;
  6. 多环境分发镜像。

上述流程在工具齐全的情况下,是相当灵活好用的,公司一般都是这么使用的,而且也能将职责明确。但是当工具不够齐全的时候,或者说个人单打独斗的时候,会使用的工具有限,就寄希望于一个工具能够搞定更多的事情。dockerfile-maven-plugin 就是这样一个maven工具的插件。

01 Docker镜像管理

Docker镜像的管理可以类比作Jar包的管理,在虚拟机时代我们要部署程序时,都是将jar包或者war部署到机器上,然后执行它,docker容器化了之后,部署的是docker镜像,一般是部署在paas云平台上。

- Docker镜像管理 Jar包管理
官方仓库 https://hub.docker.com/ http://mvnrepository.com/
私有仓库 Nexus harbor
本地仓库命令 maven:mvn install docker build
发布至远程仓库 maven:mvn deploy docker push

02 maven 插件:dockerfile-maven-plugin

这是本文的主角,该maven插件可以实现有java源代码直接到docker镜像,配置了dockerfile-maven-plugin插件的maven工具就像是一个管道,一端输入Java源代码,另一端直接输出docker镜像。

dockerfile-maven-plugin插件出现之前,还有一个maven插件是docker-maven-plugin,是由同一个作者创造,作者明确表示推荐使用dockerfile-maven-plugin,并会持续升级;而docker-maven-plugin不在添加任何新功能,只接受修复bug。两个插件的设计思想是有差别的,前者需要独立编写Dockerfile文件,后者允许没有Dockerfile文件,所有的docker相关配置都写在pom文件的plugin中,这样使maven插件显得很笨重,并且如果脱离了这个maven插件还得重写编写Dockerfile,不够灵活。

因此,推荐使用maven插件:dockerfile-maven-plugin

具体操作方法是:

  1. 首先本地要安装docker环境。
  2. 在maven的pom文件中配置build的插件。
<properties>
  <dockerfile.maven.version>1.4.0</dockerfile.maven.version>
  <docker.registry.name.prefix>192.168.6.37:80/galaxy</docker.registry.name.prefix>
</properties>

<plugin>
    <groupId>com.spotify</groupId>
    <artifactId>dockerfile-maven-plugin</artifactId>
    <version>${dockerfile.maven.version}</version>
    <dependencies>
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <version>1.1.1</version>
        </dependency>
    </dependencies>
    <executions>
        <execution>
            <id>default</id>
            <goals>
                <goal>build</goal>
                <goal>push</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <repository>${docker.registry.name.prefix}/${project.artifactId}</repository>
        <tag>${project.version}</tag>
        <username>username</username>
        <password>password</password>
        <buildArgs>
            <JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
        </buildArgs>
    </configuration>
</plugin>
  1. 标准的Dockerfile放在classpath的根目录下。
  2. 执行maven命令:mvn clean package。

<execution>的配置中可以看到,在执行maven命令的时候会默认执行docker的buildpush
单独执行dockerfile操作的maven命令是:mvn dockerfile:buildmvn dockerfile:push等。<configuration>中配置docker镜像的仓库的地址等。

03 结束

这样一个基于docker镜像的开发部署流程就可以在本地完成了,其中只用到了maven工具。这样,一个人在使用docker镜像部署所开发的系统的过程更加流畅高效了。

推荐阅读更多精彩内容