Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。
通过之前的介绍,我们知道使用一个 Dockerfile 模板文件,可以让用户很方便的定义一个单独的应用容器。然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。
Compose 恰好满足了这样的需求。它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
Compose 中有两个重要的概念:
Compose 的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。
使用微服务架构的系统一般包含若干个微服务,每个微服务一般部署多个实例。如果每个服务都要手动启停,那么效率低,维护量大。
docker-compose.yml格式为:
version: "3"
services:
webapp:
image: examples/web
ports:
- "80:80"
volumes:
- "/data"
注意每个服务都必须通过 image 指令指定镜像或 build 指令(需要 Dockerfile)等来自动构建生成镜像。
docker-compose 命令的基本的使用格式是
docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
命令选项:
-f, --file FILE 指定使用的 Compose 模板文件,默认为 docker-compose.yml,可以多次指定。-p, --project-name NAME 指定项目名称,默认将使用所在目录名称作为项目名。--x-networking 使用 Docker 的可拔插网络后端特性--x-network-driver DRIVER 指定网络后端的驱动,默认为 bridge--verbose 输出更多调试信息。-v, --version 打印版本并退出。
编排时用到的微服务项目:
discovery :注册中心server:服务提供者client:服务消费者zuul:网关
1、由于Docker 默认的网络模式是bridge,各个容器的IP都不同。因此在Eureka Server配置一个主机名(discovery),让各个微服务使用主机名访问Eureka Server:
eureka:
instance:
hostname: discovery
然后将如下配置
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
替换为:
eureka:
client:
serviceUrl:
defaultZone: http://discovery:8761/eureka/
2、编写构建镜像脚本
bash脚本的用途是分别执行几个module下的Dockerfile文件,分别打成镜像,不用一个个手工执行,文件如下:
buildDockerImage.sh:
#!/usr/bin/env bash
set -eo pipefail
modules=( discovery server client zuul )
for module in "${modules[@]}"; do
docker build -t "microservice/${module}:latest" ${module}
done
tree查看microservice文件夹下模块目录:
$ tree
.
├── buildDockerImage.sh
├── client
│ ├── client-0.0.1-SNAPSHOT.jar
│ └── Dockerfile
├── discovery
│ ├── Dockerfile
│ └── eureka-server-0.0.1-SNAPSHOT.jar
├── docker-compose.yml
├── server
│ ├── Dockerfile
│ └── server-0.0.1-SNAPSHOT.jar
└── zuul
├── Dockerfile
└── zuul-0.0.1-SNAPSHOT.jar
modules为各个模块目录,模块目录下存放该模块的jar包和Dockerfile文件。
执行sh buildDockerImage.sh命令,执行完,使用docker images 查看镜像。
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
microservice/zuul latest d0fcb94e203e 30 seconds ago 204MB
microservice/client latest a3ff8e192ee6 33 seconds ago 200MB
microservice/server latest 8f04580f6063 35 seconds ago 200MB
microservice/discovery latest d8b9347a8229 38 seconds ago 204MB
frolvlad/alpine-oraclejdk8 slim 3ee5e1ce00fc 9 days ago 164MB
3、编写docker-compose-yml
version: "3"
services:
discovery:
image: microservice/discovery
hostname: discovery
ports:
- "8761:8761"
server:
image: microservice/server
ports:
- "9000:9000"
client:
image: microservice/client
ports:
- "9001:9001"
zuul:
image: microservice/zuul
ports:
- "9002:9002"
执行以下命令启动项目。
[root@node02 microservice]# docker-compose up -d
Creating microservice_discovery_1 ...
Creating microservice_discovery_1 ... done
Creating microservice_client_1 ...
Creating microservice_server_1 ...
Creating microservice_client_1
Creating microservice_client_1 ... done
Creating microservice_zuul_1 ...
Creating microservice_zuul_1 ... done
查看镜像:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ef16f3cccfdb microservice/zuul "java -Djava.securit…" 38 minutes ago Up 38 minutes 0.0.0.0:9002->9002/tcp microservice_zuul_1
657b28a5f17b microservice/server "java -Djava.securit…" 38 minutes ago Up 38 minutes 0.0.0.0:9000->9000/tcp microservice_server_1
e048e4d69f49 microservice/client "java -Djava.securit…" 38 minutes ago Up 38 minutes 0.0.0.0:9001->9001/tcp microservice_client_1
66f9c53ec2b5 microservice/discovery "java -Djava.securit…" 38 minutes ago Up 38 minutes 0.0.0.0:8761->8761/tcp microservice_discovery_1
访问注册中心:
访问网关服务
zuul->client->server
http://192.168.124.131:9002/api-a/getUser?name=gmghi gmg,i am from
1、将所有的服务的注册中心改为
eureka:
client:
serviceUrl:
defaultZone : http://peer1:8761/eureka/,http://peer2:8762/eureka/
2、docker-compose-yml修改为
version: "3"
services:
peer1:
image: microservice/discovery
ports:
- "8761:8761"
environment:
- spring.profiles.active=peer1
peer2:
image: microservice/discovery
hostname: peer2
ports:
- "8762:8762"
environment:
- spring.profiles.active=peer2
server:
image: microservice/server
ports:
- "9000:9000"
client:
image: microservice/client
ports:
- "9001:9001"
zuul:
image: microservice/zuul
ports:
- "9002:9002"
3、构建镜像
执行sh buildDockerImage.sh命令构建镜像。
4、创建容器
执行 docker-compose up -d 查看镜像:
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8dfff5cf705f microservice/discovery "java -Djava.securit…" About a minute ago Up About a minute 0.0.0.0:8762->8762/tcp microserviceha_peer2_1
a89594944490 microservice/client "java -Djava.securit…" About a minute ago Up About a minute 0.0.0.0:9001->9001/tcp microserviceha_client_1
29e941b18623 microservice/zuul "java -Djava.securit…" About a minute ago Up About a minute 0.0.0.0:9002->9002/tcp microserviceha_zuul_1
18580a21ab2f microservice/discovery "java -Djava.securit…" About a minute ago Up About a minute 0.0.0.0:8761->8761/tcp microserviceha_peer1_1
1bcaaadac4a4 microservice/server "java -Djava.securit…" About a minute ago Up About a minute 0.0.0.0:9000->9000/tcp microserviceha_server_1
5、查看注册中心: