一、配置Docker服务器
高版本的Idea默认已经集成了Docker插件,我们只需要按图配置好Docker服务器即可。因为dockerfile-maven-plugin插件的作用只是避免我们直接进行Docker操作,最终的镜像构建还得是docker服务器来完成,因此需要为插件指定Docker服务器。下图的TCP套接字链接到Docker服务器开放远程端口,通过对该端口发送相关指令来完成镜像的构建。
完成以上配置后,可以在Idea的服务窗口看到已经链接到Docker服务器的Docker服务,可以直接在该界面进行docker命令操作,如图:
二、配置DOCKER_HOST环境变量
mvn命令的执行方式有cmd窗口、Idea的终端、Idea集成maven插件窗口3种,这3种方式运行mvn dockerfile 打包命令依赖于DOCKER_HOST环境变量来查找Docker服务器。如果不配置该环境变量,则默认使用本地的Docker服务器,如果本地没有安装,则会引发找不到Docker引擎的异常。
三、配置dockerfile-maven-plugin插件
在maven的根pom.xml中的build.plugins节点下添加dockerfile-maven-plugin插件的配置。
<!-- docker打包插件,groupId、artifactId、version表示插件自生的版本信息 --> <plugin> <groupId>com.spotify</groupId> <artifactId>dockerfile-maven-plugin</artifactId> <version>${dockerfile-maven-plugin.version}</version> <configuration> <useMavenSettingsForAuth>true</useMavenSettingsForAuth> <!-- 是否使用maven配置(仓库账号密码)来进行推送认证 --> <repository>${docker.image.prefix}/qrcode-admin</repository> <!-- 指定镜像构建后要推送的仓库地址 --> <tag>1.1.0_prod</tag> <!-- 指定构建镜像的版本tag --> <buildArgs> <!-- 构建参数,该节点下的参数将在构建时传递给Dockerfile文件,与文件中ARG声明的变量对应 --> <JAR_FILE>target/qrcode-admin.jar</JAR_FILE> </buildArgs> <skipTags>true</skipTags> <!-- 跳过默认标记 --> <useCache>false</useCache> <!-- 关闭缓存机制 --> <forceTag>true</forceTag> <!-- 强制创建新标记 --> <verbose>true</verbose> <!-- 输出更详细信息 --> <pushImage>true</pushImage> <!-- 是否将镜像推送到Docker Registry --> <contextDirectory>/path/</contextDirectory> <!-- 指定构建的上下文目录,该目录中的文件和目录会被复制到Docker镜像中。默认情况下dockerfile-maven-plugin会将Maven项目的根目录作为构建上下文目录--> <dockerfile>src/main/docker/Dockerfile</dockerfile><!-- Dockerfile所在目录路径 --> <additionalBuildArgs>--no-cache=true --pull=true</additionalBuildArgs> <!-- 添加其他构建参数 --> </configuration> </plugin>
四、编写Dockerfile文件并放入指定目录
根据实际需求编写Dockerfile文件后,应该将Dockerfile文件应该放在Maven项目的根目录下或者src/main/docker目录下,这是默认的dockerfile-maven-plugin所查找的路径。如果不在这两个目录下,则需要使用configuration.dockerfile标签指定文件的路径。以下是dockerfile文件示例:
FROM openjdk:8-jre
MAINTAINER sjht xxx@qq.com
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo "Asia/Shanghai" > /etc/timezone
ARG JAR_FILE
COPY ${JAR_FILE} /app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app.jar"]
dockerfile文件是根据他的特定语法生成的,语法关键字有FROM、MAINTAINER、RUN、CMD、EXPOSE、ENV、ADD、COPY、ENTRYPOINT、VOLUME、USER、WORKDIR、ONBUILD,使用说明如下:
# Base images 基础镜像 FROM centos #MAINTAINER 作者姓名和邮箱 MAINTAINER zqf<92973322@qq.com> #ENV 设置环境变量,可通过 $变量名 引用 ENV PATH /usr/local/nginx/sbin:$PATH #ADD 文件放在当前目录下,拷过去会自动解压,这与COPY命令差不多,区别是COPY不会自动解压 ADD nginx-1.8.0.tar.gz /usr/local/ ADD epel-release-latest-7.noarch.rpm /usr/local/ #RUN 执行以下命令 RUN rpm -ivh /usr/local/epel-release-latest-7.noarch.rpm RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all RUN useradd -s /sbin/nologin -M www #WORKDIR 相当于cd,登录时切换到的目录 WORKDIR /usr/local/nginx-1.8.0 RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-pcre && make && make install RUN echo "daemon off;" >> /etc/nginx.conf #挂在数据卷 VOLUME /data : /usr #镜像被子镜像继承后构建时,运行的命令 ONBUILD ["nginx"] #EXPOSE 映射端口 EXPOSE 80 #CMD 容器启动时要运行的命令,如果有多个CMD则前面的会被覆盖,也会被dockr run 后面的脚本参数替换 CMD ["nginx"] #容器启动时要运行的命令,有多个时会追加执行命令,而不会CMD那样被覆盖 ENTRYPOINT ["nginx"]
六、绑定Docker命令到Maven的生命周期
maven的生命周期包括如下几个阶段:
1、清理:删除以前编译得到的旧class字节码文件,为下一次编译做准备。
2、编译:将java源程序编译为class字节码文件。
3、测试:自动调用junit程序进行自测。
4、报告:显示测试程序执行的结果。
5、打包:将编译好的class字节码文件打包成war、jar包。
6、安装:将自己的工程安装到maven仓库中指定的位置,才能供其他模块使用。
7、部署:将jar、war放到生产环境下运行。
maven本质上是只是一个插件框架,它的核心并不执行任何具体的构建任务,全部任务都是由插件来完成的。构建过程的每一个步骤都都对应一个插件来负责,例如清理阶段由内置插件maven-clean-plugin的目标clean完成清理操作。Maven提供了Build plugins、Reporting plugins两种类型的插件。Build plugins在构建时执行,Reporting plugins在网站生成过程中执行。
使用插件时需要先明确插件的目标是什么?在maven生命周期哪个阶段执行?dockerfile-maven-plugin插件的目标有build 、tag和push:
- mvn dockerfile:build 通过dockerfile文件构建镜像(需要在docker服务器中执行)。
- mvn dockerfile:tag:使用指定的tag给已经build镜像打标签。
- mvn dockerfile:push :推送镜像到docker镜像仓库(需要配置docker镜像仓库地址并登录)。
插件目标和生命周期绑定是通过executions节点配置来完成的,举例如下:
<!-- docker打包插件 --> <plugin> <groupId>com.spotify</groupId> <artifactId>dockerfile-maven-plugin</artifactId> <version>${dockerfile-maven-plugin.version}</version> <configuration> <useMavenSettingsForAuth>true</useMavenSettingsForAuth> <repository>${docker.image.prefix}/qrcode-admin</repository> <tag>1.1.5_xxx</tag> <buildArgs> <JAR_FILE>target/qrcode-admin.jar</JAR_FILE> </buildArgs> </configuration> <executions> <!-- 插件目标执行集合 --> <execution> <!-- 表示一个具体的插件目标执行 --> <id>build</id> <!-- 用于唯一标识一个执行 --> <phase>install</phase> <!-- 指定插件目标应该何时执行,即绑定的生命周期阶段,compile、test、package等 --> <goals> <!-- 指定要执行的插件目标集合 --> <goal>build</goal> <!-- 指定要执行的插件目标名称 --> </goals> <configuration> </configuration> </execution> </executions> </plugin>
配置完成后执行maven生命周期方法时该插件目标便会自动运行,如图:
七、运行mvn dockerfile命令
- mvn clean install package:项目的清理、安装、打包命令。
- mvn dockerfile:build:通过dockerfile文件构建镜像。
- mvn dockerfile:push:推送镜像到仓库。
- mvn dockerfile:tag:使用指定的tag给已经build镜像打标签。