目录
- 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
,出现如下界面表示服务配置完成
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
为例配置环境变量计算机->右键属性->高级系统设置-> 高级->环境变量->系统变量->新建
- 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 run -d -p 8761:8761` --name eureka springcloud/eureka:1.0-SNAPSHOT
- 访问宿主机如下地址
http://192.168.1.100:8761
出现如下界面表示启动成功
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