越来越多的项目开始了docker容器化部署的进化,在容器化之前我们部署一个项目,可能由源代码产出一个jar或者war即可直接发布了,启动之后是一个java进程;容器化之后,由源代码产出的是一个docker镜像,而启动的是一个容器。多了这么多步骤是为了容器化之后的运维便利性,从现在来看,容器化是势不可挡的趋势。为了实现的我们CI/CD的终极目标:一键发布,这里介绍一个maven plugin(输入源代码,输出docker镜像)。
00 前言
在实施CI/CD的过程中,实现一键发布用的最多的工具就是Jenkins了,在Jenkins上通过配置将每一个步骤串联起来,现在出现了pipeline让这个过程更简单了,一般的持续集成的流程是:
- 从代码仓库下载代码(git或者svn);
- 通过工具(maven或者gradle)编译出可执行程序包(jar或者war);
- 使用dockerfile配置build出docker镜像;
- 将docker镜像发布至镜像仓库;
- 将镜像部署到云平台;
- 多环境分发镜像。
上述流程在工具齐全的情况下,是相当灵活好用的,公司一般都是这么使用的,而且也能将职责明确。但是当工具不够齐全的时候,或者说个人单打独斗的时候,会使用的工具有限,就寄希望于一个工具能够搞定更多的事情。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。
具体操作方法是:
- 首先本地要安装docker环境。
- 在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>
- 标准的Dockerfile放在classpath的根目录下。
- 执行maven命令:mvn clean package。
从<execution>
的配置中可以看到,在执行maven命令的时候会默认执行docker的build
和push
。
单独执行dockerfile操作的maven命令是:mvn dockerfile:build
和 mvn dockerfile:push
等。<configuration>
中配置docker镜像的仓库的地址等。
03 结束
这样一个基于docker镜像的开发部署流程就可以在本地完成了,其中只用到了maven工具。这样,一个人在使用docker镜像部署所开发的系统的过程更加流畅高效了。