在预习了Docker的知识后,开始对微服务进行Docker容器化改造。
本篇内容前提:
- 已安装 Docker 的服务器环境
- Docker 基础操作
Docker 的基础学习笔记可以在本博客 Docker 分类中查看。
我使用 Maven 来构建 Docker 镜像。Maven 有几个Docker 插件可以使用,这里使用的是 由Spotify
公司开发的 Maven 插件。
插件名称:dockerfile-maven 地址:https://github.com/spotify/dockerfile-maven
在它前面还有一个”哥哥” docker-maven-plugin
这个插件已经不推荐使用了。docker-maven-plugin
插件可以不使用Dockerfile
而直接在pom.xml
中来构建镜像,但随着时间的推移Spotify
公司也意识到这种方式可能导致很多不必要的混淆,使用Dockerfile
构建镜像是最简单的方法,因此但这种方式不推荐,这个项目也不会再增加新功能,仅限错误修复。所以我一开始就学习的dockerfile-maven
插件。它会连接远程Docker,只要一个命令就能把本地的jar包打成Docker镜像,命令执行完毕后,服务器上就会有刚打包好的镜像,此时再执行该镜像即可。
下面使用dockerfil-maven
来构建镜像,以前面的 microservice-consumer-movie
项目为例。
添加属性
在添加插件前先在pom.xml
中添加一些属性,方便配置,在pom
中添加如下properties
:
1 | <docker.image.prefix>hjwjw</docker.image.prefix> |
添加插件
在项目的pom.xml中添加dockerfile-maven
插件
1 | <plugin> |
插件配置说明
- repository : 用于命名构建镜像的存储库,生成的镜像名如:
hjwjw/microservice-discovery-eureka
。 - tag : 是标签名称,这里指定标签名为pom中的
${project.version}
,这里即是:0.0.1-SNAPSHOT - buildArgs : 为构建参数,可以在构建里将参数传到Dockerfile中,
${project.build.finalName}
表示打包后jar包的名称。这里是将jar的路径传递到Dockerfile中。 - executions : 这里设置把插件的
goal
绑定到某个phase
上,实现打包完成后自动构建镜像并推送,这里没有配置远程仓库因此不推送到远程仓库。
phase 和 goal 可以这样理解:maven 命令格式是:mvn phase:goal ,例如mvn package dockerfile:build .那么,package 和 dockerfile 都是 phase ,build则是 goal 。
添加Dockerfile
在项目根目录添加Dockerfile
文件,内容如下:
1 | FROM livingobjects/jre8 |
livingobjects/jre8 是一个比较小的jre8的基础镜像,构建镜像时会快些。
Dockerfile 的参数在 Dockerfile实践 中已经写过,可以在本博客搜索查看。
1 | ARG JAR_FILE |
表示接收构建参数JAR_FILE
这个参数在前面的pom.xml
中配置插件时已经添加。参数内容为jar 的的路径,${JAR_FILE}
则是使用传递进来的参数。
开启Docker远程
开启Docker远程方法可参考博客:Docker安装配置
开启后在本机上配置一个环境变量:
1 | DOCKER_HOST=tcp://ip:2375 |
IP 为Docker 所安装的服务器IP ,端口一般没有修改过默认会是2375
dockerfile-maven
插件就是通过在本机操作 Docker api 构建镜像的,因此本机上不需要安装Docker,能够访问到Docker服务器即可。
构建image
前面的配置都完成后,在IDE的命令窗口只需要一个命令即可实现对项目的打包及构建镜像到Docker服务器。
1 | mvn package |
执行命令过程如图:
可以看到按Dockerfile一步步构建镜像了,执行完成后我们就可以在Docker服务器上查看新的image,如下:
至此,Docker 构建微服务镜像完成。源码: microservice-customer-movie
镜像运行可以参考本博客分类:Docker
镜像tag
在使用上面的方式生成镜像时,我们前面在pom.xml
中已经配置了构建时的tag
:
1 | <tag>${project.version}</tag> |
如果不配置这个参数,默认生成的tag
是 latest
。
有时我们想修改成自己的tag
,可以通过dockerfile:tag
修改,但需要先把 pom.xml
中指定的tag
配置去掉。在pom.xml
中删除如下:
1 | <tag>${project.version}</tag> |
接着使用如下maven
命令:
1 | mvn dockerfile:tag -Ddockerfile.tag=config |
执行完成后Docker 服务器上会出现一个基于hjwjw/microservice-consumer-movie:0.0.1-SNAPSHOT
镜像的tag
为config
的新镜像。
同样的,如果在pom
中没有指定tag
,在使用dockerfile:build
构建新镜像时也可以指定tag
名:
1 | mvn dockerfile:build -Ddockerfile.tag=consumer |