容器技术加速应用云化
使用Docker的开发者都知道:在日常的运维开发过程中,开发人员和运维人员最大的冲突在于版本的不一致和应用程序的隔离问题。比如说,由于企业内存在开发、测试、预发、生产等N个环境,并且不同应用的开发语言可能不同。这就很容易导致同一个应用可能会由环境差异出现各种问题或者是在同一环境里,不同的应用之间产生冲突。
图一 容器技术加速应用云化
Docker的出现很好地解决了应用的隔离和一致性交付的问题。Docker本身的含义包括两类:第一类是打包格式;第二类是一种运行方式。在主机上安装Docker之后,通过将应用打包成镜像,实现各类环境中的无差别运行,同时镜像之间相互隔离。
既然Docker具有如此之大的优势,那么我们究竟要用Docker完成什么工作呢?
图二 Docker使用情况的调研结果
上图显示的是国外的开发者针对Docker的使用情况所做的调研结果。可以清楚地看到,DevOps的接受程度越来越高,并且有统计显示,80%的DevOps会基于容器技术来做。在微服务中,Docker的隔离运行环境对于服务的管理起到了很大的帮助; 此外,Docker还可以满足云端水平扩展、恢复等动态管理应用的需求。
图三 在生产环境中使用Docker的挑战
那企业是否可以在生产环境中自行搭建一套完整的Docker系统呢?答案是可以。但是,在生产环境中使用Docker技术时,不仅仅是在所有的机器上装上Docker引擎这么简单。首先需要创建和管理集群;其次是安全、网络、存储等基础配置;还需要做资源的调度和编排。上述所有步骤均完成后,才形成了一套可用的容器环境。
图四 阿里云容器服务
容器技术移植到云端后又称为Container as a Service (CaaS)。类似于亚马逊的AWS或者是微软的Azure, 阿里云容器服务的本质上也是CaaS。在阿里云容器服务中首先会自动创建集群以及管理节点,使用者可以省去手工开通ECS 和网络配置的工作;同时,所有的集群管理以及安全配置都在阿里云容器服务中自动完成,无需人工介入;另外阿里云容器服务还提供了主子账号控制功能,使得企业级容器服务成为可能。
网络方面,缺省情况下,容器之间跨主机无法互通。使用者可以选择使用Docker提供的经典的Overlap网络,但需要付出巨大的性能下降的代价;或者是选择其他原生的网络工具。阿里云容器服务提供了两套网络支持:一套是基于经典网络的Overlay Network;另一套是重点推荐的阿里云VPC服务。VPC网络可以实现数据传输带宽0损耗。
在调度、编排等功能上阿里云容器服务也做了很多工作,例如容器可以挂靠在第三方的存储之上。
阿里云容器服务除了将底层的集群和节点部署在容器之外,还另外增加了两个概念。企业在日常开发中面临更多的是应用本身,阿里云容器服务将应用部署在容器中,应用中又包括多个服务,每个服务可以理解为同一镜像所生成的多个容器实例。对于开发者之前使用Docker开发的应用可以无缝迁移到阿里云容器服务中。阿里云容器镜像仓库不仅支持Docker官方全部的经典镜像,同时还提供了阿里云Docker Hub镜像。
阿里云容器部署步骤
图五 阿里云容器部署的具体步骤
经过上述的介绍,开发者难免会有疑问:使用容器部署一个应用十分复杂吗?
答案并非如此。相反地,只需简单三步,就可以实现Docker应用的上线。具体操作步骤包括三步:第一步,如果尚未部署集群,开发者首先需要一键创建集群,阿里云容器服务自动完成ECS和网络的配置;第二步,撰写部署文件,然后将该文件上传到容器控制台中;第三步,采用一键部署,即可完成应用的容器部署。其中最为关键的步骤是撰写部署文件,该文件必须是标准的Docker Compose文件。
容器应用场景
介绍完容器部署应用过程后,下面来具体看下采用容器服务的具体场景。
应用云化
图六 应用云化案例
应用云化更多的是应用容器化的过程。阿里云曾经遇到过这样一个客户,该客户是海外一个规模较大的开发商,他们所有的应用都是运行在云上的虚机镜像,同时这些应用是由多种语言开发而成,并且通过自动化运维脚本在云上完成运维工作。
当将这一套配置全部迁移到阿里云时,所遇到的最大的麻烦就是重写自动化运维脚本。该企业采用的方案是将虚机镜像直接转换为容器镜像(大部分情况下转换步骤都是非常直接的),之后采用Docker compose描述镜像之间的关系(弃用自动化运维脚本)。
DevOps
图七 通过Docker实现软件交付
应用部署在容器之后,能够完成什么样的工作呢?绝大多数开发者会用来实现DevOps。
DevOps本身并不是一个框架,它是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障部门之间的沟通、协作与整合。
容器化的DevOps实现的核心在于通过容器镜像技术实现软件交付,也就是开发人员所编写的任何代码变更,放到代码仓库以后会有一个自动的构建环境将代码护理的代码下载下来构建成一个Docker镜像。在系统集成测试、用户接受测试再到生产环境,所有的环境的变更的第一步都是从镜像仓库下拉最新的一个镜像版本。这就解决了开发和运维人员因沟通差错导致各种问题。也就是说,通过容器镜像来实现软件交付,保障了一次构建、随处运行。
因为容器服务并不直接提供DevOps,在阿里云容器服务上,提供了一套完整的模板应用,它包括一系列容器化 Jenkins Server以及一系列根据不同语言定制的 Jenkins Worker。比如现有Python和Ruby应用,可以通过 Jenkins Master、Python和Ruby的Worker镜像,结合上文提到的部署文件一键部署,实现整个 Jenkins的DevOps环境成功搭建,整个过程约在三分钟内即可完成。
SaaS应用
下面来具体看一个新闻媒体行业SaaS应用案例:
图八 新闻媒体行业SaaS应用案例
该企业主要业务是为客户提供SaaS服务,每当有新客户时,该企业都面临着下列问题:
- 为每个客户提供定制化的服务,如何交付是个大麻烦:
- 每个客户都需要一个二级域名,手工配置太容易出错;
- 需要一个配置变更管理,手工更改定制应用都太混乱;
- 从代码到交付,搭建一个DevOps环境很必要,但也很复杂。
该企业通过使用阿里云容器服务提供的DevOps环境之后,迭代的速度非常快,基本上可以做到几分钟就把所有的应用全部升级一遍。不仅为企业节省了大量的时间成本,同时也杜绝了由手工配置变更导致的人工差错。
Spring Cloud支持
图九 Spring Cloud支持
有的企业可能早已采用某种语言的框架,如Java框架。在Java中存在一种非常好的微服务框架--分布式计算框架(Spring Cloud),该框架封装了如配置管理、服务发现、断路器、智能路由、一次性 Token、全局锁、决策竞选等开源组件,十分易用。
那Spring Cloud是否可以在容器上运行呢?答案同样是肯定的。在上图所示的示例中,蓝色部分表示基于Spring Cloud的应用,黄色部分代表着阿里云的产品线,其中包含一些高可用区的配置。通过部署描述文件就可以实现一键创建跨可用区集群,实现在Docker上运行Spring Cloud。
总结
阿里云容器服务是十分标准的,大大降低企业应用上云的成本;同时针对阿里云优化集成,现有阿里云客户可以通过容器服务实现一站式应用开发;第三是全应用生命周期管理。
此外阿里云容器服务提供了包括DevOps、混合云、微服务互联网应用在内的一系列服务SaaS场景。
更多关于阿里云容器服务的相关资料:
本文根据阿里云技术专家净山楚煦在6月29日举办的2016云栖大会· 成都峰会上《基于Docker的SAAS解决方案》的演讲整理而成。