1.7 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 |
笔者从Stars、文档易用性以及更新频率三个纬度考虑,选用了第一款。
使用插件构建Docker镜像
简单使用
我们以之前的项目:microservice-discovery-eureka为例:
- 在pom.xml中添加下面这段
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 执行命令:
- 1
- 我们会发现控制台有类似如下内容:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
恭喜,构建成功了。
- 我们执行
docker images
会发现该镜像已经被构建成功:
- 1
- 2
- 启动镜像
- 1
我们会发现该Docker镜像会很快地启动。
- 访问测试
访问http://Docker宿主机IP:8761 ,能够正常看到Eureka界面。
使用Dockerfile进行构建
上文讲述的方式是最简单的方式,很多时候,我们还是要借助Dockerfile进行构建的,首先我们在/microservice-discovery-eureka/src/main/docker目录下,建立文件Dockerfile
- 1
- 2
- 3
- 4
- 5
- 6
修改pom.xml
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
其他步骤一样。这样即可使用Dockerfile进行构建Docker镜像啦。
将Docker镜像push到DockerHub上
- 首先修改Maven的全局配置文件settings.xml,添加以下段落
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 在DockerHub上创建repo,例如:test,如下图
- 项目pom.xml修改为如下:注意imageName的路径要和repo的路径一致
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 执行命令:
- 1
- 搞定,等构建成功后,我们会发现Docker镜像已经被push到DockerHub上了。
将镜像push到私有仓库
在很多场景下,我们需要将镜像push到私有仓库中去,这边为了讲解的全面性,私有仓库采用的是配置登录认证的私有仓库。
- 和push镜像到DockerHub中一样,我们首先需要修改Maven的全局配置文件settings.xml,添加以下段落
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 将项目的pom.xml改成如下,
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 执行:
- 1
稍等片刻,将会push成功。
- 如果想要从私服上下载该镜像,执行:
- 1
- 2
将插件绑定在某个phase执行
在很多场景下,我们有这样的需求,例如执行mvn clean package
时,自动地为我们构建docker镜像,可以吗?答案是肯定的。我们只需要将插件的goal
绑定在某个phase即可。
所谓的phase和goal,可以这样理解:maven命令格式是:mvn phase:goal
,例如mvn package docker:build
那么,package
和 docker
都是phase,build
则是goal 。
下面是示例:
首先配置属性:
- 1
- 2
- 3
插件配置:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
如上,我们只需要添加:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
即可。本例指的是讲docker的build目标,绑定在package这个phase上。也就是说,用户只需要执行mvn package
,就自动执行了mvn docker:build
。
常见异常
连接不上2375(一般在Win7上出现)
- 1
解决步骤:
- 输入
docker-machine env
- 1
- 2
- 3
- 为插件添加配置
- 1
- 2
修改后插件配置变为:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
TIPS
- imageName必须符合正则[a-z0-9-_.],否则将会构建失败
- 插件默认使用localhost:2375去连接Docker,如果你的Docker端口不是2375,需要配置环境变量
DOCKER_HOST=tcp://<host>:2375
代码地址(任选其一)
https://git.oschina.net/itmuch/spring-cloud-study/tree/master/docker/microservice-discovery-eureka
https://github.com/eacdy/spring-cloud-study/tree/master/docker/microservice-discovery-eureka
参考文档
http://developer.51cto.com/art/201404/434879.htm
https://linux.cn/article-6131-rss.html