美文网首页微服务架构和实践Dockermaven
快速构建docker镜像:maven插件

快速构建docker镜像:maven插件

作者: rabbitGYK | 来源:发表于2018-04-15 20:40 被阅读220次

    越来越多的项目开始了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镜像部署所开发的系统的过程更加流畅高效了。

    相关文章

      网友评论

      • sagittar:表格反了吧
      • aa6d8dbc28bb:google 的jib 插件可以试试
      • 若兮相言:本地不安装docker环境可以吗,docker在服务器上
        rabbitGYK:@若兮相言123 那你只能在服务器上执行你的maven命令
      • IT人故事会:太感谢了,学了好多东西!
        rabbitGYK:@IT人故事会 不客气,互相学习

      本文标题:快速构建docker镜像:maven插件

      本文链接:https://www.haomeiwen.com/subject/nvqtkftx.html