容器的出现让 Java开发人员比以往任何时候都更接近“编写一次,到处运行”的工作流程,然而在实际的工作中并非这样的~!要实现这样的诉求,首先你必须编写 Dockerfile,以 root身份运行 Docker守护进程,等待构建完成,最后将镜像推送到远程注册中心。说实话,Dockerfile有多复杂也有文章讲过,但并非所有的 Java开发人员都是容器专家。下面带着这些疑问,给大家介绍下java开源世界常用docker-maven-plugin、dockerfile-maven-plugin、jib-maven-plugin,工具的好坏,重要的看自己的喜好。
One-JAR的魅力在于:
java -jar
机制执行。jar
工具就可以被装配起来。目录
1. docker-maven-plugin
历程
声明构建信息
使用Dockerfile
构建
使用私有镜像中心
认证
2. dockerfile-maven-plugin
约束
示例
它可以带来什么?
授权
配置
3. jib-maven-plugin
快速开始
2016-4月份由Spotify开源的,当前版本v1.1.1,一个,用于构建和上传docker镜像的Maven插件,官方介绍
这个插件是Spotify使用的最初的Maven插件,用于从Java服务中构建DOCKERr镜像。它最初创建于2014,当我们第一次开始试验Docker。这个插件能够基于pom.xml文件中的配置为您生成一个Dockerfile,用于FROM映像、添加ADD/COPY等内容。
Spotify随着时间的推移,我们意识到,从Java项目中构建DOCKERr镜像最简单的方法是让开发人员编写DOCKFILE文件。这个插件在生成Dockerfile、将项目目录复制到“.ing”目录以作为Docker构建上下文等等方面的行为最终导致了与用户之间的许多不必要的混淆,这些混淆源于引入额外的抽象和对配置的需要。最重要的是Docker提供的东西。
这导致创建了用于构建docker映像的第二个Maven插件,dockerfile-maven,我们认为它为使用来自Maven的Docker提供了一个更简单的思维模型,原因都在dockerfile-maven的README中列出。
默认情况下,该插件通过访问localhost:2375来连接本地docker,可以通过设置DOCKER_HOST 环境变量来连接docker.
DOCKER_HOST=tcp://:2375
此示例创建一个名为example的新镜像,将项目的jar文件复制到镜像中,并设置运行jar的入口点。更改版本到最新的标签版本。
com.spotify
docker-maven-plugin
VERSION GOES HERE
example
java
["java", "-jar", "/${project.build.finalName}.jar"]
/
${project.build.directory}
${project.build.finalName}.jar
参数解释:
为了使用Dockerfile,必须在pom的文件中通过dockerDirectory来指明Dockerfile文件的所在目录。如果配置了dockerDirectory,baseImage,maintainer,cmd和entryPoint配置将忽略。下面的配置会将dockerDirectory的内容拷贝值${project.build.directory}/docker,使用resouces元素可以拷贝其他的文件,比如生成jar包文件。
com.spotify
docker-maven-plugin
VERSION GOES HERE
example
docker
/
${project.build.directory}
${project.build.finalName}.jar
绑定docker命令到maven phases
com.spotify
docker-maven-plugin
VERSION GOES HERE
build-image
package
build
tag-image
package
tag
my-image:${project.version}
registry.example.com/my-image:${project.version}
push-image
deploy
push
registry.example.com/my-image:${project.version}
可以通过一下命令跳过docker构建的阶段
删除一个名称为foobar的镜像
mvn docker:removeImage -DimageName=foobar
获取完成的配置选项列表
mvn com.spotify:docker-maven-plugin:
为了将镜像推送到私有的镜像注册中心,docker需要在镜像tag之前用注册中心的地址作为前缀。比如需要推送my-image到registry.example.com,那么这个镜像需要命名为registry.example.com/my-image
最简单的方法就是在
com.spotify
docker-maven-plugin
registry.example.com/my-image
...
这样,当你通过命令docker:build -DpushImage
或者docker:push
推送镜像时,docker引擎会将镜像推送到registry.example.com.
当然你可以在docker:build命令中通过 docker:tag -DpushImage
对创建的镜像加上私有镜像注册中心的地址,如不配置,则会推送到默认的镜像中心,即Docker hub;你也可如下这样配置:
com.spotify
docker-maven-plugin
my-image
...
build-image
package
build
tag-image
package
tag
my-image
registry.example.com/my-image
支持三种认证方式:
1. 读取本地配置文件,自动认证
从1.0.0版本之后,docker-maven-plugin插件会自动读取到docker-cli的认证配置,默认在~/.dockercfg 和~/.docker/config.json,而无需额外的配置
2. GCR认证
如果本机配置DOCKER_GOOGLE_CREDENTIALS的环境变量,则会使用GCR认证。
3. Server认证
docker-hub
foo
secret-password
[email protected]
com.spotify
docker-maven-plugin
VERSION GOES HERE
[...]
docker-hub
https://index.docker.io/v1/
以上三种配置方式中,通过读取客户端默认配置的优先级更高。
在server配置中加密密码
为了不在配置文件中不暴露明文密码,可以使用maven加密功能对密码进行加密,通过{ }方式都认为是被加密的密码
docker-hub
foo
{gc4QPLrlgPwHZjAhPw8JPuGzaPitzuyjeBojwCz88j4=}
上面讲过,Spotify的第二个版本,官方介绍
mvn deploy
时,您的镜像会被推送。mvn dockerfile:build
和mvn dockerfile:tag
和稍后的mvn dockerfile:push
无问题。这也消除了对诸如mvn dockerfile:build -DalsoPush
之类的东西的需求;相反,您可以只说mvn dockerfile:build dockerfile:push
。这个插件需要Java 7或更高版本和Apache Maven 3或更高版本。要运行集成测试或在实践中使用插件,需要一个docker环境。
com.spotify
dockerfile-maven-plugin
${dockerfile-maven-version}
default
build
push
spotify/foobar
${project.version}
${project.build.finalName}.jar
对应的docker镜像可以是:
FROM openjdk:8-jre
MAINTAINER David Flemström
ENTRYPOINT ["/usr/bin/java", "-jar", "/usr/share/myservice/myservice.jar"]
# Add Maven dependencies (not shaded into the artifact; Docker-cached)
ADD target/lib /usr/share/myservice/lib
# Add the service itself
ARG JAR_FILE
ADD target/${JAR_FILE} /usr/share/myservice/myservice.jar
1.更快的建造时间,这个插件允许您更一致地利用Docker缓存,通过让您在映像中缓存Maven依赖项,极大地加快了构建的速度。它还鼓励避免maven-shade-plugin
,这也大大加快了构建。
2.一致的构建生命周期
mvn package
mvn dockerfile:build
mvn verify
mvn dockerfile:push
mvn deploy
3.依赖docker镜像上的其他服务,您可以依赖于另一个项目的Docker信息,因为这个插件在构建Docker映像时附加项目元数据。只需将此信息添加到任何项目
4.使用依赖Dockerfiles的其他docker工具
a/
Dockerfile
pom.xml
b/
Dockerfile
pom.xml
service-a:
build: a/
ports:
- '80'
service-b:
build: b/
links:
- service-a
更多
更多
google 于2018-7开源的,通过 Jib,我们不需要编写 Dockerfile 或安装 Docker,通过集成到 Maven 或 Gradle 插件,就可以立即将 Java 应用程序容器化。官方介绍
优点
缺点
4.0.0
com.alex.sample.lib
helloworld-samples
0.1
jar
helloworld-samples
UTF-8
1.0.2
3.8.0
org.apache.maven.plugins
maven-compiler-plugin
${maven-compiler-plugin.version}
1.8
com.google.cloud.tools
jib-maven-plugin
${jib-maven-plugin.version}
registry.cn-hangzhou.aliyuncs.com/alex/oracle_java8
registry.cn-hangzhou.aliyuncs.com/alex/jib-helloworld:v1
-Xms512m
-Xdebug
com.alex.HelloWorld
package
build
...
registry.cn-hangzhou.aliyuncs.com
你的阿里云账号
你的阿里云密码
构建镜像
mvn compile jib:build
把镜像直接构建到本地docker中
mvn compile jib:dockerBuild
把镜像直接构建到本地磁盘(target/jib-image.tar)
mvn compile jib:buildTar
这样,可以从本地启动
docker load --input target/jib-image.tar
导出一个Docker context
mvn compile jib:exportDockerContext -DjibTargetDir=my/docker/context/
可以使用docker build image
docker build -t myimage my/docker/context/
其他参数说明,更多
最后,工具没有好坏之说,但个人推荐使用jib-maven-plugin,功能特性上稍稍丰富一些,另外就是google的魅力。