经过了近6个月的磨砺,Docker 1.13在2017年1月发布,它标志着 Docker 内置编排能力的进一步成熟。本文将介绍Docker在编排方面的新进展。
简介
去年6月,Docker宣布在1.12版的引擎中内置编排能力,也就是 Swarm Mode,在容器之上引入了服务(service
)的概念,也实验性的推出了应用栈(stack
)来支持多服务应用的部署管理。但是 Docker 1.12 版本,服务的开发和操作缺乏类似Docker Compose
工具的支持,而且由于Docker Compose v1/v2是面向容器编排设计,和Swarm Mode中的概念上有很多不同。只可以用 docker-compose bundle
命令将已有 docker-compose.yml
转换为 Distributed Application Bundle
才能在Swarm mode中部署,非常不便,而且更为严重的是很多功能不支持,导致很多现有编排模板无法直接使用。
在2017年1月发布的 Docker 1.13版本中,Swarm mode迅速成熟,相应的工具支持也进一步完善。 Docker Compose v3 规范,已经全面支持 Swarm mode 概念。而且从 1.13 开始,Docker 命令行工具支持直接使用 v3 版本的 docker-compose.yml
文件来进行应用栈(stack
)部署管理,这大大简化了容器编排使用的复杂性。
操作方式和功能简要对比
Docker Compose v1/v2 | Docker 1.13 | |
---|---|---|
启动服务 | docker-compose up -d |
docker stack deploy --compose-file=docker-compose.yml |
伸缩服务 | docker-compose scale xxx=n |
docker service scale xxx=n |
停止服务 | docker-compose down |
docker stack rm |
跨宿主机 | 否 | 是 |
准备实验
单机环境
- 首先你需要安装 Docker 1.13 或以上版本的Docker for Windows/Mac/Linux
- 然后执行
docker swarm init
命令开启 Docker Swarm 模式
Vagrant多机测试环境
阿里云环境
- 使用阿里云 Docker Machine 的 ECS 驱动,请参见 https://yq.aliyun.com/articles/55973#2 文中内容
Wordpress示例
下面的 wordpress.yml
定义了包含两个服务的Wordpress应用
-
web
服务:部署3个实例的wordpress:4
容器 -
mysql
服务:部署1个实例的mysql:5.7
容器
version: '3'
services:
web:
image: wordpress:4
environment:
- WORDPRESS_DB_PASSWORD=password
- WORDPRESS_AUTH_KEY=changeme
- WORDPRESS_SECURE_AUTH_KEY=changeme
- WORDPRESS_LOGGED_IN_KEY=changeme
- WORDPRESS_NONCE_KEY=changeme
- WORDPRESS_AUTH_SALT=changeme
- WORDPRESS_SECURE_AUTH_SALT=changeme
- WORDPRESS_LOGGED_IN_SALT=changeme
- WORDPRESS_NONCE_SALT=changeme
- WORDPRESS_NONCE_AA=changeme
ports:
- 80:80
depends_on:
- mysql
deploy:
replicas: 3
restart_policy:
condition: on-failure
mysql:
image: mysql:5.7
environment:
- MYSQL_ROOT_PASSWORD=password
deploy:
restart_policy:
condition: on-failure
使用如下命令进行操作
yili@yili-mbp:~$ docker stack deploy -c wordpress.yml wordpress
Creating network wordpress_default
Creating service wordpress_web
Creating service wordpress_mysql
yili@yili-mbp:~$ docker stack ls
NAME SERVICES
wordpress 2
yili@yili-mbp:~$ docker stack services wordpress
ID NAME MODE REPLICAS IMAGE
fc7xhyqdu2b8 wordpress_mysql replicated 1/1 mysql:5.7
j9a61eaaxi8c wordpress_web replicated 3/3 wordpress:4
然后就可以通过浏览器来访问 Wordpress 应用了
Redis 集群示例
下面的 redis.yml
定义了包含三个服务的Redis集群应用
-
redis-master
服务:部署1个实例的redis:3
容器作为初始的Redis master -
redis-slave
服务:部署2个实例的redis:3
容器作为Redis slave -
sentinel
服务:部署3个实例的redis-sentinel:5.7
容器作为集群的sentinel
version: "3"
services:
redis-master:
image: redis:3
deploy:
restart_policy:
condition: on-failure
redis-slave:
image: redis:3
command: redis-server --slaveof redis-master 6379
deploy:
replicas: 2
restart_policy:
condition: on-failure
sentinel:
image: registry.aliyuncs.com/acs-sample/redis-sentinel:3
environment:
- SENTINEL_DOWN_AFTER=5000
- SENTINEL_FAILOVER=5000
deploy:
replicas: 3
restart_policy:
condition: on-failure
使用如下命令进行操作
yili@yili-mbp:~$ docker stack deploy -c redis.yml redis
Creating network redis_default
Creating service redis_sentinel
Creating service redis_redis-master
Creating service redis_redis-slave
yili@yili-mbp:~$ docker stack services redis
ID NAME MODE REPLICAS IMAGE
kbg7t2fs625f redis_redis-master replicated 1/1 redis:3
num1qjudt947 redis_redis-slave replicated 2/2 redis:3
xv24uy1cqu7u redis_sentinel replicated 3/3 registry.aliyuncs.com/acs-sample/redis-sentinel:3
注:关于利用 Docker 方式搭建 Redis 集群,请参考云栖文章
Docker Compose v3 规范简析
Docker Compose v3
和 v2
模板文件都采用yaml格式,但是语法上存在一定差距
首先,使用version: "3"
或 version: "3.1"
(Docker 1.13.1) 作为版本声明
其次,由于 Swarm mode 中网络的特殊性,Compose模板中一些声明比如 expose
和 links
会被忽略。注意:不能再使用 link 定义的网络别名来进行容器互联,可以使用服务名连接。
另外, volumes_from
不再支持,只能使用命名数据卷来实现容器数据的持久化和共享;
v3 中引入了 deploy
指令,可对Swarm mode中服务部署的进行细粒度控制,包括
-
resources
:定义cpu_shares
,cpu_quota
,cpuset
,mem_limit
,memswap_limit
等容器资源控制。(v1/v2中相应指令不再支持) -
mode
:支持global
和replicated
(缺省) 模式的服务; -
replicas
:定义replicated
模式的服务的复本数量 -
placement
:定义服务容器的部署放置约束条件 -
update_config
:定义服务的更新方式 -
restart_policy
:定义服务的重启条件 (v1/v2中restart
指令不再支持) -
service
:定义服务的标签
Docker 命令行和 Docker Compose 的不同
虽然 Docker CLI 已经提供了对Docker Compose v3模板的支持。但是 Docker Compose 依然可以作为一个开发工具独立使用,并同时继续支持v1/v2/v2.1等版本已有编排模板。但是当利用 docker-compose up
或 docker-compose run
来部署v3模板时,模板中的 deploy
指令将被忽略
Docker CLI只支持v3模板,但是不支持模板中的 build
指令,只允许构建好的镜像来启动服务的容器。
总结
本文介绍了Docker 1.13引入的Docker Compose v3 规范和操作方式,也对比了不同版本之间的差异,帮助用户实现应用的迁移。
随着Docker Swarm mode的逐渐成熟,阿里云容器服务也在积极开发对其的全面支持和与阿里云产品的对接,相关功能将会在不久推出,为用户在云中提供服务化的容器应用架构。
想了解更多容器服务内容,请访问 https://www.aliyun.com/product/containerservice