【IT168 云计算】2015SACC—中国系统架构师大会第三天,在经历了前两日阴雨连绵、地铁“宕机”等小插曲之后,在这个周六的早上,架构师们仍旧没有放弃追求技术的热情,各个专场的会场内,坐满了前来听会学习的嘉宾。在新云南皇冠酒店的二楼,“容器技术进展”专场,精彩仍旧继续,场面同样火爆 。来自DaoCloud的工程师&初创团队成员孙宏亮,带来了主题为《微服务架构下应用docker化实践》的分享,解析了开发运维环节,容器怎样为IT带来便利,并介绍了其自身Docker化实践的相关心得。
什么是微服务架构?
当下,越来越多的新业务需求被不断提出,企业的开发运维团队面临着巨大的挑战。如何保证新业务及时上线?如何保持新产品的快速迭代?尤其是互联网行业,在保证应用稳定运行的情况下,仍旧要不断提高用户体验,因为一旦体验不好,带来的用户大量流失,是企业业务不可承受之痛。于是,开发团队不断尝试,寻求更好的研发流程,尽可能的缩短产品研发周期,加速产品迭代。最终在业务压力的驱使下,微服务架构理念逐步走进开发人员的视野。
微服务架构不算创新理念,有业内专家曾表示,早前,企业级开发团队的SOA就是微服务架构的前身。简单来说,微服务架构其实是一种软件架构的模式,在这种理念的指导下,传统应用在开发过程中,被解耦成许多微小的应用,变成小而专的应用。“把系统拆分成小的系统之后,就简化了开发的流程,缩短了开发周期,提升了运维的效率。”孙宏亮表示。
“扩展立方模型”是指微服务架构的在拆分时包括三个维度,如上图所示,X轴表示水平副本,通过副本进行扩展;y轴表示功能解耦,通过分解功能,在不同模块之间的扩展;Z轴是数据分区,一个系统会有一些业务和数据,微服务架构可以通过数据分区的形式进行扩展。
什么是Docker?
“Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。 容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app)。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架包括系统。”这是百度百科的官方解释。
孙宏亮将其归纳为,docker作为容器技术,可以有效的分配和管理物理资源,包括CPU、内存、硬盘等。“开发人员可以在物理机上部署一批容器,物理机与物理机,物理机与虚拟机,虚拟机与虚拟机之间都是相互资源隔离的。这种松耦合的架构很好的帮助企业实现微服务架构。”孙宏亮解释。“我认为Docker包含两大核心技术:一方面是容器技术,可以进行物理资源的有效分配与管理,并实现资源隔离,从这个角度看来,容器跟虚拟机的理念比较类似。另一方面是镜像技术。打破了‘代码即应用’的观念,从系统环境开始,自底至上打包应用的镜像技术。Docker解决了软件的环境一致性问题,使得软件的分发与交付异常便捷。”
通过Docker技术,使得开发人员(Dev),可以开发简单有效的模块,将精力专注于主营业务,不再浪费主要精力在异常复杂的应用开发。针对运维人员(Ops),通过Docker很好的管理硬件设施,很好的做到资源隔离,得到更好地监控和反馈。“我一直觉得,运维人员不应该专注应用执行逻辑,不应该将精力放在应用的执行上,Docker的出现充分帮助运维人员减负。”
Docker化实践
据笔者了解,目前,大部分企业的开发者对于容器的概念与价值已经不陌生,但是苦于没有好的方式方法,将容器技术很好的应用到自己的开发运维流程中,孙宏亮作为国内首批实践Docker技术的工程师,结合自身的经验,为现场的嘉宾带来了他认为的,使用Docker的非常好的实践。
他认为,Docker实践的本质是进程隔离与资源管理。具体来说,分为三个步骤,首先,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等;第二个方面是Docker镜像,在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行 Docker镜像时,会真正开始提供服务;第三点是Docker容器,容器是直接提供服务的,关于容器的“单进程模式”,需要注意一点,容器里面有一个非常重要的进程——init进程,它负责管理容器内部的所有进程,一旦该进程出现故障,系统会负责给容器内所有其他进程发送一个kill信号,随即容器退出运行。在实践时需要保证init进程不能经常出问题,当然也可以通过Docker层面,设置一些restart policy等策略,来保证容器能够成功恢复,不过如果容器内部已经有状态时,同样也会出现一些问题。“这样的交付形式,依托Docker妙计部署,功能解耦等优势,大大缓解了运维人员的工作压力。”
最后,孙宏亮介绍了遗留系统如何无差异地Docker化,并介绍了传统应用Docker化的两个关键——日志管理和配置管理。事实上,Docker里面也有一个init进程,Docker init进程跟宿主机上的init进程有很大的差异,Docker的init进程是完成资源的初始化,然后把决策完全交给用户指定的进程。另外,传统模式下,很多应用很多组件都会调用服务进程来完成特殊的需求,比如,如果说某一个组件是需要完成日志的,会需要syslog的服务来完成这些目标,可不可以把这些放到容器中呢?如果把它们放到容器中,容器的逻辑就变得比较复杂。
▲Docker化实践——syslog日志管理进程的Docker化
孙宏亮表示,目前其所在的企业DaoCloud,因为是创业公司,没有旧有的系统架构,其自身的平台也是基于DaoCloud研发和运维的,用孙宏亮的话说,我们DaoCloud基于DaoCloud是基于开发DaoCloud。“现在我们的研发过程发布出去的所有组件都是镜像,Docker的轻量便捷,使得我们无论从业务研发,还是产品输出的速度与质量优势都十分明显。”