前言
在前面我们介绍了
准备工作
创建一个基础项目工程
开始之前我们先准备一个Springboot的项目工程 , 就很普通就好 , 确保项目整正常启动即可!
配置
本次构建所使用到的插件是 docker-maven-plugin ,
该插件提供了两种不同的构建方式 , 两种方式外观差别体现在pom不同
一种是纯粹的xml文件标签定义参数的方式 ,
另一种是可以利用DockerFile辅助定义构建参数的方式, 下面都会一一介绍.
纯粹xml标签构建方式pom文件
<plugins>
<!--这是原有的spring boot插件-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!--新增的docker maven插件-->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.12</version>
<!--docker镜像相关的配置信息-->
<configuration>
<!--镜像名,这里用工程名-->
<imageName>${project.artifactId}</imageName>
<!--TAG,这里用工程版本号-->
<imageTags>
<imageTag>${project.version}</imageTag>
</imageTags>
<!--镜像的FROM,使用java官方镜像-->
<baseImage>java:8u111-jdk</baseImage>
<!--该镜像的容器启动后,直接运行spring boot工程-->
<entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
<!--构建镜像的配置信息-->
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
指定DockerFile方式
在<project>标签内添加<build>相关内容如下
这种方式要我们自己写Dockerfile,好处是可以按照自己的需要在Dockerfile中添加更多内容,而不像第一种方式那样只能按照插件的参数规则来配置
修改Pom
<build>
<finalName>ko-assy-db</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<mainClass>com.ko.assy.db.ms.KoAssyDbApplication</mainClass>
<layout>ZIP</layout>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<!--使用docker-maven-plugin插件-->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<!--指定生成的镜像名-->
<imageName>${project.artifactId}</imageName>
<!-- 指定 Dockerfile 路径 , 根据实际情况改动! ${project.basedir}:项目根路径-->
<dockerDirectory>${basedir}/src/docker</dockerDirectory>
<imageTags>
<imageTag>${project.version}</imageTag>
</imageTags>
<!--指定远程 docker api地址 ,此举目的是将构建好的镜像推送至远程的Docker服务器 , 前提是服务器开启远程连接 -->
<dockerHost>http://127.0.0.0:2375</dockerHost>
<!-- 这里是复制 jar 包到 docker 容器指定目录配置 -->
<resources>
<resource>
<targetPath>/</targetPath>
<!--jar 包所在的路径 此处配置的 即对应 target 目录-->
<directory>${project.build.directory}</directory>
<!--用于指定需要复制的文件 需要包含的 jar包 ,这里对应的是 Dockerfile中添加的文件名 -->
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
<!--将插件绑定在某个phase执行-->
<executions>
<execution>
<id>build-image</id>
<!--用户只需执行mvn package ,就会自动执行mvn docker:build-->
<phase>package</phase>
<goals>
<goal>build</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
创建并编辑Dockerfile
DockerFile 内容
# Docker image for springboot application
# VERSION 0.0.1
# Author: huanghuohuo
# 构建镜像基于哪个镜像
FROM openjdk:8
# 镜像维护者姓名或邮箱地址
MAINTAINER huanghuohuo
# 为 RUN、CMD、ENTRYPOINT、COPY 和 ADD 设置工作目录,就是切换目录
WORKDIR /
#系统编码
ENV LANG=C.UTF-8 LC_ALL=C.UTF-8
# 拷贝文件或目录到容器中,跟ADD类似,但不具备自动下载或解压的功能
COPY ko-assy-db.jar ko-assy-db.jar
#启动容器时的进程
#ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS $ENV_OPTS $REMOTE2 -jar ko-assy-db.jar" ]
CMD ["java", "-version"]
# 容器启动时执行的命令
ENTRYPOINT ["java","-jar","/ko-assy-db.jar"]
#暴露11109端口
EXPOSE 11109
# 声明一个挂载点,容器内此路径会对应宿主机的某个文件夹
# 一般的使用场景为需要持久化存储数据时
# 容器使用的是AUFS,这种文件系统不能持久化数据,当容器关闭后,所有的更改都会丢失。
# 所以当数据需要持久化时用这个命令。
# VOLUME 指令创建的挂载点,无法指定主机上对应的目录,是自动生成的。
VOLUME /data/app/ko-assy-db-ms/logs
构建
前面pom文件中提到了有关docker镜像的构建操作 , 绑定了maven构建的package
所以这里可以不用命令 , 直接构建就好
构建成功
验证
构建成功后到docker服务器查看
// 查看镜像
docker images
如上图就说明是构建镜像成功了 , 但是为什么会出现两个出了版本不一样的镜像呢 ?
其实这是因为我们在上面的pom里面使用了 <tag>打标签的配置 , name在构建镜像的时候就会在构建好的基础镜像上在构建出来一个打了标签的镜像, 其实通过镜像ID可以看出来 , 这两个其实是一样的!
启动镜像
## --name 指定启动后容器名称
## -d 守护进程的方式运行
## -p 内外端口映射
docker run --name testdemo -d -p 11109:11109 fe5604877415
## 启动后 验证
docker ps
至此,我们通过 docker-maven-plugin 的方式构建本地docker镜像的实战就结束了,但镜像停留在本地,或者远程docker服务器 , 只能手工push到公有或者私有仓库才能给其他人使用,
在下一章我们就来体验docker-maven-plugin插件的推送能力,将本地镜像推送到镜像仓库,这样就能将项目编译构建、镜像构建、镜像推送等环节集成在一次构建中完成;