Docker 1.13 编排能力进化

经过了近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 驱动,请参见 #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模板中一些声明比如 exposelinks 会被忽略。注意:不能再使用 link 定义的网络别名来进行容器互联,可以使用服务名连接。

另外, volumes_from 不再支持,只能使用命名数据卷来实现容器数据的持久化和共享;

v3 中引入了 deploy 指令,可对Swarm mode中服务部署的进行细粒度控制,包括

  • resources:定义  cpu_sharescpu_quotacpusetmem_limitmemswap_limit 等容器资源控制。(v1/v2中相应指令不再支持)
  • mode:支持 globalreplicated (缺省) 模式的服务;
  • 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 updocker-compose run 来部署v3模板时,模板中的 deploy 指令将被忽略

Docker CLI只支持v3模板,但是不支持模板中的 build 指令,只允许构建好的镜像来启动服务的容器。

总结

本文介绍了Docker 1.13引入的Docker Compose v3 规范和操作方式,也对比了不同版本之间的差异,帮助用户实现应用的迁移。

随着Docker Swarm mode的逐渐成熟,阿里云容器服务也在积极开发对其的全面支持和与阿里云产品的对接,相关功能将会在不久推出,为用户在云中提供服务化的容器应用架构。

想了解更多容器服务内容,请访问 https://www.aliyun.com/product/containerservice

时间: 2024-08-08 02:12:29

Docker 1.13 编排能力进化的相关文章

Docker 1.13 新特性 —— Docker服务编排相关

我们都知道在去年Docker轰动容器社区的在Docker Engine中集成了编排能力,并随着1.12的Docker版本发布,但是那个版本的编排还有很多的不足,比如: 不兼容传统的Docker Compose格式,从Compose迁移到服务复杂. 不支持复杂的服务发布方式和回滚等 而在近期发布的1.13的版本中,Docker对Docker Engine内置的编排能力做了很多的更新,我们下面看一下Docker Engine 1.13中内置的编排能力有哪些更新: 支持Compose/(docker

DockerCon 2016 深度解读:在阿里云上体验Docker 1.12内置的编排能力

昨天才从DockerCon大会归来,阿里云容器服务团队将为大家奉献一系列深入学习的文章来帮助大家了解Docker 1.12的最新动态. 第一部分:在阿里云上体验Docker 1.12内置的编排能力 (本文) 第二部分:在阿里云上体验Docker 1.12的路由能力和容器应用分发部署 在DockerCon第一天的Keynote里面,Docker CTO Solomon Hykes宣布Docker将提供内置的编排(Orchestration)能力,从而能使得Docker Engine原生支持集群管理

Docker 1.13 新特性 —— Docker系统相关

Docker随着1.13版本的发布,Docker对Daemon的API和命令行做了一系列的改造,除了对容器,镜像等命令做了二级的命令(containers,images)的改造完,还增加了很多的系统或集群的管理的接口和命令,包含system,plugin,secret,分别用于管理Docker Daemon的系统状态,Docker插件的管理,以及集群中的敏感信息的管理. docker system 管理Docker的命令,其中包括 docker system df 显示docker 磁盘使用情况

Docker 1.13 新特性 —— 网络相关

Docker 1.13 新特性 解决 GFW 影响 Docker 安装问题 目前官方的 apt/yum 源使用的是 AWS 的服务,并且为了确保安全使用了 HTTPS.目前有几个云服务商已经建立自己镜像源站,包括DaoCloud.阿里云.Azura 等等,并且在官方脚本的基础之上做了一定的修改来进行安装. 现在这个发生改变了,官方的 https://get.docker.com 将支持 –mirror 参数,你可以用这个参数指定国内镜像源,目前支持微软的 Azure 云,(或阿里云?).使用方法

Docker 1.13.0 详细更新日志

本文讲的是Docker 1.13.0 详细更新日志[编者的话]Docker发布1.13.0版本,此次版本更新内容较多,以下为该版本具体的变更. 构建 添加在构建时可以指定镜像用作高速缓存源的功能. 这些镜像不需要有本地父链还可以从其他registries拉取 #26839 (试验功能)添加选项用以在成功构建之后,将镜像层级压缩到FROM镜像 #22641 修复Dockerfile解析空行后的逸出 #24725 在docker build时添加步数 #24978 在镜像构建时添加支持压缩构建 #2

【转载】详解Docker 最低特权编排原则,安全与效率并行!(一)

写在前面 Docker 平台和容器已经逐渐成为打包.部署和管理应用程序的标准.为了让容器在集群中于多节点间协调运行,这就需要一个关键的功能:容器编排(container orchestrator).本主题将分两篇为大家详细讲解这一重要功能.下篇<详解Docker 最低特权编排原则,安全与效率并行!(二)>链接为:https://yq.aliyun.com/articles/228215 编排功能 编排功能(Orchestrators)负责关键的集群和调度任务,例如: 管理容器调度和资源分配 支

Docker 1.13 管理命令

本文讲的是Docker 1.13 管理命令[编者的话]Docker1.13.0版本添加了新的管理命令. 1.13版本的主要特点: 使用Compose文件部署Swarm模式服务 改进命令行向后兼容 整理命令 命令行调整 改进Docker的监控与构建 Docker命令行的问题 Docker 1.12命令行大摡有40个顶级命令.虽然这些命令处理得很好但存在一些问题: 命令列表没有任何组织.对新手来说很难入门以及学习这些命令.(#8756) 有些命令,例如docker inspect也没有提供足够的上下

Docker 从13.0 升级到 14.1后,无法加载原来的容器

问题描述 Docker从13.0升级到14.1后,无法加载原来的容器.[root@localhost~]#dockerimagesREPOSITORYTAGIMAGEIDCREATEDVIRTUALSIZEgpdbgpmaster0b69fa63c7a43monthsago905.3MBcentosgpmaster7ac20e7e8d014monthsago478.1MBcentoscentos668edf809afe74monthsago212.7MBcentoscentos787e5b6b3

如何通过Docker 进行容器编排

或许最佳方式是将它们看成饲养宠物与饲养牛.人们会想许多额外措施让他们的宠物活着并保持健康,这与管理员想尽办法认真照看高端服务器一样.但是在农场里,死牛只是被视为生意成本中的一部分,在当今的云世界中也是一样,应用被设计可以容错,一台服务器发生故障并没有什么大不了的. 现代应用编排工具的一个作用是监视虚拟服务器和/或容器情况,确保它们正在正常运行中.当一台服务器出现故障,它们会迅速实例化一台新虚拟机,甚至是一台新容器.整个过程不需要系统管事员介入,因为整个程序是自动化运行的.我们甚至不知道是哪台服务