自容器技术诞生以来,几乎每个接触到容器的人都对容器与虚拟机的共性和差异产生巨大的疑问。今天我们为读者们带来了 DaoCloud 独家翻译的三篇精选文章,为大家抽丝剥茧地分析容器和虚拟机之间的差异,并且教会你如何联合 Docker 容器和虚拟机的力量来取得更佳的资源利用率。
在 Docker 工作期间,我花了相当多的时间去和社区成员交流,我发现,不论对 Docker 是陌生还是熟悉,大家都有一个共同点:在第一次使用 Docker 时,人们会不由自主地像使用虚拟机那样,尝试去构建它。我都记不清有多少次听到别人说 Docker 就是“轻量级的虚拟机”了。
我很有同感,因为在第一次使用 Docker 工作时,我也干过一模一样的事。人们很容易产生联想,觉得这些技术肯定有一些共通性:两者都是用来为运行应用提供封闭的环境。而且,两者的环境都是通过二进制生成品来呈现的,可以在主机间移动切换。也许还会有其他相似处,但对我而言这两点是最大头的。
区别这两者的关键是,两者的底层架构是完完全全不同的。我的类比是(如果你认识我,就知道我很喜欢类比):
房子(虚拟机)是完全自我封闭的,能防止不速之客。它们还各自拥有自己的基础设施——水管、供暖、电力等等。不仅如此,在绝大多数情况下,房子都要有至少一间卧室、一个客厅、一间浴室和一间厨房。我还会找到一间“工作室”——就算我买的是最小的房子,我也会买一些超出需要的东西,因为房子就是这么建的(学究气一点,的确我忽略了当代流行的“蜗居”,因为它破坏了我的类比)。
公寓(容器)也能提供保护,阻止不速之客,但它们都是围绕共享基础设施建成的。公寓楼( Docker 主机)共用水管、供暖和电力等等。此外,公寓的尺寸面积是参差不齐的——从小的工作室,到带多个卧室的顶层豪华套房。你需要什么,就出钱租什么。最后,和房子一样,公寓也有上锁的前门来挡住不速之客。
使用容器,你将共用 Docker 主机的底层资源,你运行应用需要什么镜像,你就创建什么镜像。你会从一个基础系统开始,然后需要什么,就往上添加什么。虚拟机走的是相反的路子。你开始时有一个完整的操作系统,然后根据你的应用需求,剔除掉你用不上的东西。
我确定,你们很多人到这里会说“哦,我懂了,它们是不一样的”。不过就算我们这么讲,我们还是会把使用虚拟机养成的习惯带到容器里去。
“我怎么备份容器?”
“我运行中的容器有什么补丁管理策略?”
“应用服务器在哪里运行?”
对我而言,当我意识到 Docker 并不是一种虚拟化技术时,真是眼前一亮,豁然开朗。它其实是一种应用交付技术。在以虚拟机为中心的世界里,抽象化的单位是单体虚拟机,它不仅存储应用编码,还经常存储其状态数据。虚拟机把物理服务器上跑的所有东西都拿来,然后打包成一个单一的二进制文件,所以它可以到处移动。但是万变不离其宗,东西还是原来的东西。在容器的世界里,抽象化的单位是应用本身;或者更准确的说,是帮助构成应用的服务。
在容器世界里,一般多个服务(各自代表一个单一的容器)组成一个应用。应用现在可以被分解成许多更小的组件,这将彻底改变它们在产品中被管理的方式。所以,你怎么备份你的容器呢?你不需要备份。你的数据不存在于容器里,它存在于一个命名的存储卷中,能在你定义的 1 到 N 个容器间共享。你只需备份数据卷,不必管容器。理想情况下,你的容器是无状态的,而且是不可改变的。
诚然,补丁仍然是你世界的一部分,但它们不作用于运行中的容器。事实上,如果你修补一个运行中的容器,然后在一个未修补的镜像上开启新的容器,那接下来有你好受的了。理想的做法应当是,升级你的 Docker 镜像,停止运行中的容器,之后再运行新的容器。因为容器可以在一秒之内启动,这样做其实会节省很多。
你的应用服务器会转换成一个在容器内部运行的服务。当然,有时候你基于微服务的应用需要连接到一个非容器服务,不过绝大多数独立服务器(也就是你执行代码的服务器)会给一个或多个容器提供通路。容器能用少得多的额外花销,提供相同质量的运行效果(而且横向拓展也会好得多)。
“但是,虚拟机已经被迁移了,我怎么处理我已有的应用呢?”
我经常被人问到如何在一个容器里运行大型单体应用。我的建议是使用微服务——有很多有效的策略可以转移到微服务架构(微服务架构一开始就会把现存的单体应用从虚拟机转向容器),但我觉得这应该是旅途的第一步,而不是最终的目的地。
如果你想着你的团队如何能利用好 Docker ,请试着抛弃用惯虚拟机而形成的思维定势,早日意识到 Docker 远远超越了“轻量级虚拟机”的范畴。它是一种新的方式,能在你所选择的基础架构上,以应用为中心,提供性能强悍,规模可拓展的应用。
若干星期之前,我谈到了为什么 Docker 容器不等同于虚拟机( VM )。在文章的后面,我收到了相当多的积极反馈(在此谢过!),不过也听到了一个很普遍的问题:虚拟机和 Docker 容器能不能并存呢?答案是——
“可以!”
“可以!”
“可以!”
重要的事情说三次。
在最基础的层面上,虚拟机是 Docker 主机运行的绝佳场所——而这里所说的虚拟机,当然是指任何形式的虚拟机。不管是 vSphere 虚拟机, Hyper-V 虚拟机还是 AWS EC2 ,它们全都可以无差别地作为 Docker 主机来运行。根据你的实际需要,虚拟机或许是安放那些容器的最理想之地。然而, Docker 的伟大之处恰恰在于,在哪儿运行容器都不是问题——完全按照你的想法来就行。
我听到的另一个问题是:基于 Docker 容器的服务是否能够和基于虚拟机的服务发生交互。这一次,答案还是妥妥的“可以”。在一套 Docker 容器上运行你的应用,并不妨碍它与虚拟机里运行的服务进行交流。
举个例子,你的应用可能需要和内置于某个虚拟机的数据库进行交互。假设网络什么的一切正常,你的应用是可以和数据库无缝交互的。
虚拟机和 Docker 容器可以进行协同工作的另一个领域,是容量优化。虚拟机之所以能先行一步占领大半江山,靠的就是高人一等的服务器利用率。直到今天,这一点依然是没有改变的。比如说, vSphere 主机能掌控一个可以装下 Docker 主机的虚拟机,但也能掌控任何数量的传统单个虚拟机。通过对 Docker 主机和“老式”虚拟机进行混合与匹配,系统管理程序可以确保在已有的物理硬件基础上,实现系统整体的最大化利用。
Docker 允许在相当多种类的虚拟化与云平台上运行 Docker 主机。不管在哪里运行, Docker 云和 Docker 数据中心都可以轻易管理 Docker 主机。再辅以 Docker Machine ,你可以把新的 Docker 主机安放到包括 VMware 、 vSphere 、微软 Hyper-V 、 Azure 和 AWS 等一系列各类平台上。
Docker 最强大的一点,就是它能为 IT 团队提供非比寻常的灵活性。决定在哪里运行应用,可以 100% 取决于你们团队的实际需求。你绝不会受困于单一的基础架构,你可以用任何适合你团队的方式来挑选,来抉择,来混合,来匹配。把 Docker 主机放在 vSphere 上?善哉。放在 Azure 上?可以。放在物理服务器上?当然没问题。有了 Docker 容器,你就拥有了灵活性、便捷性和可控性的完美结合方案。
如果你是一名虚拟化管理员,那么最近几个月提出的“容器”绝对是你的良机。原因是:现在的企业,无论规模大小,都在试图利用容器化的强大力量。不过,容器化是什么呢?你又该如何利用好容器,同时兼顾好你在虚拟化领域的投资呢?
昨天,我们围绕“虚拟化管理员的容器化之路”问题开展了一场网络研讨会,有超过 1100 名使用者参加。不过,我们可以概括一下所讨论的主题——
容器会把应用,以及运行应用所需的一切文件(比如二进制文件)打包进一个单一的标准化单位(又称作“容器”)。这个标准格式允许容器化了的应用在任何环境下运行,无需考虑基础架构。有一点很重要,需要注意:容器并不是虚拟机。容器比虚拟机更加轻量化,更加便携。容器利用共享资源,而不是像虚拟机那样,端着整个客户操作系统。容器化不需要专门的系统管理程序。下图可以对照看看容器化(左侧)和虚拟机(右侧)的架构异同。
容器可以在裸机服务器上,在虚拟机内,或者在公共云服务商里运行。 Docker 引擎就是其独家秘方。 Docker 引擎是主机上的 Docker 安装软件,负责创建和运行容器。下面的图片,左侧展示了裸机服务端容器化的架构,右侧展示了容器化和虚拟化结合后的架构。
通过利用容器化和虚拟化的结合,企业团队可以从原来的,每台虚拟机只能运行一个应用,到如今在一台虚拟机上运行多个应用。管理者可以把各个服务放置到一个容器里,然后在各台虚拟机上运行多个容器。
看呐!它能让管理者合并手中的虚拟机(现在每台虚拟机都更强大了),减少总体花费(维护、 hypervisor 许可、存储等等),并且用更快的性能速度运行应用(别忘了容器比虚拟机更轻量化),从而实现环境的整体优化。
瑞士最大的电信供应商瑞士电信就是这种结合的主要受益者。该公司以前需要在 400 台虚拟机上运行 400 个应用,引入容器化后,如今运行同样的 400 个应用却只需要 20 台虚拟机!这让他们在存储、日常维护和 hypervisor 许可上节省了一大笔开销。
容器化还允许团队从一个环境向另一个环境轻松迁移工作负载。
下面是一个示例,展示了一个运行在 VMware vSphere 上的工作负载是如何转移到 Azure 上的。
在网络研讨会上,技术专员迈克·科勒曼用一个技术 demo 展示了如何利用我们的 Docker 数据中心解决方案和虚拟化技术,把一个创意变成应用产品。也建议你看看研讨会后期的问答环节,参与者在会上提出了许许多多相当棒的问题,我们对其中一些问题作出了解答。
现在,问题不是“容器和虚拟机有什么区别”了,问题是——