论文部分内容阅读
在第八期“京东技术开放日”上,京东云平台首席架构师刘海锋说,Docker正在重构京东私有云。他认为,虚拟机由于安全性和隔离性较强,更适合公有云;而Docker更加轻量化,灵活性高,软件的部署、管理和发布也便捷,这些特征非常符合京东“弹性计算云”的构建思路——软件定义数据中心和智能化集群调度。
现在,OpenStack 、Docker和JFS(京东自主开发的非结构化数据存储系统)这三大技术系统共同构成了京东“弹性计算云”的核心。据悉,在生产环境上的Docker实例已经超过11000个,大约60%用于在线应用,40%用于缓存;年底,随着MySQL的部署,京东私有云的Docker规模将再翻两番,届时京东大部分应用程序都会通过Docker来发布和管理。
无论是基于Linux的Docker、Solaris Zone和FreeBSD Jail,所有容器技术都为在多应用程序主机上运行的应用程序提供某种隔离机制。也就是说容器技术有多种产品形态,包括微软公司也即将推出基于Windows操作系统的容器。
但是,为什么当下关于容器的讨论除了Linux就是Docker呢?答案在于这个事实:Jail和Zone确实是容器技术的开拓者,但是它们的市场占有率很有限;而谷歌和开发Linux控制组(Linux Control Groups)的开发人员成功地将容器功能添加到Linux内核中后,鉴于Linux几乎遍地开花的态势,Linux 容器立马进入到了每一个企业和政府数据中心。
也就是说,Docker的成功是源于Linux的成功,这就是站在巨人肩膀之上的好处。当前Docker已经成为容器技术事实上的标准和代名词。
容器是何方神圣?
有人将容器称为“魔术师”,以形容其神通广大,无所不能。那么到底什么是容器呢?容器是一种轻量级的虚拟化技术,PaaS平台技术概念之一。所谓轻量级虚拟化,就是使用了一种操作系统层虚拟化技术,这种技术允许一个操作系统上用户空间被分割成几个独立的单元在内核中运行,彼此互不干扰,这样一个独立的空间,就称之为一个容器。容器采取共享Host OS的作法,而不需像虚拟机那样在每一个容器内执行Guest OS。
简单来说,容器就是通过虚拟化操作系统的方式来管理代码和应用程序,管理员只需要将应用文件复制到应用将要使用到的环境中即可。如果将火车、轮船和飞机比作不同的操作系统,各式各样、不同宿主的货物是应用,那么集装箱就是容器,它通过一定的标准和规格将运输工具(操作系统)空间分割成许多小单元,每一个集装箱就是一艘虚拟的轮船,一列虚拟的火车,一艘虚拟的飞机。
早在十多年前,容器技术的一些关键理念和思想就已经开始得到应用了,但直到2011年才形成标准化的规范。对于容器技术使用最成熟的当属谷歌,其内部的几乎所有业务的运行环境基本全部实现了容器化。容器也是谷歌搜索引擎确保速度快、顺畅运营的秘诀之一。据统计,谷歌搜索每秒启动约7000个容器,每周就相当于约20亿个。
容器发展的最重要的一个里程碑是Docker的出现,它让容器技术变得路人皆知、炙手可热。在国内,百度,腾讯,阿里巴巴以及京东等互联网企业都在生产环境中大规模的使用了容器技术。
容器牛在哪里?
容器将传统操作系统分为两部分:容器内部的小面积运行环境以及容器运行的主机操作系统。作为关键组件,容器格式和运行时间的整合创造了全新价值,实现了跨主机集群的水平扩展,并且管理了基础架构,确保了应用的安全性、性能和弹性。同时,容器作为一种操作系统层的虚拟化技术,可以在进程级别进行隔离,大大提升了虚拟化的粒度。因此一台物理的服务器,可以运行非常多的容器,同时却又能将性能损耗降到最低。此外,开放标准提供了更高的互操作性,有助于推动工具的重复利用、高效发挥了现有投资。
这些是容器技术的核心价值所在,而这些价值有很好适应了互联网、云计算以及开源等新趋势和新需求,为目前的云平台和应用架构指明了一个新的发展方向。这也是为什么容器技术自诞生以来一直备受推崇。
而基于Linux操作系统的Docker更是让容器技术如虎添翼。
在Docker中,有容器和仓库的概念,任何服务,都可以打包成容器。容器可以存储在仓库中。当需要执行式,直接从仓库中拉取进行执行。屏蔽了底层IT基础设施之间的差异。服务的运营实体不需要了解容器内部的结构,只需要从仓库中拉取进行执行就行了。因此可以在IT服务的交付和使用者之间划开一条清晰的界限,非常适合目前IT服务分工越来越细的趋势。
很多时候,一个系统开发出来后,要花很大力气搭建一套测试环境,测试完成后,又得重新搭建一套运营环境。而Docker的三个核心概念——Build,Ship和Run涵盖了从开发到部署到执行的全流程。以容器为单位,当开发完成后,打包成容器,放到仓库,然后进入测试流程,测试完成后,再推回到仓库,最后到生成环境。也就是说,容器实现了开发、测试和运维三个环节平滑的衔接,避免了复杂的运行环境搭建的工作量,这对于系统开发人员和IT运维人员来说绝对是梦寐以求的事情。
容器也有短板吧?
任何技术都有短板,更何况容器这一新兴技术。Gartner著名分析师托马斯在一次公开演讲中,曾一口气列出了容器技术的5大缺陷。
第一:容器技术不能应用在所有场景当中。虽然容器技术拥有很强的兼容性,但是仍然不能完全取代现有的虚拟机环境。就像虚拟化技术刚刚出现的时候,一些传统的应用程序更加适合运行在物理环境当中一样。现在,一些应用程序并不适合运行在容器虚拟化环境当中。比如,有些应用程序只能以统一整体的形式存在——它们在最初设计时就采用了这种方式,对于这种情况来说,容器技术反而会对应用负载造成限制。 第二:容器技术难以解决依赖关系问题。容器运行在物理操作系统之上,相互之间共享大量底层的操作系统内核、库文件以及二进制文件。这意味着容器之间的现有依赖关系可能会限其在服务器之间的可移植性。比如,基于Linux操作系统的Docker容器就不能运行在当前版本的Windows Server操作系统上。
第三:较差的隔离性。容器的隔离性较差因为其共享同一个操作系统内核以及其他组件,在开始运行之前就已经获得了统一的底层授权(对于Linux环境来说通常是ROOT权限)。因此,漏洞和攻击更加有可能进入到底层的操作系统,或者转移到其他容器当中——潜在的传播行为远比最初的事件更加严重。
第四:潜在的蔓延问题。容器可以被大量快速复制,这是容器技术的重要优势之一,但是也有可能在管理员没有注意到的情况下消耗大量计算资源。如果应用程序所在的容器不再使用时能够被及时删除,那么情况还不算太坏。但是如果对一个容器化应用程序进行扩展之后忘记将其缩减回之前的规模,那么将会为企业带来大量的(并且不必要的)云计算开销。
第五:缺乏用于监控和管理容器的工具种类仍然十分缺乏。
不过在红帽公司资深系统架构师刘征看来,容器技术的缺陷只有一个那就是隔离性相对较差,这与生俱来,很难彻底解决,就像任何操作系统都会有漏洞一样;而其它缺陷随着时间的推移,技术的进步和产业生态的完善是可以消除的。
容器何以叫板虚拟机?
你会发现,在谈论容器的时候,总有一个名字如影随形,那就是虚拟机。
容器的一大好处就是应用程序以标准方式进行了格式化,之后才放到容器中。开发人员可以使用同样的工具和工作流程,不管目标操作系统是什么。一旦在容器中,每种类型的应用程序都以同样的方式在网络上移动。这样一来,容器酷似虚拟机。
两者虽然都属于虚拟化的技术,目标都是为了将一套应用程序所需的执行环境打包起来,建立一个孤立环境,方便在不同的硬件中移动,但两者的运作思维截然不同。简单来说,虚拟机是以操作系统为中心,目标是建立一个可以用来执行整套操作系统的沙盒独立执行环境。而容器则是一种以应用程序为中心的虚拟化技术,直接将一个应用程序所需的相关程序代码、函式库、环境配置文件都打包起来建立沙盒执行环境。
但是由于目标一致,容器总被拿来和虚拟机进行对比。IBM公司的研究部门曾经发表过一篇关于容器和虚拟机环境性能比较的报告。这个报告使用KVM和Docker作为虚拟机和容器的代表,在原生、容器和虚拟化环境中运行了CPU、内存、网络和I/O的基准测试。
结果显示,在每一项测试中,Docker的性能等同于或超出KVM的性能。论文由此指出:“传统观点认为使用虚拟机是用于实现IaaS,使用容器实现PaaS。但我们没有找到技术方面的理由来证明必须这么做,因为试验证明容器基于IaaS能提供更好的性能或者更容易部署。”
的确,容器相比虚拟机更加轻量(没有客操作系统),所需资源也更少。用户可以轻松运行1000个容器在一台普通的服务器上。但要想运行1000个虚拟机,除非有一个超级强大的主机。此外,一个完整的虚拟系统通常得用几分钟去启动,容器系统的启动只要数秒,甚至更短。
那么这是否意味着,基于容器的虚拟化技术将取代基于虚拟机的虚拟化技术呢?云安全公司Bromium的首席技术官西蒙对此非常笃定,他说:“虚拟机已经成为大多数企业数据中心不可或缺的一部分,但是基于容器的虚拟化技术将促使虚拟机更早地被淘汰。因为虚拟机是一台具有完整操作系统的物理服务器的模拟器,其并不是交付应用程序最有效的方式,容器才是。”
当然,虚拟机也不是吃素的,它有自己的杀手锏,那就是成熟,稳定和完善的生态。虚拟机是一项高度发展、非常成熟的技术,可以运行最关键的业务工作负载。虚拟化软件厂商已开发出了能处理成千上万个虚拟机的管理系统,从而保证用户的IT运营。
其实,容器和虚拟机也并不是非你即我的关系,容器当中可以有虚拟机,虚拟机当中也可以有容器。至于未来谁能够主导市场,那就要看必须的造化和努力了,毕竟不是任何一种优秀的技术一定会取得市场的主导地位。
如何玩转容器?
容器技术的价值毋庸置疑,那么企业用户如何才能把应用程序安全稳当地迁移到容器之中呢?这个问题有点技术,也有点复杂。不过技术专家认为,过程很重要。
应用程序都是复杂的,它们都有很多的组件。比如需要数据库或中间件服务的支持以实现对数据的存储、检索和集成。所以,第一步就是需要相关技术手段将应用从相关服务组件中分解出来,重新组合形成新的应用程序组件。随后企业要为每一个应用程序组件和数据提供一个唯一的标识符,这个标识符可允许企业在一个细粒度的级别上进行安全性管理同时增加一个日志记录的方法。接下来就是选择一个基础映像,比如搜索Docker注册库找到一个基本的Docker映像并将其作为应用程序的基础来使用,创建镜像后将其添加至Docker Hub。最后的工作便是配置、测试和部署。对在容器中运行的应用程序进行配置,以便于让应用程序知道可以在哪里连接外部资源或者应用程序集群中的其他容器。对基于容器的应用程序进行测试以确定应用程序应如何能够在负载增加的情况下进行扩展。最后,把容器部署到实际生产环境中。
刘征指出,基于Linux容器的应用架构不仅需要采用工具构建和运行容器,而且需要一个安全、可靠、企业级的底层基础架构,其生命周期的设计必须能够满足企业的长期要求,比如安全问题、持续的产品改进、主动诊断和支持服务等。
从对Linux内核的普通容器支持到简化用户体验的Docker,Linux容器充分利用多年来不断演进的Linux操作系统的优势,已经在市场上掀起了一场风暴。企业要想将容器成功部署到生产环境中去首先需要有一个经过优化的、更轻量的Linux发行版本。同时由于容器内运行的软件和底层操作系统之间的密切耦合,一个适用于主机的Linux 操作系统之外,企业还需要针对该主机操作系统而优化的、完整应用程序运行环境。这样打造的容器才能能够跨物理机、虚拟机、公共和私有云实现一致性、互操作性和可移植性。
性能更好、速度更快、成本更低、开放性更好是我们对IT不变的追求和要求,容器正是在这种诉求下诞生的一种优秀的技术,它有许多可圈可点之处。容器能够进一步提高处理器的利用率,降低计算成本,并且让硬件、电力和场地方面的投入获得更大的回报,关键它是开源的,但是隔离性差成了容器难以挥去的阴霾。
因此,容器是值得拥有的技术,但企业要谨慎使用,尤其技术实力较弱的企业。
现在,OpenStack 、Docker和JFS(京东自主开发的非结构化数据存储系统)这三大技术系统共同构成了京东“弹性计算云”的核心。据悉,在生产环境上的Docker实例已经超过11000个,大约60%用于在线应用,40%用于缓存;年底,随着MySQL的部署,京东私有云的Docker规模将再翻两番,届时京东大部分应用程序都会通过Docker来发布和管理。
无论是基于Linux的Docker、Solaris Zone和FreeBSD Jail,所有容器技术都为在多应用程序主机上运行的应用程序提供某种隔离机制。也就是说容器技术有多种产品形态,包括微软公司也即将推出基于Windows操作系统的容器。
但是,为什么当下关于容器的讨论除了Linux就是Docker呢?答案在于这个事实:Jail和Zone确实是容器技术的开拓者,但是它们的市场占有率很有限;而谷歌和开发Linux控制组(Linux Control Groups)的开发人员成功地将容器功能添加到Linux内核中后,鉴于Linux几乎遍地开花的态势,Linux 容器立马进入到了每一个企业和政府数据中心。
也就是说,Docker的成功是源于Linux的成功,这就是站在巨人肩膀之上的好处。当前Docker已经成为容器技术事实上的标准和代名词。
容器是何方神圣?
有人将容器称为“魔术师”,以形容其神通广大,无所不能。那么到底什么是容器呢?容器是一种轻量级的虚拟化技术,PaaS平台技术概念之一。所谓轻量级虚拟化,就是使用了一种操作系统层虚拟化技术,这种技术允许一个操作系统上用户空间被分割成几个独立的单元在内核中运行,彼此互不干扰,这样一个独立的空间,就称之为一个容器。容器采取共享Host OS的作法,而不需像虚拟机那样在每一个容器内执行Guest OS。
简单来说,容器就是通过虚拟化操作系统的方式来管理代码和应用程序,管理员只需要将应用文件复制到应用将要使用到的环境中即可。如果将火车、轮船和飞机比作不同的操作系统,各式各样、不同宿主的货物是应用,那么集装箱就是容器,它通过一定的标准和规格将运输工具(操作系统)空间分割成许多小单元,每一个集装箱就是一艘虚拟的轮船,一列虚拟的火车,一艘虚拟的飞机。
早在十多年前,容器技术的一些关键理念和思想就已经开始得到应用了,但直到2011年才形成标准化的规范。对于容器技术使用最成熟的当属谷歌,其内部的几乎所有业务的运行环境基本全部实现了容器化。容器也是谷歌搜索引擎确保速度快、顺畅运营的秘诀之一。据统计,谷歌搜索每秒启动约7000个容器,每周就相当于约20亿个。
容器发展的最重要的一个里程碑是Docker的出现,它让容器技术变得路人皆知、炙手可热。在国内,百度,腾讯,阿里巴巴以及京东等互联网企业都在生产环境中大规模的使用了容器技术。
容器牛在哪里?
容器将传统操作系统分为两部分:容器内部的小面积运行环境以及容器运行的主机操作系统。作为关键组件,容器格式和运行时间的整合创造了全新价值,实现了跨主机集群的水平扩展,并且管理了基础架构,确保了应用的安全性、性能和弹性。同时,容器作为一种操作系统层的虚拟化技术,可以在进程级别进行隔离,大大提升了虚拟化的粒度。因此一台物理的服务器,可以运行非常多的容器,同时却又能将性能损耗降到最低。此外,开放标准提供了更高的互操作性,有助于推动工具的重复利用、高效发挥了现有投资。
这些是容器技术的核心价值所在,而这些价值有很好适应了互联网、云计算以及开源等新趋势和新需求,为目前的云平台和应用架构指明了一个新的发展方向。这也是为什么容器技术自诞生以来一直备受推崇。
而基于Linux操作系统的Docker更是让容器技术如虎添翼。
在Docker中,有容器和仓库的概念,任何服务,都可以打包成容器。容器可以存储在仓库中。当需要执行式,直接从仓库中拉取进行执行。屏蔽了底层IT基础设施之间的差异。服务的运营实体不需要了解容器内部的结构,只需要从仓库中拉取进行执行就行了。因此可以在IT服务的交付和使用者之间划开一条清晰的界限,非常适合目前IT服务分工越来越细的趋势。
很多时候,一个系统开发出来后,要花很大力气搭建一套测试环境,测试完成后,又得重新搭建一套运营环境。而Docker的三个核心概念——Build,Ship和Run涵盖了从开发到部署到执行的全流程。以容器为单位,当开发完成后,打包成容器,放到仓库,然后进入测试流程,测试完成后,再推回到仓库,最后到生成环境。也就是说,容器实现了开发、测试和运维三个环节平滑的衔接,避免了复杂的运行环境搭建的工作量,这对于系统开发人员和IT运维人员来说绝对是梦寐以求的事情。
容器也有短板吧?
任何技术都有短板,更何况容器这一新兴技术。Gartner著名分析师托马斯在一次公开演讲中,曾一口气列出了容器技术的5大缺陷。
第一:容器技术不能应用在所有场景当中。虽然容器技术拥有很强的兼容性,但是仍然不能完全取代现有的虚拟机环境。就像虚拟化技术刚刚出现的时候,一些传统的应用程序更加适合运行在物理环境当中一样。现在,一些应用程序并不适合运行在容器虚拟化环境当中。比如,有些应用程序只能以统一整体的形式存在——它们在最初设计时就采用了这种方式,对于这种情况来说,容器技术反而会对应用负载造成限制。 第二:容器技术难以解决依赖关系问题。容器运行在物理操作系统之上,相互之间共享大量底层的操作系统内核、库文件以及二进制文件。这意味着容器之间的现有依赖关系可能会限其在服务器之间的可移植性。比如,基于Linux操作系统的Docker容器就不能运行在当前版本的Windows Server操作系统上。
第三:较差的隔离性。容器的隔离性较差因为其共享同一个操作系统内核以及其他组件,在开始运行之前就已经获得了统一的底层授权(对于Linux环境来说通常是ROOT权限)。因此,漏洞和攻击更加有可能进入到底层的操作系统,或者转移到其他容器当中——潜在的传播行为远比最初的事件更加严重。
第四:潜在的蔓延问题。容器可以被大量快速复制,这是容器技术的重要优势之一,但是也有可能在管理员没有注意到的情况下消耗大量计算资源。如果应用程序所在的容器不再使用时能够被及时删除,那么情况还不算太坏。但是如果对一个容器化应用程序进行扩展之后忘记将其缩减回之前的规模,那么将会为企业带来大量的(并且不必要的)云计算开销。
第五:缺乏用于监控和管理容器的工具种类仍然十分缺乏。
不过在红帽公司资深系统架构师刘征看来,容器技术的缺陷只有一个那就是隔离性相对较差,这与生俱来,很难彻底解决,就像任何操作系统都会有漏洞一样;而其它缺陷随着时间的推移,技术的进步和产业生态的完善是可以消除的。
容器何以叫板虚拟机?
你会发现,在谈论容器的时候,总有一个名字如影随形,那就是虚拟机。
容器的一大好处就是应用程序以标准方式进行了格式化,之后才放到容器中。开发人员可以使用同样的工具和工作流程,不管目标操作系统是什么。一旦在容器中,每种类型的应用程序都以同样的方式在网络上移动。这样一来,容器酷似虚拟机。
两者虽然都属于虚拟化的技术,目标都是为了将一套应用程序所需的执行环境打包起来,建立一个孤立环境,方便在不同的硬件中移动,但两者的运作思维截然不同。简单来说,虚拟机是以操作系统为中心,目标是建立一个可以用来执行整套操作系统的沙盒独立执行环境。而容器则是一种以应用程序为中心的虚拟化技术,直接将一个应用程序所需的相关程序代码、函式库、环境配置文件都打包起来建立沙盒执行环境。
但是由于目标一致,容器总被拿来和虚拟机进行对比。IBM公司的研究部门曾经发表过一篇关于容器和虚拟机环境性能比较的报告。这个报告使用KVM和Docker作为虚拟机和容器的代表,在原生、容器和虚拟化环境中运行了CPU、内存、网络和I/O的基准测试。
结果显示,在每一项测试中,Docker的性能等同于或超出KVM的性能。论文由此指出:“传统观点认为使用虚拟机是用于实现IaaS,使用容器实现PaaS。但我们没有找到技术方面的理由来证明必须这么做,因为试验证明容器基于IaaS能提供更好的性能或者更容易部署。”
的确,容器相比虚拟机更加轻量(没有客操作系统),所需资源也更少。用户可以轻松运行1000个容器在一台普通的服务器上。但要想运行1000个虚拟机,除非有一个超级强大的主机。此外,一个完整的虚拟系统通常得用几分钟去启动,容器系统的启动只要数秒,甚至更短。
那么这是否意味着,基于容器的虚拟化技术将取代基于虚拟机的虚拟化技术呢?云安全公司Bromium的首席技术官西蒙对此非常笃定,他说:“虚拟机已经成为大多数企业数据中心不可或缺的一部分,但是基于容器的虚拟化技术将促使虚拟机更早地被淘汰。因为虚拟机是一台具有完整操作系统的物理服务器的模拟器,其并不是交付应用程序最有效的方式,容器才是。”
当然,虚拟机也不是吃素的,它有自己的杀手锏,那就是成熟,稳定和完善的生态。虚拟机是一项高度发展、非常成熟的技术,可以运行最关键的业务工作负载。虚拟化软件厂商已开发出了能处理成千上万个虚拟机的管理系统,从而保证用户的IT运营。
其实,容器和虚拟机也并不是非你即我的关系,容器当中可以有虚拟机,虚拟机当中也可以有容器。至于未来谁能够主导市场,那就要看必须的造化和努力了,毕竟不是任何一种优秀的技术一定会取得市场的主导地位。
如何玩转容器?
容器技术的价值毋庸置疑,那么企业用户如何才能把应用程序安全稳当地迁移到容器之中呢?这个问题有点技术,也有点复杂。不过技术专家认为,过程很重要。
应用程序都是复杂的,它们都有很多的组件。比如需要数据库或中间件服务的支持以实现对数据的存储、检索和集成。所以,第一步就是需要相关技术手段将应用从相关服务组件中分解出来,重新组合形成新的应用程序组件。随后企业要为每一个应用程序组件和数据提供一个唯一的标识符,这个标识符可允许企业在一个细粒度的级别上进行安全性管理同时增加一个日志记录的方法。接下来就是选择一个基础映像,比如搜索Docker注册库找到一个基本的Docker映像并将其作为应用程序的基础来使用,创建镜像后将其添加至Docker Hub。最后的工作便是配置、测试和部署。对在容器中运行的应用程序进行配置,以便于让应用程序知道可以在哪里连接外部资源或者应用程序集群中的其他容器。对基于容器的应用程序进行测试以确定应用程序应如何能够在负载增加的情况下进行扩展。最后,把容器部署到实际生产环境中。
刘征指出,基于Linux容器的应用架构不仅需要采用工具构建和运行容器,而且需要一个安全、可靠、企业级的底层基础架构,其生命周期的设计必须能够满足企业的长期要求,比如安全问题、持续的产品改进、主动诊断和支持服务等。
从对Linux内核的普通容器支持到简化用户体验的Docker,Linux容器充分利用多年来不断演进的Linux操作系统的优势,已经在市场上掀起了一场风暴。企业要想将容器成功部署到生产环境中去首先需要有一个经过优化的、更轻量的Linux发行版本。同时由于容器内运行的软件和底层操作系统之间的密切耦合,一个适用于主机的Linux 操作系统之外,企业还需要针对该主机操作系统而优化的、完整应用程序运行环境。这样打造的容器才能能够跨物理机、虚拟机、公共和私有云实现一致性、互操作性和可移植性。
性能更好、速度更快、成本更低、开放性更好是我们对IT不变的追求和要求,容器正是在这种诉求下诞生的一种优秀的技术,它有许多可圈可点之处。容器能够进一步提高处理器的利用率,降低计算成本,并且让硬件、电力和场地方面的投入获得更大的回报,关键它是开源的,但是隔离性差成了容器难以挥去的阴霾。
因此,容器是值得拥有的技术,但企业要谨慎使用,尤其技术实力较弱的企业。