浅谈使用Maven插件构建Docker镜像的方法
本文介绍了使用maven插件构建docker镜像的方法,分享给大家,具体如下:
工具
工欲善其事,必先利其器。笔者经过调研,有以下几款docker的maven插件进入笔者视野:
插件名称 | 官方地址 |
---|---|
docker-maven-plugin | |
docker-maven-plugin | |
docker-maven-plugin |
笔者从stars、文档易用性以及更新频率三个纬度考虑,选用了第一款。
使用插件构建docker镜像
简单使用
我们以之前的项目:microservice-discovery-eureka为例:
在pom.xml中添加下面这段
<build> <plugins> <!-- docker的maven插件,官网:https://github.com/spotify/docker-maven-plugin --> <plugin> <groupid>com.spotify</groupid> <artifactid>docker-maven-plugin</artifactid> <version>0.4.12</version> <configuration> <!-- 注意imagename一定要是符合正则[a-z0-9-_.]的,否则构建不会成功 --> <!-- 详见:https://github.com/spotify/docker-maven-plugin invalid repository name ... only [a-z0-9-_.] are allowed--> <imagename>microservice-discovery-eureka</imagename> <baseimage>java</baseimage> <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> </build>
执行命令:
mvn clean package docker:build
我们会发现控制台有类似如下内容:
[info] building image microservice-discovery-eureka step 1 : from java pulling from library/java digest: sha256:581a4afcbbedd8fdf194d597cb5106c1f91463024fb3a49a2d9f025165eb675f status: downloaded newer image for java:latest ---> ea40c858f006 step 2 : add /microservice-discovery-eureka-0.0.1-snapshot.jar // ---> d1c174083bca removing intermediate container 91913d847c20 step 3 : entrypoint java -jar /microservice-discovery-eureka-0.0.1-snapshot.jar ---> running in 0f2aeccdfd46 ---> d57b027ca65a removing intermediate container 0f2aeccdfd46 successfully built d57b027ca65a [info] built microservice-discovery-eureka [info] ------------------------------------------------------------------------ [info] build success [info] ------------------------------------------------------------------------ [info] total time: 01:38 min [info] finished at: 2016-09-18t01:05:05-07:00 [info] final memory: 40m/198m
恭喜,构建成功了。
我们执行docker images 会发现该镜像已经被构建成功:
repository tag image id created size microservice-discovery-eureka latest d57b027ca65a about a minute ago 681.5 mb
启动镜像
docker run -p 8761:8761 microservice-discovery-eureka
我们会发现该docker镜像会很快地启动。
访问测试
访问http://docker宿主机ip:8761 ,能够正常看到eureka界面。
使用dockerfile进行构建
上文讲述的方式是最简单的方式,很多时候,我们还是要借助dockerfile进行构建的,首先我们在/microservice-discovery-eureka/src/main/docker目录下,建立文件dockerfile
from java:8 volume /tmp add microservice-discovery-eureka-0.0.1-snapshot.jar app.jar run bash -c 'touch /app.jar' expose 9000 entrypoint ["java","-djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
修改pom.xml
<build> <plugins> <!-- docker的maven插件,官网:https://github.com/spotify/docker-maven-plugin --> <plugin> <groupid>com.spotify</groupid> <artifactid>docker-maven-plugin</artifactid> <version>0.4.12</version> <configuration> <!-- 注意imagename一定要是符合正则[a-z0-9-_.]的,否则构建不会成功 --> <!-- 详见:https://github.com/spotify/docker-maven-plugin invalid repository name ... only [a-z0-9-_.] are allowed--> <imagename>microservice-discovery-eureka-dockerfile</imagename> <!-- 指定dockerfile所在的路径 --> <dockerdirectory>${project.basedir}/src/main/docker</dockerdirectory> <resources> <resource> <targetpath>/</targetpath> <directory>${project.build.directory}</directory> <include>${project.build.finalname}.jar</include> </resource> </resources> </configuration> </plugin> </plugins> </build>
其他步骤一样。这样即可使用dockerfile进行构建docker镜像啦。
将docker镜像push到dockerhub上
首先修改maven的全局配置文件settings.xml,添加以下段落
<servers> <server> <id>docker-hub</id> <username>你的dockerhub用户名</username> <password>你的dockerhub密码</password> <configuration> <email>你的dockerhub邮箱</email> </configuration> </server> </servers>
在dockerhub上创建repo
项目pom.xml修改为如下:注意imagename的路径要和repo的路径一致
<build> <plugins> <!-- docker的maven插件,官网:https://github.com/spotify/docker-maven-plugin --> <plugin> <groupid>com.spotify</groupid> <artifactid>docker-maven-plugin</artifactid> <version>0.4.12</version> <configuration> <!-- 注意imagename一定要是符合正则[a-z0-9-_.]的,否则构建不会成功 --> <!-- 详见:https://github.com/spotify/docker-maven-plugin invalid repository name ... only [a-z0-9-_.] are allowed --> <!-- 如果要将docker镜像push到dockerhub上去的话,这边的路径要和repo路径一致 --> <imagename>eacdy/test</imagename> <!-- 指定dockerfile所在的路径 --> <dockerdirectory>${project.basedir}/src/main/docker</dockerdirectory> <resources> <resource> <targetpath>/</targetpath> <directory>${project.build.directory}</directory> <include>${project.build.finalname}.jar</include> </resource> </resources> <!-- 以下两行是为了docker push到dockerhub使用的。 --> <serverid>docker-hub</serverid> <registryurl>https://index.docker.io/v1/</registryurl> </configuration> </plugin> </plugins> </build>
执行命令:
mvn clean package docker:build -dpushimage
搞定,等构建成功后,我们会发现docker镜像已经被push到dockerhub上了。
将镜像push到私有仓库
在很多场景下,我们需要将镜像push到私有仓库中去,这边为了讲解的全面性,私有仓库采用的是配置登录认证的私有仓库。
和push镜像到dockerhub中一样,我们首先需要修改maven的全局配置文件settings.xml,添加以下段落
<servers> <server> <id>docker-registry</id> <username>你的dockerhub用户名</username> <password>你的dockerhub密码</password> <configuration> <email>你的dockerhub邮箱</email> </configuration> </server> </servers>
将项目的pom.xml改成如下,
<plugin> <groupid>com.spotify</groupid> <artifactid>docker-maven-plugin</artifactid> <version>0.4.12</version> <configuration> <!-- 路径为:私有仓库地址/你想要的镜像路径 --> <imagename>reg.itmuch.com/test-pull-registry</imagename> <dockerdirectory>${project.basedir}/src/main/docker</dockerdirectory> <resources> <resource> <targetpath>/</targetpath> <directory>${project.build.directory}</directory> <include>${project.build.finalname}.jar</include> </resource> </resources> <!-- 与maven配置文件settings.xml一致 --> <serverid>docker-registry</serverid> </configuration> </plugin>
执行:
mvn clean package docker:build -dpushimage
稍等片刻,将会push成功。
如果想要从私服上下载该镜像,执行:
docker login reg.itmuch.com # 然后输入账号和密码 docker pull reg.itmuch.com/test-pull-registry
将插件绑定在某个phase执行
在很多场景下,我们有这样的需求,例如执行mvn clean package 时,自动地为我们构建docker镜像,可以吗?答案是肯定的。我们只需要将插件的goal 绑定在某个phase即可。
所谓的phase和goal,可以这样理解:maven命令格式是:mvn phase:goal ,例如mvn package docker:build 那么,package 和 docker 都是phase,build 则是goal 。
下面是示例:
首先配置属性:
<properties> <docker.image.prefix>reg.itmuch.com</docker.image.prefix> </properties>
插件配置:
<build> <plugins> <plugin> <groupid>com.spotify</groupid> <artifactid>docker-maven-plugin</artifactid> <executions> <execution> <id>build-image</id> <phase>package</phase> <goals> <goal>build</goal> </goals> </execution> </executions> <configuration> <imagename>${docker.image.prefix}/${project.artifactid}</imagename> <baseimage>java</baseimage> <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> </build>
如上,我们只需要添加:
<executions> <execution> <id>build-image</id> <phase>package</phase> <goals> <goal>build</goal> </goals> </execution> </executions>
即可。本例指的是讲docker的build目标,绑定在package这个phase上。也就是说,用户只需要执行mvn package ,就自动执行了mvn docker:build 。
常见异常
连接不上2375(一般在win7上出现)
connect to localhost:2375 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1] failed: connection refused: connect -> [help 1]
解决步骤:
输入docker-machine env
$env:docker_tls_verify = "1" $env:docker_host = "tcp://192.168.99.100:2376" $env:docker_cert_path = "c:\users\administrator\.docker\machine\machines\default
为插件添加配置
<!-- 解决connect to localhost:2375的问题的其中一种方式,注意要跟docker-machine env相一致 --> <dockerhost>https://192.168.99.100:2376</dockerhost> <dockercertpath>c:\users\administrator\.docker\machine\machines\default</dockercertpath>
修改后插件配置变为:
<plugin> <groupid>com.spotify</groupid> <artifactid>docker-maven-plugin</artifactid> <version>0.4.12</version> <configuration> <imagename>eacdy/test</imagename> <dockerdirectory>${project.basedir}/src/main/docker</dockerdirectory> <!-- 解决connect to localhost:2375的问题的其中一种方式,注意要跟docker-machine env相一致 --> <dockerhost>https://192.168.99.100:2376</dockerhost> <dockercertpath>c:\users\administrator\.docker\machine\machines\default</dockercertpath> <resources> <resource> <targetpath>/</targetpath> <directory>${project.build.directory}</directory> <include>${project.build.finalname}.jar</include> </resource> </resources> <!-- 以下两行是为了docker push到dockerhub使用的。 --> <serverid>docker-hub</serverid> <registryurl>https://index.docker.io/v1/</registryurl> </configuration> </plugin>
参考:
tips
- imagename必须符合正则[a-z0-9-_.],否则将会构建失败
- 插件默认使用localhost:2375去连接docker,如果你的docker端口不是2375,需要配置环境变量docker_host=tcp://<host>:2375
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。