🏆【CI/CD 技术专题】「Maven 插件 Docker 系列」使用 Maven 插件构建 Docker 镜像的方法
前提概要
工欲善其事,必先利其器。有以下几款 Docker 的 Maven 插件进入笔者视野。
插件名称+官方地址
docker-maven-plugin https://github.com/spotify/docker-maven-plugin
docker-maven-plugin https://github.com/fabric8io/docker-maven-plugin
docker-maven-plugin https://github.com/bibryam/docker-maven-plugin
修改宿主机配置(docker 可以远程访问)
修改宿主机的 docker 配置,让其支持远程访问。
开启 docker 远程 API,修改 docker 配置文件 docker.service 进入编辑模式后。
ExecStart=后添加配置-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
保存后退出,重新加载配置文件 #systemctl daemon-reload ,启动 docker #systemctl start docker 。
刷新配置,重新服务
配置 DOCKER_HOST
docker-maven-plugin 插件默认连接本地 Docker 地址为:localhost:2375,所以我们需要先设置下环境变量。
注意:如果没有设置 DOCKER_HOST 环境变量,可以命令行显示指定 DOCKER_HOST 来执行,如我本机指定 DOCKER_HOST:DOCKER_HOST=tcp://<host>:2375
例如
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock ,这里就写 4 个 0,你可别改成自己的 ip 哦,
输入
#netstat -anp|grep 2375
显示 docker 正在监听 2375 端口,输入 #curl 127.0.0.1:2375/info 显示一大堆信息,证明远程 api 就弄好了在 windows 系统环境变量中新建 DOCKER_HOST,值为 tcp://10.100.74.220:2375,(你改成你自己的 docker 服务器 ip 地址)
使用插件构建 Docker 镜像
在我们持续集成过程中,项目工程一般使用 Maven 编译打包,然后生成镜像,通过镜像上线,能够大大提供上线效率,同时能够快速动态扩容,快速回滚,着实很方便。docker-maven-plugin 插件就是为了帮助我们在 Maven 工程中,通过简单的配置,自动生成镜像并推送到仓库中。
添加插件
在 pom.xml 中添加下面这段:
构建镜像
构建镜像可以使用一下两种方式,第一种是将构建信息指定到 POM 中,第二种是使用已存在的 Dockerfile 构建。(支持将 FROM, ENTRYPOINT, CMD, MAINTAINER 以及 ADD 信息配置在 POM 中,不需要使用 Dockerfile 配置。)
第一种方式,支持将 FROM, ENTRYPOINT, CMD, MAINTAINER 以及 ADD 信息配置在 POM 中,不需要使用 Dockerfile 配置
第二种方式,如果使用 VOLUME 或其他 Dockerfile 中的命令的时候,需要创建一个 Dockerfile,并在 POM 中配置 dockerDirectory 来指定路径即可。(创建一个 Dockerfile,并在 POM 中配置 dockerDirectory 来指定路径即可)
添加 docker-maven-plugin
{dockerhub 名称/imageName}:
dockerhub 名称:对应 DockerHub 用户名,,一定要是符合正则[a-z0-9-_.]的,否则构建不会成功
imageName:对应 DockerHub 仓库名,一定要是符合正则[a-z0-9-_.]的,否则构建不会成功
可以直接指定:{project.artifactId}
{imageTag}:镜像标签,相当于标签或者版本,latest。
{baseImage}: 指定基础镜像,等同 FROM 指令,例如:java,当然可以不用,直接在 dockerfile 文件中生成。
{endpoint}:// 等同于 ENTRYPOINT 指令,例如: ["java","-jar","app.jar"]
这里是复制 jar 包到 docker 容器指定目录配置,也可以写到 Dockerfile 中
{project.build.directory}:指定要复制的根目录,${project.build.directory} 表示 target 目录。
{project.build.finalName}:指定要复制的文件,${project.build.finalName}.jar 指打包后的 jar 文件。
resources.resource.targetPath:将打包后的资源文件复制到该目录;
resources.resource.directory:需要复制的文件所在目录,maven 打包的应用 jar 包保存在 target 目录下面;
resources.resource.include:需要复制的文件,打包好的应用 jar 包。
读取 Dockerfile 文件就不必指定 baseImage 和 entrypoint
指定要读取的 Dockerfile 文件:
创建 Dockerfile
\src\main\docker
内容如下
执行以下命令构建 Docker 镜像
mvn clean package docker:build
执行 docker images 查看刚才构建的镜像
执行命令
mvn clean package docker:build:只执行 build 操作
mvn clean package docker:build -DpushImage 执行 build 完成后 push 镜像
mvn clean package docker:build -DpushImageTag 执行 build 并 push 指定 tag 的镜像
注意:这里必须指定至少一个 imageTag,它可以配置到 POM 中,也可以在命令行指定。
命令行指定如下:
mvn clean package docker:build -DpushImageTags -DdockerImageTags=imageTag_1 -DdockerImageTags=imageTag_2,POM 文件中指定配置如下:
绑定 Docker 命令到 Maven 各个阶段
可以绑定 Docker 命令到 Maven 各个阶段,我们可以把 Docker 分为 build、tag、push,然后分别绑定 Maven 的 package、deploy 阶段。
只需要执行 mvn deploy 就可以完成整个 build、tag、push 操作了,当我们执行 mvn build 就只完成 build、tag 操作。
除此此外,当我们想跳过某些步骤或者只执行某个步骤时,不需要修改 POM 文件,只需要指定跳过 docker 某个步骤即可。比如当我们工程已经配置好了自动化模板了,但是这次我们只需要打镜像到本地自测。
不想执行 push 阶段,那么此时执行要指定参数-DskipDockerPush 就可跳过 push 操作了。
以上示例,当我们执行 mvn package 时,执行 build、tag 操作,当执行 mvn deploy 时,执行 build、tag、push 操作。如果我们想跳过 docker 某个过程时,只需要:
-DskipDockerBuild 跳过 build 镜像
-DskipDockerTag 跳过 tag 镜像
-DskipDockerPush 跳过 push 镜像
-DskipDocker 跳过整个阶段
例如:我们想执行 package 时,跳过 tag 过程,那么就需要 mvn package -DskipDockerTag。
docker-maven-plugin 插件还提供了很多很实用的配置,稍微列举几个参数吧。
安全认证配置
当我们 push 镜像到 Docker 仓库中时,不管是共有还是私有,经常会需要安全认证,登录完成之后才可以进行操作。当然,我们可以通过命令行
docker login -u user_name -p password docker_registry_host
登录,但是对于自动化流程来说,就不是很方便了。使用 docker-maven-plugin 插件我们可以很容易实现安全认证。
首先在 Maven 的配置文件 setting.xml 中增加相关 server 配置,主要配置 Docker registry 用户认证信息。
然后只需要在 pom.xml 中使用 server id 即可。
使用私有 Docker 仓库地址
实际工作环境中,我们需要 push 镜像到我们私有 Docker 仓库中,使用 d ocker-maven-plugin 插件我们也是很容易实现,有几种方式实现:
修改 POM 文件 imageName 操作
以以上的格式进行输出即可。
修改 POM 文件中 newName 操作
重新启动 Docker 服务
开启防火墙的 Docker 构建端口
firewall-cmd --zone=public --add-port=2375/tcp --permanentfirewall-cmd --reload
版权声明: 本文为 InfoQ 作者【李浩宇/Alex】的原创文章。
原文链接:【http://xie.infoq.cn/article/63414cca2f98a78085fb09711】。文章转载请联系作者。
评论