三种自动化构建Docker镜像的Maven插件使用

手动部署SpringBoot应用比较繁琐,且容易出错,合理使用相关插件能提高工作效率,降低出错概率。本文主要介绍三种自动化构建Docker镜像的Maven插件使用,开发工具使用idea。

  1. io.fabric8.docker-maven-plugin
  2. com.spotify.dockerfile-maven-plugin
  3. org.springframework.boot.spring-boot-maven-plugin [SpringBoot官方插件]

以下分别介绍这三种插件的使用方法

io.fabric8.docker-maven-plugin

  • 添加插件依赖包在pom.xml添加以下代码,当前最新的版本为0.37.0
<build>
    <plugins>
        <plugin>
            <groupId>io.fabric8</groupId>
            <artifactId>docker-maven-plugin</artifactId>
            <version>0.37.0</version>
        <plugin>
    </plugins>
</build>

添加后在idea 右侧工具栏可以看到相关的插件命令


docker-maven-plugin
  • 添加生成docker镜像的配置项,在以上plugin节点下添加即可
<configuration>
    <!-- Docker 推送镜像仓库地址-->
    <pushRegistry>http://12.78.18.15:5000</pushRegistry>
    <images>
        <image>
            <!--推送到私有镜像仓库,镜像名需要添加仓库地址-->
            <name>12.78.18.15:5000/${project.name}:${project.version}</name>
            <!--定义镜像构建行为-->
            <build>
                <dockerFileDir>${project.basedir}</dockerFileDir>
            </build>
            <!--定义容器启动行为-->
            <run>
                <!--设置容器名,可采用通配符-->
                <containerNamePattern>${project.artifactId}</containerNamePattern>
                <!--设置端口映射-->
                <ports>
                    <port>8082:8082</port>
                </ports>
                <!--设置容器间连接-->
                <links>
                    <link>mysql:db</link>
                </links>
                <!--设置容器和宿主机目录挂载-->
                <volumes>
                    <bind>
                        <volume>/etc/localtime:/etc/localtime</volume>
                    </bind>
                </volumes>
            </run>
        </image>
    </images>
</configuration>

私有镜像仓库搭建可参考:https://www.jianshu.com/p/bbbf93b29b78
dockerfile相关的配置这里使用Dockerfile文件

  • Dockerfile内容
# 该镜像需要依赖的基础镜像
FROM lpicanco/java11-alpine
# 将当前maven目录生成的文件复制到docker容器的/目录下
COPY target/fabric-docker-1.0-SNAPSHOT.jar /
# 声明服务运行在8082端口
EXPOSE 8082
# 指定docker容器启动时运行jar包
ENTRYPOINT ["java", "-jar","/fabric-docker-1.0-SNAPSHOT.jar"]
# 指定维护者的名字
MAINTAINER climber
  • 插件使用
  1. 生成镜像
    生成镜像前要先将项目打包,否则会找不到jar文件而报错
    双击"docker:builder" 即可完成镜像的生成


    docker:builder button
docker:builder
  1. 推送镜像到私有仓库
    在上传前请再先登录私有仓库
docker login --username=lipandeng 12.7.18.150:5000

然后双击"docker:push"即可


Docker Registry UI
  1. 容器操作
    容器中有关联mysql容器,所以先启动mysql容器,然后双击“docker:start/stop/remove”来实现容器的启动/停止/销毁操作


  2. 其它
    也可在生产包的时候同时生成镜像文件,添加如下配置
<executions>
    <execution>
        <id>build-image</id>
        <phase>package</phase>
        <goals>
            <goal>build</goal>
        </goals>
    </execution>
</executions>

这样就不用单独再双击“docker:build”了,在双击package,生成包成功后接着就生成了新的镜像

com.spotify.dockerfile-maven-plugin

Spotify官方已经不再推荐使用 docker-maven-plugin ;推荐使用 com.spotify.dockerfile-maven-plugin

  • 配置pom.xml
    在pom.xml添加 com.spotify.dockerfile-maven-plugin 插件配置

    <properties>
        <docker.image.prefix>12.78.18.15:5000</docker.image.prefix>
    </properties>
    <build>
        <plugins>
            <plugin>
                 <groupId>com.spotify</groupId>
                 <artifactId>dockerfile-maven-plugin</artifactId>
                 <version>1.4.13</version>
                 <executions>
                     <!--运行mvn package时,会自动执行build目标,构建Docker镜像;
                     运行mvn deploy命令时,会自动执行push目标,将Docker镜像push到Docker仓库-->
                     <execution>
                         <id>default</id>
                         <goals>
                             <goal>build</goal>
                             <goal>push</goal>
                         </goals>
                     </execution>
                 </executions>
                 <configuration>
                     <repository>${docker.image.prefix}/spotify-dockerfile</repository>
                     <tag>${project.version}</tag>
                     <!--在settings.xml中配置server-->
                     <useMavenSettingsForAuth>true</useMavenSettingsForAuth>
                     <!--可以指定一个或多个变量,传递给Dockerfile,在Dockerfile中通过ARG指令进行引用-->
                     <buildArgs>
                         <JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
                     </buildArgs>
                 </configuration>
             </plugin>
        </plugins>
    </build>
    

    idea 右侧栏即可显示相关操作命令


    dockerfile-maven
  • 编写Dockerfile
    这里说明下插件特有的新功能,可使用pom.xml中指定的变量

    # 此处的JAR_FILE正式pom.xml中指定的buildArgs->JAR_FILE
    ARG JAR_FILE
    COPY target/${JAR_FILE} /app.jar
    
  • 构建docker images

    使用该插件构建Docker镜像,需要有一个安装好的Docker运行环境,且需要在运行该插件的机器上定义DOCKER_HOST环境变量,配置访问Docker的URL
    linux 下配置

    export DOCKER_HOST=tcp://localhost:2375
    

    window下配置环境变量,自行配置即可
    接下来,就可以运行maven命令来构建Docker镜像了,使用idea右侧工具栏响应的命令双击即可

    mvn package 或者 mvn dockerfile:build
    
mvn package

mvn package
  • 推送到私有镜像仓库

    作者使用的非docker hub,而是自己搭建的,且需要用户验证,pom.xml配置如下

    <useMavenSettingsForAuth>true</useMavenSettingsForAuth>
    

    同时在maven的settings.xml中的servers下增加一个server配置:

     <servers>
          <server>
             <id>12.78.182.15:5000</id>
             <username>lipandeng</username>
             <password>123456</password>
           </server>
     </servers>
    

    注意server.id即是上边配置的docker.image.prefix
    push 镜像

    mvn dockerfile:push
    

    查看镜像库即可验证上传是否成功


    registry2

org.springframework.boot.spring-boot-maven-plugin

子项目:springboot-docker
springboot 2.3.X+ , maven plugin支持将应用程序打包成Docker镜像,无需额外的Dockerfile,只需要一条命令即可,不需要任何改动,这里我们用最新版的2.5.3
使用方法:

  • 配置pom.xml
    <properties>
        <docker.image.prefix>12.78.18.15:5000</docker.image.prefix>
    </properties>
    <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration> 
            <image>
                <!--镜像名称-->
                <name>${docker.image.prefix}/${project.name}:${project.version}</name>
                <!--生成镜像后是否推送到镜像仓库-->
                <publish>true</publish>
            </image> 
            <docker>
                <!--docker环境远程管理地址,非镜像仓库地址-->
                <host>http://localhost:2375</host>
                <!--不使用TLS访问-->
                <tlsVerify>false</tlsVerify>
                <!--Docker推送镜像仓库配置-->
                <publishRegistry>   
                    <!--推送镜像仓库用户名-->
                    <username>test</username>
                    <!--推送镜像仓库密码-->
                    <password>123456</password>
                    <!--推送镜像仓库地址-->
                    <url>http://${docker.image.prefix}</url>      
                </publishRegistry>      
            </docker>
        </configuration> 
    </plugin>   
    
  • 生成镜像&推送到私有镜像仓库
    mvn spring-boot:build-image
    

    也可在idea,直接双击SpringBoot插件的build-image命令即可一键打包并推送到镜像仓库
    生成镜像工程中由于需要从github下载文件,大概率会不成功,需要多次尝试。
    最后在本地和私有镜像仓库均有docker镜像,表示buiild-image已经完成。


    build-image1

    build-image2

    build-image3

    build-image4

总结

  1. io.fabric8.docker-maven-plugin 比较灵活(可dockerfile也可pom.xml配置)、支持直接操作容器,且仍在持续更新,推荐使用。
  2. com.spotify.dockerfile-maven-plugin 支持dockerfile 近两年无更新,不支持操作容器。
  3. org.springframework.boot.spring-boot-maven-plugin springboot官方插件,无需额外安装,但需要从github下载相关层文件,失败率高,需要多次尝试。

参考代码:https://github.com/lipandeng/docker-maven-demo

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,125评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,293评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,054评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,077评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,096评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,062评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,988评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,817评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,266评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,486评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,646评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,375评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,974评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,621评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,642评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,538评论 2 352

推荐阅读更多精彩内容