一个开发者的Linux Containers之旅
告 诉你们一个秘密:所有的DevOps 云工具是如何进入我的应用程序又与世界联系起来的对我来说至今仍然是一个迷。但是,随着时间的推移,我已经逐渐意识 到,了解如何去配置大规模机器和应用程序的来龙去脉是开发员必须具备的重要能力,就像成为一名专业的音乐家的过程一样。如果你想成为专业的音乐家,你当然 需要知道如何演奏乐器,但是,如果你不了解录音棚的作品或者不知道如何融入一个交响乐团,你也将很难在这样的环境中工作。
在软件开发的世界里,将你的代码融入大世界中和编写代码同样重要。DevOps能够很好的做到这一点。
所以,为了架起开发和技术运营之间的桥梁,我将介绍一种新技术——容器技术。为什么是容器?强有力的证据表明容器就是机器虚拟化的下一个阶段:自此电脑不再是一个物品而是一个地点。快来和我一起走近容器吧。
在本文中我将介绍容器化背后的概念、容器技术与虚拟机的不同之处、它背后的逻辑构造又如何适应应用程序架构、简化版本的Linux操作系统如何适应容器系统以及怎样使用镜像来创建可复用容器。在文章的最后,我将介绍如何使用容器群让你的应用程序在短时间内壮大。
后文中我将展示分步容器化一个应用程序实例的过程,以及为应用程序容器创建一个主机集群的方法。我也会展示利用Dies在本地系统的虚拟机上或者云服务商上配置一个示例应用程序。
现在,让我们开始吧!
虚拟机的优点
你想了解容器如何适应整个体系架构的,首先需要先了解容器的前身:虚拟机。
虚拟机(VM)是一个运行在实体计算机上的虚拟计算机软件,在计算机上安装一个虚拟机就像是购买一台特制的计算机:你可以自定义CPU的数量以及其内存和磁盘存储容量。配置完成后,你可以将操作系统以及任何你需要虚拟机支持的服务器和应用程序载入其中。
虚拟机允许在一台硬件主机上运行多个虚拟计算机。简易示意图如下:
虚 拟机提高了硬件的投资效益,你可以买一台又大又响的机器设备,然后在上面运行大量的虚拟机。你也可以将数据库虚拟机与包含大量自定义应用程序的虚拟机(同 版本)作为集群同时运行。这使得有限的硬件资源获得了延展,只要你的主机硬件允许情况下,如果你发现需要更多的虚拟机,你可以任意添加。如果你不再需要虚 拟机,只需将虚拟机关闭并删除虚拟机镜像即可。
虚拟机的局限性
但是虚拟机存在自身的局限性。
当你按以上步骤在一台主机上创建了三个虚拟机。主机共有12个CPU,48GB的内存,3TB的存储空间。每个虚拟机分配4个CPU,16GB的内存和1TB的存储空间。到目前为止一切正常,配置都在主机的能力范围内。
但 是,应该注意到一个缺点。主机分配给每个虚拟机的所有资源都是专用的。无论这台虚拟机是什么,都会被分配到16GB内存。但是,如果第一台虚拟机从未使用 超过1 GB的内存分配,其余15GB就会闲置在那里。如果第三台虚拟机只使用它分配到的1TB存储空间中的100GB,那么剩余的900GB都是浪费掉 的的存储空间。
由于资源并没有分级,每一台虚拟机都固定使用分配到的资源。因此,一定程度上又回到了虚拟机出现前–在没用的资源上浪费大量资金的年代。虚拟机的另一个缺点是运转速度慢,所以即使是自动化虚拟机配置,当需要迅速扩大基础架构时,仍然得搬着拇指玩来等它上线工作。
容器登场
容 器就是一个认为只有其本身在运行状态的linux程序,只服从用户指定的命令。同时,在容器化方面,容器程序拥有自己的IP地址。重要的事情再说一遍:在 容器化方面,容器程序是分配有IP地址的。一旦有了IP地址,主机内的应用程序就成了一个可识别的网络资源。然后可以发送命令至容器管理器,将容器的IP 地址映射到一个开放的主机IP地址。无论出于什么目的,一旦这种映射发生,一个容器就是一个可访问网络的独立设备,在概念上类似于虚拟机。
再次说明,容器是一个独立的Linux程序,拥有自己的IP地址,因此可以在网络中识别。如下图所示:
一 个容器和其他应用程序以动态、合作的方式共享主机资源。如果容器只需要1GB内存,它就只使用1GB的内存。如果它需要4GB内存,它就只使4GB。 在 CPU和存储空间的利用上同样如此。CPU、内存、存储空间的分配都是动态的,而不是像典型的虚拟机一般静态分配。所有的这些资源共享都由容器管理完成 的。
此外,容器还有运行速度快的优点。
总体上容器的优点可以归结为:拥有虚拟机独立和封装的特点,并弥补了它资源分配静态专用的缺点。并且,快速载入内存的能力让它具有更好的扩展更多容器的性能。
容器的托管、配置和管理
现在,可运行linux版本容器的主机已经成为必需品。最近,主机上的一种底层操作系统越来越来越受欢迎,就是上文提到的CoreOS。当然还有许多其他的底层操作系统,如Red Hat Atomic Host和Ubuntu Snappy。
Linux操作系统下所有容器共享,以此来减少容器重复和部署。每个容器只包含特定的容器应有的功能。下面以图表的方式展现:
你 可以使用所需的组件来配置自己的容器。有一个叫作层的容器组件。一层就是一个容器镜像(在下面的章节,你将会了解到更多关于容器镜像的知识)。一般从基础 层开始,基础层通常就是你想在容器中使用的操作系统的类型(容器管理器只提供您所需的操作系统的部分,并非主机操作系统)。如果想在容器中运行其他脚本文 件,需要构建容器的配置和增加层。例如想要运行Web服务器、PHP和Python时,需要配置Apache。
此 外,分层是十分灵活的。如果你的应用程序或服务容器需要PHP 5.2框架,就需要配置相应的容器。如果你有另一个应用程序或者服务需要PHP5.6框 架,同样仅需利用PHP 5.6配置对应的容器即可。它不像虚拟机那样,改变当前运行的版本时需要进行大量的配置和安装步骤。利用容器,你仅需在容器配置 文件过程中重新定义下该层即可。
在此之前,所有容器的多功能性是由一款叫做容器管理器的软件控制的。目前,最流行的容器管理软件是Docker和Rocket。上图描述的就是这样一个主机,该主机利用Docker来管理容器并且使用CoreOS操作系统。
容器与镜像同时建立
当你将一个应用程序封装为容器时,同时也建立了相对应的镜像。一个镜像代表着一个容器模板,这个模板就是你工作所需的容器的模板(我知道,容器中包含着容器,想想看)。镜像存储在注册表中,注册表缓存在网络上。
从 概念上来说,对于那些熟悉Java的人来说,注册表类似于Maven库,或者类似于你.NET平台下的一个NuGet服务器。创建一个容器配置文件,以便 于列出应用程序所需的全部镜像。利用容器管理器来生成一个容器,这个容器可以包括应用程序源码以及从容器注册表下载的组成资源。例如,如果你的应用程序是 由PHP文件组成的,容器配置文件将允许你从注册表获取PHP运行环境。同样,也可以使用容器配置文件来申明复制到容器文件系统所需的.php文件。容器 管理器可以将应用程序里的组件封装成一个不同的容器,在有容器管理器的情况下,你可以在主机上运行此容器。
下图表明了容器创建背后的过程:
让我们仔细分析下该图。
此 处(1)表明存在一个容器配置文件,该文件定义了你容器所需要的东西,以及容器如何构建。当在主机上运行容器时,容器管理器将会从云端的注册表内读取配置 文件容器的镜像。(2)将镜像添加到容器的图层中。此外,如果该镜像的构成需要其他镜像参与,容器管理器将检索到这些镜像并将它们添加到图层中去。(3) 处,容器管理器会将文件复制到你所需的容器中去。
如果你使用一个配置服务,例如Deis,你刚刚建立的应用程序容器会以镜像的方式存在。(4)该配置服务可以部署到你所选的云供应商中。常见的云供应商是AWS 和Rackspace。
容器集群
因此,我们可以说,在比较好的情况下,容器比虚拟机提供更大程度配置灵活性和更高的资源利用率。然而,这并不是全部优点。
当容器聚集起来将会变得更加灵活。请记住,不同的容器对应不同的IP地址。因此,容器可以放在负载均衡器后面使用,一旦这样做,“游戏”将会上升到新的水平。
你可以通过在负载均衡器下运行容器集群来实现高性能的容器和可用度高的计算。这里有个例子:
让 我们来谈一下关于你所做的资源密集型的应用程序。例如图像处理程序。利用如Deis等容器配置技术,你可以新建一个容器镜像,该容器镜像将包含图像处理应 用程序和该程序所需的全部配置资源。然后,你可以在主机的负载均衡器下部署一个或者多个此类容器镜像。一旦容器镜像建立完成,你可以将其作为主机系统崩溃 之后的备份,并且在容器集群中需要更多的镜像来完成目前所有的工作量。
更好消息来了。在添加多个镜像实例到工作环境中时,你无需每次手动配置负载均衡器。你可以使用服务发现技术来让容器自动配置负载均衡器从而使得容器保持可用性的平衡。然后,一旦如此,平衡器将开始进行到新的节点的流量路由。
归纳总结
容 器技术已经填补了虚拟机离开领域。诸如CoreOS、RHEL Atomic,以及Ubuntu’s Snappy等主机操作系统,综合Doker和 Rocket容器管理技术,进而使得容器日渐收到欢迎。尽管容器技术越发变得普遍,它们还是需要花费一些时间来掌握。然而,一旦你弄懂了,你可以使用如 Deis等容器配置技术更容易地创建和部署容器。
在概念上理解容器和实际地开展容器相关项目同样重要。但是,我认为如果没有实际操作经验是很难掌握其概念的。所以,我们在这系列的下一步工作就是:实际建立一些容器。
本文卡通配图来自:TheWorldInWhichWeLive.com
原文链接:A Developer’s Journey into Linux Containers(译者/刘崇鑫 审校/朱正贵、李子健 责编/仲浩)