微服务与Docker的整合
学习完Docker Compose编排工具的使用后,下面需要做的就是将微服务项目与Docker进行整合。本节将针对微服务与Docker整合的具体实现过程进行详细讲解。
微服务与Docker的整合过程大体可以分为以下3步。
1. 添加Dockerfile文件
在Docker中,应用都是部署在容器中的,而容器又由镜像生成,镜像则通常是通过Dockerfile文件构建的,所以微服务与Docker整合的第一步就是要提供Dockerfile文件。
上一章讲解整合时编写的微服务项目microservice-mallmanagement主要有4个子项目模块(包括2个微服务模块和2个辅助服务模块),我们需要针对每一个子项目模块编写对应的Dockerfile文件。这里以用户订单管理微服务模块为例,所编写的Dockerfile文件的具体内容如文件1所示。
文件1 Dockerfile
1 FROM java:8-jre
2 MAINTAINER shirx <shirx@qq.com>
3 ADD ./target/**microservice-userservice-0.0.1-SNAPSHOT.jar \**
4 /app/microservice-userservice.jar
5 CMD ["java", "-Xmx200m", "-jar", "/app/microservice-userservice.jar"]
6 EXPOSE **8030
文件1中Dockerfile文件的内容非常简单,具体说明如下。
● 1~2行设置了一个基础镜像java:8-jre来提供项目的运行环境,并通过MAINTAINER配置了该镜像的维护者信息;
● 3~4行通过ADD命令将生成的项目jar包(在target目录下)复制到容器内部的app目录下,并重命名为microservice-userservice.jar;
● 第5行通过CMD命令指定了由该镜像生成的容器的启动命令(其实就是java –jar microservice-userservice.jar启动jar包的命令);
● 第6行通过EXPOSE指令指定容器暴露的端口号为8030(跟项目配置文件application.yml中指定的端口相同)。
将上述Dockerfile文件直接放在项目的根目录即可,效果如图1所示。
图1 Dockerfile文件在项目中配置示意图
图1只是展示了用户管理微服务模块所需的Dockerfile文件,其他服务编写的Dockerfile文件与文件1基本相同,只需要将Dockerfile中的项目名称和版本号后缀,以及复制到容器内部的JAR包名称进行相应修改即可。
2. 添加dockerfile-maven插件
Dockerfile文件编写完成后,就可以使用Docker的相关指令构建镜像并运行容器,然后访问容器中的应用了。只是上述所有的操作都是手动完成的,如果需要部署多个服务,将会非常麻烦。
针对这种情况,MAVEN提供了一个dockerfile-maven-plugin插件,很好的支持了与Docker的整合。该插件的使用非常简单,只需要在所有需要生成Docker容器项目的pom文件中添加该插件,并进行一些相关配置即可,其具体使用示例如下。
<build>
<plugins>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.3.6</version>
<configuration>
<!-- 生成的镜像名称 -->
<repository>
${docker.image.prefix}/${project.artifactId}
</repository>
<!-- 生成的镜像版本 -->
<tag>${project.version}</tag>
<!-- 推送到私有镜像仓库或者DockerHub时需要开启用户认证 -->
<useMavenSettingsForAuth>true</useMavenSettingsForAuth>
</configuration>
<!-- 直接使用mvn install命令打包项目,就会自动构建并推送镜像 -->
<executions>
<execution>
<id>default</id>
<phase>install</phase>
<goals>
<goal>build</goal>
<goal>push</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<properties>
<!-- 配置镜像前缀(就是仓库服务地址) -->
<docker.image.prefix>192.168.197.143:5000</docker.image.prefix>
</properties>
上述dockerfile-maven-plugin插件的配置及作用如下。
● 通过<plugin>标签添加了一个版本为1.3.6的dockerfile-maven-plugin插件。
● 分别使用<repository>和<tag>标签配置了生成的镜像名称和标签。其中${docker.image.prefix}用于指定镜像前缀(需要继续配置),${project.artifactId}用于将项目名称指定为镜像名称;${project.version}用于将项目版本指定为镜像版本。
● 使用<useMavenSettingsForAuth>标签开启仓库用户认证。生成的镜像不管是推送到DockerHub,还是本地私有镜像仓库,都必须先登录认证并通过后才可推送。该标签的作用就是在使用maven插件的时候开启用户认证(本地未创建认证的私有仓库或者后续手动推送镜像则不需要配置此标签)。
● 在<execution>标签中分别使用<phase>和<goals>子标签配置了mvn的执行命令和自动化动作。其中上述配置表示在使用mvn install执行打包项目时,会先进行打包,然后自动执行镜像构建和镜像推送任务,这种配置方式可以很好的完成项目与Docker的自动化整合工作(如果想要手动构建和推送镜像则可以去除<executions>标签)。
● 在<properties>标签中使用<docker.image.prefix>子标签配置了生成的镜像前缀(也就是本地私有仓库地址),来为${docker.image.prefix}赋值。
上述配置文件指定了<docker.image.prefix>标签(即镜像仓库前缀),这里使用的地址192.168.197.143:5000就是前面章节介绍Docker Swarm集群时搭建的Docker机器manager1中的私有仓库地址,后续项目将在该集群上进行部署。
上述dockerfile-maven-plugin插件的配置,需要在microservice-mallmanagement项目的4个子项目模块的pom文件中分别添加,并且无需任何更改。
3. 添加docker-compose.yml编排文件
对于个别项目,可以直接通过Docker run等指令启动容器服务,但对于多个项目服务来说,有必要通过Docker compose编排工具运行服务。
接下来,就为microservice-mallmanagement添加一个docker-compose.yml编排文件,以便后续使用Docker compose编排工具,具体如文件2所示。
文件2 docker-compose.yml
1 version: "3"
2 services:
3 mysql:
4 image: mysql:5.6
5 restart: on-failure
6 ports:
7 - 3306:3306
8 volumes:
9 - microservice-mysql:/var/lib/mysql
10 networks:
11 - microservice-net
12 environment:
13 MYSQL_ROOT_PASSWORD: root
14 MYSQL_DATABASE: microservice_mallmanagement
15 deploy:
16 replicas: 1
17 restart_policy:
18 condition: on-failure
19 placement:
20 constraints: [node.role == manager]
21 eureka-server:
22 image: 192.168.197.143:5000/microservice-eureka-server:0.0.1-SNAPSHOT
23 restart: on-failure
24 ports:
25 - 8761:8761
26 networks:
27 - microservice-net
28 deploy:
29 replicas: 1
30 restart_policy:
31 condition: on-failure
32 gateway-zuul:
33 image: 192.168.197.143:5000/microservice-gateway-zuul:0.0.1-SNAPSHOT
34 restart: on-failure
35 ports:
36 - 8050:8050
37 networks:
38 - microservice-net
39 depends_on:
40 - eureka-server
41 deploy:
42 replicas: 1
43 restart_policy:
44 condition: on-failure
45 placement:
46 constraints: [node.role == manager]
47 order-service:
48 image: 192.168.197.143:5000/microservice-orderservice:0.0.1-SNAPSHOT
49 restart: on-failure
50 ports:
51 - 7900:7900
52 networks:
53 - microservice-net
54 depends_on:
55 - mysql
56 - eureka-server
57 deploy:
58 replicas: 2
59 restart_policy:
60 condition: on-failure
61 user-service:
62 image: 192.168.197.143:5000/microservice-userservice:0.0.1-SNAPSHOT
63 restart: on-failure
64 ports:
65 - 8030:8030
66 networks:
67 - microservice-net
68 depends_on:
69 - mysql
70 - eureka-server
71 deploy:
72 replicas: 2
73 restart_policy:
74 condition: on-failure
75 visualizer:
76 image: dockersamples/visualizer:stable
77 ports:
78 - 8081:8080
79 networks:
80 - microservice-net
81 volumes:
82 - /var/run/docker.sock:/var/run/docker.sock
83 networks:
84 microservice-net:
85 volumes:
86 microservice-mysql:
在文件2中,提供了6个启动服务,除包含了microservice-mallmanagement项目自带的eureka-server、gateway-zuul、order-service、user-service4个子项目外,还包含了mysql数据库服务和visualizer集群环境下可视化工具服务。这些服务都是通过networks配置了一个指定的名称为microservice-net的自定义网络(服务部署时会自动创建该网络),服务之间可以通过该网络实现通信。
需要注意的是,构建服务的镜像名称要与微服务整合时生成的镜像名称一致,否则无法找到指定镜像来启动服务。
至此,微服务项目与Docker的整合配置就已经完成,剩下的就是如何将项目进行打包,并通过Docker进行部署了,下面两个小节将对这些内容进行详细讲解。