使用 Docker Compose 编排 Spring Cloud 分布式应用。
说到容器编排,目前很火的 Kubernetes 就是一个自动化容器编排工具,但 Kubernetes 是一个重量级选手,部署比较复杂,对于简单的分布式应用,可以使用 Docker Compose 做轻量级的容器编排,实现容器间的服务注册发现和弹性伸缩。
Spring Cloud 分布式应用
这里用 Spring Cloud 开发一个简单的分布式应用,该应用包含几个简单的微服务:Eureka 做服务注册发现,Feign 服务调用,Zuul 微服务网关,Ribbon 负载均衡,Hystrix 服务降级 / 隔离。
把微服务放在 Docker 容器内,用 compose 进行容器自动化构建和部署,实现基本的注册中心、服务调用、路由和监控。
Docker compose 容器编排
Docker compose 是一个容器管理工具,可以很方便地构建和管理多容器应用。
构建运行容器
在 docker-compose.yml 中配置容器编排规则:
1 | version: "3" |
为了加快构建速度,需要先编译出 jar 文件,再统一构建和运行:
1 | # 编译SpringBoot |
Docker 容器内是一个封闭环境,容器内服务间可通过 Docker compose 中的服务名直接互联。
注册中心
Eureka 注册中心服务映射到容器外 8000 端口,打开注册中心可以看到服务都已启动:

API 网关
Zuul 网关映射到容器外 80 端口,通过 Zuul 可以访问到容器内的服务。
1 | # 停止所有微服务 |
服务扩容
微服务架构中,我们经常需要对服务进行扩容缩容,docker-compose scale 可以指定服务启动多少个实例,方便实现系统的弹性伸缩。
比如要启动 3 个 provider 和两个 gateway 实例,执行一条命令:
1 | docker-compose scale provider=3 gateway=2 |
执行完成后打开注册中心,可以看到已经启动了 3 个 provider 和两个 gateway 实例:

清理中间镜像
构建镜像后,如果之前有同名镜像,会出现一些标签为空的镜像:
1 | $ docker images |
可以通过过滤器查看标签为空的镜像:
1 | $ docker images -f "dangling=true" |
所以清理这些中间镜像就很简单了,取出这些标签为空的镜像 ID,就可以批量删除:
1 | docker rmi $(docker images -f "dangling=true" -q) |
再用 docker images 查看就很整洁了。


