基于阿里云容器服务的微服务实践 - Part 2. Docker Compose
作者:chszs,未经博主允许不得转载。经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs
二、使用Compose定义微服务
Docker Compose是一个用于定义和运行多容器Docker应用程序的工具,它允许在单个文件中定义多个容器应用以及这些应用所需的各种依赖,然后通过单个命令完成执行。Docker Compose在实际工作中非常有价值,随着Docker Compose的不断完善,有成为取代docker run命令启动Docker容器的趋势。使用Compose,开发者可以使用Compose文件配置应用程序的服务。然后,使用单个命令,从配置中创建和启动所有服务。
Docker Compose非常适用于开发,测试和临时环境,以及CI工作流。它的主要特征如下:
- 单个主机上的多个隔离环境
- 创建容器时保留卷数据
- 仅重新创建已发生变更的容器
- 变量和在环境之间移动组件
Docker Compose使用项目名称来相互隔离环境。开发者可以在多个不同的上下文中使用此项目名称:
- 在开发主机上,创建单个环境的多个副本
- 在CI服务器上,为了使构建不会相互干扰,可以将项目名称设置为唯一的内部版本号
- 在共享主机或开发主机上,可以防止不同的项目使用了相同的服务名所造成的相互干扰
使用Docker Compose基本上有三个步骤:
- 定义应用程序的环境Dockerfile,使得它可以在任何地方复制。
- 定义组成应用程序的服务docker-compose.yml,以便它们可以在一个隔离的环境中一起运行。
- 最后,运行docker-compose up,将启动并运行整个应用程序。
Docker 1.13版引入了v3版的Docker Compose,详见:
https://docs.docker.com/compose/compose-file/#version-3
此版本的改动很少,主要的区别在于引入了deploy属性。Deploy属性允许指定容器的副本、回滚更新、以及重启策略。
本文开发的微服务将会启动一个WildFly应用服务器,WildFly服务器上预部署了一个JavaEE应用,此JavaEE应用可以与Couchbase数据库服务器进行通信,完成应用数据的增删改查等操作。下面先安装Compose。
要安装Compose,步骤如下:
- 安装Docker Toolbox。因为Docker Toolbox包含了Docker引擎和Compose,因此对于Mac系统或Windows系统的用户来说,安装Compose只需一步,下面的步骤忽略。
- 对于Linux用户来说,先安装Docker引擎
-
去Compose的GitHub主页下载发行包,见:https://github.com/docker/compose/releases
$ curl -L
“https://github.com/docker/compose/releases/download/1.10.0/docker-compose-(uname−s)−(uname -m)” -o /usr/local/bin/docker-compose -
为其赋予可执行权限
$ chmod +x /usr/local/bin/docker-compose
-
测试安装是否正确
$ docker-compose –version
docker-compose version: 1.10.0
下面是使用Compose定义的一个例子:
version: '3'
services:
web:
image: chszs/couchbase-javaee:travel
environment:
- COUCHBASE_URI=db
ports:
- 8080:8080
- 9990:9990
depends_on:
- db
db:
image: chszs/couchbase:travel
ports:
- 8091:8091
- 8092:8092
- 8093:8093
- 11210:11210
在上面的Compose文件中,通过db和web属性名定义了两个服务。每一个服务的映像名由image属性进行定义。
映像chszs/couchbase:travel启动Couchbase服务器,并配置它使用Couchbase的REST API,以及载入travel-sample库,这个库是一个大约32KB的JSON文档。
映像chszs/couchbase-javaee:travel启动WildFly应用服务器,并部署应用的war文件。
environment属性定义了应用程序部署到WildFly应用服务器时可以访问的环境变量。COUCHBASE_URI指向数据库服务,这是在应用程序代码中使用。
端口转发则通过ports属性来实现。
在Compose定义文件中的depends_on属性用于确保容器的启动顺序。但是,应用程序级的启动就需要容器内运行的应用程序来确保。在本文的场景中,WildFly应用服务器启动相当快,而数据库的启动则需要数秒钟。这意味着部署在WildFly的JavaEE应用程序在一开始的几秒钟内无法与数据库进行通信。因此depends_on属性就派上用场了。它可以确保在应用程序的初始化过程中,所依赖的微服务已启动,而无需考虑再启动顺序。数据库初始化代码应该执行以下检查:
- 存储分区存在
- Couchbase数据库的查询服务已经可用
- Sample库数据已载入
上面的应用程序可以使用docker-compose up -d命令在单个主机上启动,或者是在Docker引擎的集群下以Swarm模式使用docker stack deploy命令启动它。
想继续阅读文本,请看下一篇《基于阿里云容器服务的微服务实践 - Part 3. 容器微服务实践》