在预习了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
2
<docker.image.prefix>hjwjw</docker.image.prefix>
<docker.plugin.version>1.4.9</docker.plugin.version>

添加插件

在项目的pom.xml中添加dockerfile-maven插件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>${docker.plugin.version}</version>
<executions>
<execution>
<id>default</id>
<goals>
<goal>build</goal>
<!--<goal>push</goal>-->
</goals>
</execution>
</executions>
<configuration>
<repository>${docker.image.prefix}/${project.artifactId}</repository>
<tag>${project.version}</tag>
<buildArgs>
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
</configuration>
</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
2
3
4
5
6
7
FROM livingobjects/jre8
VOLUME /tmp
ARG JAR_FILE
ADD ${JAR_FILE} app.jar
RUN bash -c 'touch /app.jar'
EXPOSE 8010
ENTRYPOINT ["java","-Djava.security.egd=file:dev/./urandom","-jar","/app.jar"]

livingobjects/jre8 是一个比较小的jre8的基础镜像,构建镜像时会快些。

Dockerfile 的参数在 Dockerfile实践 中已经写过,可以在本博客搜索查看。

1
2
ARG JAR_FILE
ADD ${JAR_FILE} app.jar

表示接收构建参数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

执行命令过程如图:

打包并构建image

可以看到按Dockerfile一步步构建镜像了,执行完成后我们就可以在Docker服务器上查看新的image,如下:

docker imges

至此,Docker 构建微服务镜像完成。源码: microservice-customer-movie

镜像运行可以参考本博客分类:Docker

镜像tag

在使用上面的方式生成镜像时,我们前面在pom.xml 中已经配置了构建时的tag

1
<tag>${project.version}</tag>

如果不配置这个参数,默认生成的taglatest

有时我们想修改成自己的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镜像的tagconfig 的新镜像。

同样的,如果在pom中没有指定tag,在使用dockerfile:build 构建新镜像时也可以指定tag名:

1
mvn dockerfile:build -Ddockerfile.tag=consumer