https://azure.microsoft.com/zh-cn/blog/containers-docker-windows-and-trends/
今天这个时代当你讨论云计算时,不谈谈docker是不可想象的。各行各业的成功组织,从银行等金融组织到电子商务公司都希望能够清晰理解到底container容器是个什么,container对于运行于云端的application意味着什么,以及容器化对于他们组织的开发及IT运营场景有什么好处,他们可以如何运用。。本文中,我将从最基础的topic开始:到底什么是container,他们是如何工作的,随后转到container当前应用的最多场景,最后也会讲讲应该如何拥抱这种容器化的计算趋势,实现如何用好这种云计算开发模式无缝地实现build, test,deploy以及manage你地云计算application.
containers overview
从理论上上说,所有的computing本质上就是在一套物理资源上运行一些function完成某个特定的任务,这些资源包括cpu,memory,disk,network等。比如简单的数学计算任务或者一个分布于多个机器上的复杂application(比如exchange邮箱系统)都是这种模式:资源+软件.随着计算机技术的发展,物理硬件资源越来越强大,这导致一个问题是:资源的巨大浪费,因为每一个application实际上仅仅需要非常少的一部分资源,而它可能却独占了整台机器。这就产生了"虚拟化"的需求,虚拟的资源就是用于模拟底层物理硬件,允许多个应用同时运行在同一台机器上:每一个app都只使用物理资源的很小一部分。这些模拟技术我们称为虚拟化。当人们听到虚拟化这个词语时大多数人都想到的是virtual machine,但是需要指出的是,虚拟机器仅仅是虚拟化的一种实现。virtual memory,虚拟内存这在所有的通用OS中实现的机制,能够使得application产生它拥有所有的计算机内存的假象,甚至这种GPOS提供的virtual memory机制可以使得app能够使用比物理内存要大的多的"内存".而containers是另外一种虚拟化啊,也被称为OS virtualization.今天在Linux系统中,container给application创建了一个完全隔离和独立的OS运行环境。对于运行中的container来说,本地磁盘看起来就是一个完整干净的OS文件系统,比如/usr,/local,/etc等等目录,而其看到的内存占用情况就是一个全新重启后的OS运行情况:也就是只有OS本身在运行,在占用着内存资源。为了实现这种效果(仅有单独新OS运行和占用内存),负责创建container的host主机需要做一些非常聪明的操作并基于几个关键技术。
1. 首先是namespace isolation
命名空间包含了应用可以交互的所有资源,包括files, network ports以及running process list。namespace isolation使得Host主机能够给每个容器分配一个虚拟化的namespace,该namespace中仅仅包含了该应用可以看到的资源。有了这个视图的限制性,应用本身无法访问到不在namespace中的文件,即使本身他们可能有权限访问,因为很简单,app本身就看不到这些资源,又如何访问呢?另外app也无法列出或者访问那些不在container namespace中的应用,这使得应用本身就以为只有它自己在运行,但是实际上可能有成千上万的app在同时运行中,这不过就是一个障眼法。
为了提高效率,很多OS文件,目录以及运行中的service都是由很多container共享的,并且被投射到每个容器的namespace中。
只有当应用本身针对容器做了修改时,比如修改或者创建一个新的文件时,container会从底层的host os中获取到一个copy,并保存相应的修改。注意仅仅是修改的部分本身会被保存哦,这实际上就是docker的"copy-on-write"优化机制.这种共享机制使得在一个host主机上部署多个容器非常高效!
2. host主机控制每个container能够使用的主机资源数量.有效控制比如CPU,RAM和网络带宽这类资源可以保证每个容器能够获得它所需要的资源数量,并且容器本身的运行不会影响到其他container的运行性能。
比如,如果一个容器被限制最多只能使用10%的CPU能力,这意味着即使该容器的应用竭尽全力去抢占CPU,它也不能得到另外90%未分配给它的CPU能力!而这个90%的CPU能力host主机可以分派给其他的container容器或者host自己使用。linux实现这种控制资源使用配额的技术被称为"cgroups". 当然并不是每种场景都需要做这种严格的资源配额控制的,比如如果在一个host上所有的容器本身就是合作式的,而非竞争关系的,需要考虑标准的应对app变更的资源需求,允许标准的OS动态资源分配.那么就无需做这种控制.
由于OS虚拟化带来的快速启动的优点,和由于namespace隔离以及cgroups资源控制带来的可靠性优点使得containers非常适合于application development和testing.在开发流程中,开发人员可以快速迭代. 由于container运行的环境和资源使用情况在跨系统时完全一致,那么这一点可以保证在开发人员的环境中可以运行ok的话,就可以在生产环境中同样安全work.
快速启动和小尺寸对于云场景也有很大好处,因为app可以很快速的scale out并且能够允许更多的instance被创建(因为尺寸小,资源占用很小哦),这样更加充分地利用好有限的物理资源。
如果和使用virtumal machine的解决方案来对比,使用container会由于这种sharing带来很高的效能。
在下面使用vm方案中,host主机有三个vm,为了获得app的完全隔离特性,每个vm都有对应的OS文件,库文件和应用程序代码,以及一个有指定好内存的独占OS。启动一个新的VM需要启动一个新的OS实例,虽然host主机或者其他vm已经有了相同版本OS正在运行中,也无法共用这个OS。每个APP VM都必须吃进OS启动所需要的时间,以及OS对应消耗的内存,而这将大大降低能够起的VM个数
下面这张图则时使用container时的情况。所有的容器都共享host主机的OS,包括kernel和lib,因此这些container本身不需要启动一个OS,加载library,从而也就大大降低了memory的占用。所需要的额外资源仅仅是需要使能app运行于容器这个机制所需要的memory和disk space.由于app的环境就是一个完整独立的OS,
OCI
随着打包成docker image的应用越来越多,docker最近组织成立了Open Container Initiative的标准化组织,确保packaging的format是统一的,以便有更多的厂商加入进来,这其中就有microsoft
Windows Server和Containers
微软宣布在windows server中实现container技术。为了使得用惯了Linux docker container的开发人员在windows server container上有相同的体验,微软宣布和Docker建立战略合作,扩展Docker API和工具集以便支持windows server containers.