上篇 使用Maven构建微服务的Docker镜像 写了如何构建微服务的镜像及运行镜像。但往往我们整个微服务架构中会有几十个甚至几百个微服务,我们不可能都使用手动去启停,那样效率很低,维护量也很大。

因此我们需要一个自动化的工具帮助我们管理容器。本篇使用的是docker-compose

安装

Compose 支持 Linux、macOS、Windows 10 三大平台.

Compose 可以通过 Python 的包管理工具 pip 进行安装,也可以直接下载编译好的二进制文件使用,甚至能够直接在 Docker 容器中运行。

我是Centos 7因此我使用的是二进制包的形式安装。使用如下命令进行安装:

1
2
$ sudo curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose

安装完成后检查docker-compose版本OK就好了

1
2
[root@HJWDEV ~]# docker-compose -v
docker-compose version 1.23.1, build b02f1306

编排微服务

使用docker-compose编排微服务大致步骤如下:

1、编写各服务的Dockerfile

2、编写docker-compose.yml 定义组成应用程序的服务及各服务的依赖,网络配置等

3、运行docker-compose up 命令,启动并运行整个项目

本例项目源码使用之前做过的项目,把Eureka,provider-user,consumer-movie进行编排。源码查看:microservice-discovery-eurekamicroservice-simple-provider-usermicroservice-simple-consumer-movie

目录结构如下:

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
30
31
32
33
34
35
36
37
38
39
40
├─.idea
│ ├─inspectionProfiles
│ └─libraries
├─microservice-discovery-eureka
│ ├─src
│ │ └─main
│ │ ├─java
│ │ │ └─com
│ │ │ └─hjwzyy
│ │ │ └─META-INF
│ │ └─resources
| └─Dockerfile
| └─pom.xml
├─microservice-simple-consumer-movie
│ ├─src
│ │ └─main
│ │ ├─java
│ │ │ └─com
│ │ │ └─hjwzyy
│ │ │ ├─contorllers
│ │ │ └─pojo
│ │ └─resources
│ │ ├─static
│ │ └─templates
| └─Dockerfile
| └─pom.xml
├─microservice-simple-provider-user
│ ├─src
│ │ └─main
│ │ ├─java
│ │ │ └─com
│ │ │ └─hjwzyy
│ │ │ ├─contorllers
│ │ │ ├─dao
│ │ │ └─pojo
│ │ └─resources
| └─Dockerfile
| └─pom.xml
├─ docker-compose.yml
├─ pom.xml

Dockerfile

这三个微服务的Dockerfile文件如何编写可以参考前面的博客:使用Maven构建微服务的Docker镜像 这里不再赘述。

docker-compose.yml

docker-compose.yml 文件的编写是关键。

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
version: '2'			# docker-compose 版本
services:
eureka: # 服务名
build:
context: ./microservice-discovery-eureka # Dockerfile 文件所在路径
dockerfile: Dockerfile # Dockerfile 文件名
args:
JAR_FILE: target/microservice-discovery-eureka-0.0.1-SNAPSHOT.jar # 构建参数传递
ports: # 开放端口
- "8761:8761"
microservice-simple-provider-user:
build:
context: ./microservice-simple-provider-user
dockerfile: Dockerfile
args:
JAR_FILE: target/microservice-simple-provider-user-0.0.1-SNAPSHOT.jar
ports:
- "8010:8010"
microservice-simple-consumer-movie:
build:
context: ./microservice-simple-consumer-movie
dockerfile: Dockerfile
args:
JAR_FILE: target/microservice-simple-consumer-movie-0.0.1-SNAPSHOT.jar
ports:
- "8011:8011"
depends_on: # 依赖
- microservice-simple-provider-user

以上是使用最简单的方式进行配置。

build : 使用 build 并指定Dockerfile ,docker-compose 会根据Dockerfile 构建镜像。这里使用了args 传入了Dockerfile 构建镜像时需要的参数,前面通过 maven 构建镜像时,这个参数是从pom文件中传入的。这里的构建不通过 maven ,因此需要单独在docker-compose.yml 中传入args,否则会由于缺少参数而构建镜像失败。

depends_on : 表示这个服务依赖于某个服务,如microservice-simple-consumer-movie 是依赖 microservice-simple-provider-user 的,provider 启动了,consumer 才能访问到数据。因此如果配置了依赖的服务,docker-compose 会先启动被依赖的服务。

启动

上面的步骤做完之后,就可以启动Docker-compse了。只需要简单的一条命令:

1
docker-compose up

docker-compose 会根据docker-compose.yml 配置的内容进行镜像的构建并启动。

docker-compose 配置

Docker-compose 的具体用法 及 yml 文件的具体配置可以参考 : https://docker_practice.gitee.io/compose/compose_file.html