本文主要从Docker的编排技术,Docker在一个大规模生产环境中的使用开始切入,围绕Docker应用的深化,像谷歌,AWS,阿里云都推出了这样的容器服务,分享并分析了新的概念——Container as a Service,着重讲解了微服务支持和DevOps,并谈及了容器服务解决了哪些问题,最后介绍了Docker的最新发展趋势。
直播视频:点此进入
PDF 下载: 点此进入
以下为整理内容:
Docker编排技术
大家都已经了解了Docker是什么样的技术,Docker是标准化的构建、交付、运维手段。但直到今天还有很多人在质疑,Docker只不过是容器技术的一种实现,为什么会这么火呢?
Docker最大的价值不在于技术,而在于它使人们达成了某种共识,以一种标准化的方法来开发、交付和运维软件,使得把我们的应用和应用运行过程中的依赖打成Docker镜像,通过Docker镜像,我们可以在开发、测试、线上等各个阶段来使用,我们也可以在笔记本、测试机或是云上来运行程序。通过这个标准化,催生了一个巨大的生态,让Docker具有巨大的价值。
Docker的核心亮点有以下几个方面:
- 敏捷:秒级应用启动、轻量级隔离、细粒度资源控制、低性能损耗。
- 可移植性: 环境无关的交付、部署方式;可用于软件生命周期中不同运行环境。
- 可控:标准化推动自动化,提高运维效率和规模;隔离性提升应用安全性;版本管理可追溯。
Docker与虚拟化技术
Docker不是虚拟化技术的颠覆者,Docker容器和虚拟化技术是互补、双赢的。Docker是一种轻量级的操作系统虚拟化方案,利用虚拟机提供弹性基础架构,更好的安全隔离,动态热迁移,可以更好的保证业务的安全性和连续性,而利用容器技术也可以简化迁云之路,实现无边界的云计算。
Docker本身巨大的成功是根据几个巨大的趋势结合在一起才凸显了它的价值。Docker重点介绍3个方向,Docker在云计算上扮演着重要的工作,还有(Microservices)微服务架构,企业最关心的是IT部门的效率,最快速度的交付产品、最低成本的试错,才能快速的迭代、快速的演进,微服务架构可以帮助企业走向这步,微服务架构给底层的基础设施和部署带来巨大的挑战,利用Docker可以解决这个问题。DevOps,开发人员和运维人员理解的DevOps是不一样的,Docker可以使二者结合在一起。
容器编排 —— Docker Compose
Docker引擎是把应用包装在一个Docker镜像里,然后启动Docker镜像变成一个容器,但是它带来的帮助是有限的,任何一个复杂的应用不是一个容器就能完成的,一定是一组容器相互协同才能完成一个完整的应用栈。Docker Compose是Docker推出来的一个对多容器的编排技术,简单好用,便于开发。使用Docker Compose,可以一键构建本地开发环境,在团队中可以共享一份配置文件。
Docker Compose面向开发和部署,不支持自动化运维,只是面向单机的一个环境。Docker Compose目前还只是一个开发工具,能够帮助部署一个Docker化的多容器应用,部署后它就置之不理了。
容器集群管理 ——Docker Swarm
Docker Swarm的优点:兼容标准的Docker API,灵活、可插拔的容器调度。
在生产环境中,我们希望有一个集群。从流量的角度,我们希望有更大规模能够部署更多的应用,在高可用的情况下,不可能把应用部署在只有一台节点的机器上。Docker Swarm把一组Docker引擎抽象成一个Docker引擎,以前所有在单机上对一个Docker引擎的工作,都可以透明的变成对一组Docker集群上的节点的操作。在Docker Swarm集群中,有两类节点,一是Docker Swarm Managers,这些Managers负责接收用户的请求,并且根据集群的状态来做一些任务的下发,真正的任务是在Work节点完成的,每个Work上都会安装一个agent,Work会上报到一个分布式的KV里,告诉这个节点的状态是死是活,有了这些信息,Manager就可以做决策。
Docker Swarm也有它的不足,它的抽象级别太低,面向容器、缺少微服务支持。
我们在把容器技术应用到大规模生产环境中时,依然会有众多的挑战。在生产环境中还需要考虑很多,比如,集群怎么管理,怎样更有效的调度来充分利用这些资源,怎样解决在这个集群中容器和容器互相的网络通信,不同应用对存储的需求等等。
Containers as a Service (CaaS 容器服务)
CaaS一方面提供容器化的环境,运行支撑环境来覆盖容器化应用的整个生命周期,从构建到交付到运维,它面对的目标用户不仅是开发者,也包括运维人员。在构建到交付阶段是持续集成和持续测试的能力,交付阶段一定是以容器的方式交付应用,在交付到运行阶段,也是使用容器化的方法进行应用的部署和运维。CaaS另一方面是以服务化的能力来提供Docker的运行支撑环境,对于企业客户来说,用户只需关心容器的应用自身即可,而整个应用支撑的环境是由云平台提供出来的。
传统云计算金字塔中,PAAS层带来的简化性是以牺牲整个对环境控制的灵活性为代价的,导致PAAS平台的市场接受度很低。而Docker和CaaS的出现恰好填补了这个缺口,在PAAS领域进行了重新定位,实现了简洁性和灵活性间的完美平衡。
CaaS的主要服务提供商既有谷歌、亚马逊以及Docker自身,也有国内的阿里云和很多其他的创业公司,每一家的CaaS都有自己的一些特色。
阿里云容器服务概念模型
容器服务上有三个层面的概念:
- 资源层面——集群,节点。
- 内容层面——Compose模板,镜像。
- 应用层面——应用,服务,容器。
集成容器和云服务
- 完全兼容 Docker Compose/Swarm
- 声明的方式支持容器及云服务
- 支持微服务架构
阿里云容器服务
阿里云容器服务为图中中间部分,最底层为容器层,阿里云容器层可以支持不同云环境下的基础设施,包括公共云、专有云以及混合云,利用Docker自身很好的可移植性,可以实现无边界的云计算,除了Docker引擎外,我们更加关注存储和网络的不同需求,所有的支持我们都可以通过声明的方式利用起来,我们也支持第三方的扩展。在容器层之上是调度层,调度层的概念是如何在容器集群上使得容器和下面资源能更好的协作来完成一个应用栈需要的各种各样的能力。调度层之上还需要做更高层的抽象,没有人在乎容器,大家在乎的是自己的应用是怎样构建的,是怎么对外提供服务的,我们就提供了很好的对微服务架构的支持,支持服务的注册发现、弹性伸缩、灰度发布和不间断升级。
有了这样的容器化平台,我们还可以对接现有的中间件服务和阿里云上的其它服务,以及集成CI/CD这样的三方工具,可以完整的支持软件的开发的过程。容器也不该成为企业IT治理的孤岛,它会与现有的IT流程、现有的IT平台的管控进行一个良好的集成。
跨主机容器网络
在云上搭建网络有其自己的特殊性,阿里云的跨主机容器网络有如下几个特性:
- 每个容器在这个网络上都有一个独立IP
- 容器跨宿主机直接通信
- 容器网络可以通过DNS解析容器地址
微服务架构
微服务就是把一个大而全的单体应用拆分成一组解耦的、自治的、协同工作的服务,这些服务通过标准化的借口互相通讯,每一个服务都是由一个团队单独的运维,它可以被独立的部署,每个服务的部署更新不会影响到其它的服务。
微服务在实际操作过程中会遇到种种问题,比如当应用拆分后,从运维一个服务变成运维多个服务,而这些服务又是被动态的分布在分布式环境里的,对这些服务进行管控、访问就变得比以前更加复杂。容器服务提供了两种弹性路由的方案,如下:
弹性Web路由方案1
我们可以为每一个容器服务取一个二级域名,让服务能够通过二级域名的方式进行访问。我们提供了一个分布式路由服务,它会根据发现服务里定义的各种各样的路由规则,去生成相应的HAProxy路由规则,当发生修改的时候能够动态的重新启动HAProxy,让规则生效。路由服务之上对接的是SLB,在SLB上只要绑定一个根域名,下面部署的各种各样的服务就可以通过二级域名的方式动态的接进来。
弹性Web路由方案2
有时候用户希望对SLB端有更灵活的配置,方案2就是利用声明式的机制让不同的容器服务挂载到不同的SLB上,发现服务里记录了整个集群上所有服务对外的路由的信息,Cluster Master会去侦听发现服务上整个路由的变化,并根据这些变化,自动的修改SLB后端的服务器配置。
实现无关的服务发现与负载均衡
只是利用DNS这样的发现机制是不够的,我们通过一种声明化的方法,能够让一个服务访问另外一个服务,和DNS服务发现相比:
- 支持灵活的负载均衡策略
- 避免TTL问题
- 支持健康检查
监控与AutoScaling
- 声明式方式定义弹性伸缩策略。
- 内置云监控集成。
- 提供插件机制支持开源、三方监控集成。
DevOps
DevOps最重要的有两点。一是“在一起”,开发和运维应该是一体化来考虑的过程,开发人员交付的产品必须是运维人员能够部署上线的东西。二是要有快速持续的反馈。
利用容器实现持续集成和交付 Build Once and Deploy Everywhere
Docker可以在一处构建,就可以在各个地方部署。Docker镜像在开发中可以使用,可以在测试中使用,可以进行验证,可以进行上线,一切都是以Docker镜像为交付物的。此外,利用Compose模板,可以开发出部署的资源,标准化一致的在各个环境复用,以便进行持续的集成和部署。通过Docker镜像和Compose模板,可以把一个应用对外界的依赖,以及服务和服务之间的关联,全部变成可追踪的代码,这可以通过非常好的版本管理进行更好的管控,以便快速上线和回滚。
完整的容器化持续交付流程
未来发展趋势
最好的方式来编排Docker就是Docker自身。
Docker engine已经内置编排能力,更新后的Docker将具备以下四点特性:
- Swarm mode
- Cryptographic node identity
- Service API
- Built-in routing mesh
Docker Swarm 模式
Docker Swarm mode是由一组Docker engine构成,每个Docker engine都可能扮演两种角色中的一种,Manager和Worker。在一个集群上可以有多个Manager,多个Manager可以自己通过分布式的同步协议实现一个高可靠的State Store。
服务 Services
新的Docker提供了一个Services API。如果出现节点失败,在这个节点上的容器将会被自动迁移到其他节点之上。Docker Swarm mode采用状态逼近的模式,它定义了服务的期望状态,它会在运行过程中不断检查当前的状态是否和期望的状态保持一致,如果不一致,它就会自动修复。
Routing Mesh
在一个集群中,整个服务容器的部署是根据调度规则去进行动态调度的,任何一个服务的容器可能部署在集群中的任意一个节点上,新Docker提供了Routing Mesh的能力,其特性如下:
- 每个服务一个VIP
- IPVS实现负载均衡
- 动态/手工分配PublishedPort
- 每个worker参与路由
Distributed Application Bundle 与 Stack
一个DAB部署后就会生成一个相应的Stack,一个完整的应用栈。DAB实际是一个JSON文件,用与Docker compose类似的方式描述了一组服务,通过一个DAB就可以一键的通过一个deploy命令来生成一个相应的Docker Stack。