目录

  • 1.前言
  • 2.环境搭建
  • 3.Maven插件直接构造镜像
  • 4.Maven插件读取DockerFile构造镜像
  • 5.将Docker构建指令绑定至Maven命令上


1.前言

相信所有JAVA程序员都知道Maven,Maven是一个强大的项目管理与构建工具,使用Maven我们可以方便对项目进行打包、上传私服、项目依赖管理等。同样我们也可以借助插件通过Maven构建Docker镜像,常见的插件依赖如下所示:

  • spotify
<!-- https://github.com/spotify/docker-maven-plugin -->
<dependency>
  <groupId>com.spotify</groupId>
  <artifactId>docker-maven-plugin</artifactId>
  <version>1.2.0</version>
</dependency>
  • fabric8io
<!-- https://mvnrepository.com/artifact/io.fabric8/docker-maven-plugin -->
<dependency>
    <groupId>io.fabric8</groupId>
    <artifactId>docker-maven-plugin</artifactId>
    <version>0.31.0</version>
</dependency>
  • bibryam
<!-- https://github.com/bibryam/docker-maven-plugin -->
<dependency>
	<groupId>com.ofbizian</groupId>
   <artifactId>docker-maven-plugin</artifactId>
   <version>1.0.0</version>
</dependency>

由于平时使用spotify插件比较多,因此在此使用spotify进行演示,有兴趣的朋友可以自行测试其它两种插件

2.环境搭建

项目名

项目说明

eureka-service

注册中心

192.168.1.100

docker宿主机

  • 创建项目eureka-service
  • 引入服务基本依赖
<dependencies>
    <!--Eureka注册中心-->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
  </dependencies>

在此只引入该项目基本依赖,其它Spring Cloud环境报搭建,可以参考我的其它博文搭建,环境搭建不是本文重点,就不在此展示。

  • 书写服务配置application.yml
server:
  port: ${EUREKA_PORT:8761}

eureka:
  client:
    register-with-eureka: false
    fetch-registry: false
    service-url:
      defaultZone: http://${EUREKA_ZONE_HOST:localhost}:${EUREKA_ZONE_PORT:8761}/eureka/

spring:
  application:
    name: eureka-server
  • 书写启动类
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
  public static void main(String[] args){
    SpringApplication.run(EurekaApplication.class);
  }
}
  • 测试服务

启动服务,并访问http://localhost:8761,出现如下界面表示服务配置完成

docker 使用maven信息 maven docker构建_maven

3.Maven插件直接构造镜像

  • 构建前开启宿主机Docker远程Api端口
# 修改docker.service
$ sudo vim /usr/lib/systemd/system/docker.service
# 修改ExecStart如下
$ ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
# 重新加载配置文件
$ sudo systemctl daemon-reload
# 重启docker服务
$ systemctl restart docker
  • 修改本机docker环境变量
在此以win7为例配置环境变量
计算机->右键属性->高级系统设置-> 高级->环境变量->系统变量->新建

docker 使用maven信息 maven docker构建_docker 使用maven信息_02

  • Pom文件中引入Maven插件
<build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
      <plugin>
        <!-- docker的maven插件,官网: https://github.com/spotify/docker-maven-plugin -->
        <groupId>com.spotify</groupId>
        <artifactId>docker-maven-plugin</artifactId>
        <version>1.2.0</version>
        <configuration>
          <!--设置镜像名称-->
          <imageName>springcloud/${project.artifactId}</imageName>
          <baseImage>java:alpine</baseImage>
          <volumes>/root</volumes>
          <entryPoint>["java","-jar","/${project.build.finalName}.jar"]</entryPoint>
          <imageTags>
          	<imageTag>${project.version}</imageTag>
          </imageTags>
          <dockerHost>http://192.168.1.100:2375</dockerHost>
          <rm>false</rm>
          <resources>
            <resource>
              <!--复制资源至docker镜像中位置-->
              <targetPath>/</targetPath>
              <!--资源打包后文件夹-->
              <directory>${project.build.directory}</directory>
              <!--资源打包后文件名-->
              <include>${project.build.finalName}.jar</include>
            </resource>
          </resources>
        </configuration>
      </plugin>
    </plugins>
  </build>

标签说明:

标签名

作用

imageName

构建后镜像名

baseImage

基础镜像名

volumes

持久化挂载位置

entryPoint

启动镜像执行的命令

imageTags

打包后镜像标签

dockerHost

镜像

rm

是否删除过程镜像

targetPath

镜像复制后位置

directory

复制jar包文件夹

include

资源打包后文件名

  • 执行打包命令
mvn clean package  docker:build -DskipTests
  • 查看宿主机镜像
$ docker images

出现下图所示,表示docker镜像构建并上传成功

docker 使用maven信息 maven docker构建_docker 使用maven信息_03

  • 启动镜像
$ docker run -d -p 8761:8761` --name eureka springcloud/eureka:1.0-SNAPSHOT
  • 访问宿主机如下地址http://192.168.1.100:8761出现如下界面表示启动成功

docker 使用maven信息 maven docker构建_docker 使用maven信息_04

4.Maven插件读取DockerFile构造镜像

  • 引入插件依赖
<build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
      <plugin>
        <!-- docker的maven插件,官网: https://github.com/spotify/docker-maven-plugin -->
        <groupId>com.spotify</groupId>
        <artifactId>docker-maven-plugin</artifactId>
        <version>1.2.0</version>
        <configuration>
          <!--设置镜像名称-->
          <imageName>springcloud/${project.artifactId}</imageName>
          <!--指定dockerfile位置-->
          <dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
          <imageTags>
          	<imageTag>${project.version}</imageTag>
          </imageTags>
          <dockerHost>http://192.168.1.100:2375</dockerHost>
          <rm>true</rm>
          <resources>
            <resource>
              <!--复制资源至docker镜像中位置-->
              <targetPath>/</targetPath>
              <!--资源打包后文件夹-->
              <directory>${project.build.directory}</directory>
              <!--资源打包后文件名-->
              <include>${project.build.finalName}.jar</include>
            </resource>
          </resources>
        </configuration>
      </plugin>
    </plugins>
  </build>

dockerDirectory: 表示dockerfile所在位置

  • 书写Dockerfile文件
FROM java:alpine
VOLUME /tmp
ADD eureka-1.0-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
  • 执行构建命令
$ mvn clean package  docker:build -DskipTests
  • 查看宿主机docker镜像
  • 启动镜像
  • 访问宿主机相应地址,出现上述相同页面,表示构建并推送成功

5.将Docker构建指令绑定至Maven命令上

绑定意思指将要执行的docker命令绑定至maven的parse上,增加如下配置即可

<plugin>
        <!-- docker的maven插件,官网: https://github.com/spotify/docker-maven-plugin -->
        <groupId>com.spotify</groupId>
        <artifactId>docker-maven-plugin</artifactId>
        <version>1.2.0</version>
        <executions>
          <execution>
            <id>build-image</id>
            <phase>package</phase>
            <goals>
              <goal>build</goal>
            </goals>
          </execution>
        </executions>
        <configuration>
          <!--设置镜像名称-->
          <imageName>springcloud/${project.artifactId}</imageName>
          <!--指定dockerfile位置-->
          <dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
          <dockerHost>http://192.168.1.100:2375</dockerHost>
          <imageTags>
          	<imageTag>${project.version}</imageTag>
          </imageTags>
          <resources>
            <resource>
              <!--复制资源至docker镜像中位置-->
              <targetPath>/</targetPath>
              <!--资源打包后文件夹-->
              <directory>${project.build.directory}</directory>
              <!--资源打包后文件名-->
              <include>${project.build.finalName}.jar</include>
            </resource>
          </resources>
        </configuration>
      </plugin>

绑定其实就增加了如下信息

<executions>
  <execution>
    <id>build-image</id>
    <phase>package</phase>
    <goals>
      <goal>build</goal>
    </goals>
  </execution>
</executions>

即将docker的build集合绑定至maven的package命令上,当执行mvn package时就是执行了mvn package docker:build