我会告诉你一个秘密:让我的应用程序走向世界的DevOps云计算之类的东西对我来说仍然有点神秘。但随着时间的推移,我意识到了解大规模机器扩展和应用程序部署的来龙去脉对于开发人员来说是非常重要的知识。这类似于成为一名专业音乐家,当然你肯定需要知道如何使用你的乐器,但是,如果你不知道录音室是如何工作的,或者如何适应交响乐团,那么你就是在这样的地方工作一个环境会变得很艰难。在软件开发的世界中,将您的代码引入我们更大的世界与将其写出来一样重要。DevOps很重要,而且很重要。因此,为了弥合开发(Dev)和部署(Ops)之间的差距,我将从头开始介绍容器技术。为什么是容器?因为有强有力的证据表明容器是机器抽象的下一步:让计算机成为一个地方而不是一个东西。了解容器是我们共同的旅程。在本文中,我将介绍容器化背后的概念。涵盖容器和虚拟机之间的区别,以及构建容器背后的逻辑以及它如何适应应用程序架构。我将探讨轻量级Linux操作系统如何融入容器生态系统。我还讨论了使用图像来创建可重用的容器。***我将介绍容器集群如何使您的应用程序快速扩展。在后面的文章中,我将逐步引导您完成将示例应用程序容器化的过程,以及如何为您的应用程序容器创建托管集群。在此过程中,我将向您展示如何使用Deis将示例应用程序部署到本地系统和各种云提供商上的虚拟机。开始吧。虚拟机的好处要了解容器如何适应事物,您首先需要了解它们的前身:虚拟机。虚拟机(VM)是在物理主机上运行的软件抽象。配置虚拟机就像购买计算机:您需要定义所需的CPU、RAM和磁盘存储数量。配置机器后,您可以加载操作系统,以及您希望虚拟机支持的任何服务器或应用程序。虚拟机允许您在单个硬件主机上运行多台模拟计算机。这是一个简单的图表:虚拟机允许您充分利用您的硬件资源。您可以购买一台大而可靠的机器并在其上运行多个虚拟机。您可以拥有一个数据库VM和一个由许多VM组成的集群,这些VM运行相同版本的自定义应用程序。您可以用有限的硬件资源获得很大的可扩展性。如果您觉得需要更多虚拟机并且您的主机硬件有容量,您可以根据需要添加任意数量的虚拟机。或者,如果不再需要虚拟机,可以关闭虚拟机并删除虚拟机映像。虚拟机的局限性然而,虚拟机确实有局限性。如上图,假设你在一台主机上创建了三个虚拟机。主机有12个CPU、48GB内存和3TB存储空间。每个虚拟机配置有4个CPU、16GB内存和1TB存储空间。到目前为止,一切都很好。楼主有这个能力。但是这里有一个缺陷。分配给虚拟机的所有资源,无论它们是什么,都是专用的。每台机器都分配有16GB的内存。但是,如果第一个虚拟机从未使用超过1GB的已分配内存,则剩余的15GB会浪费在那里。如果第三个虚拟机仅使用分配的1TB中的100GB,则剩余的900GB空间被浪费了。这里没有资源流动。每个虚拟机都分配有所有资源。因此,在某种程度上,我们又回到了虚拟机之前,将您的大部分资金花在未使用的资源上。虚拟机还有另一个缺点。让它们运行起来需要很长时间。如果您的基础设施需求正在快速增长,即使添加虚拟机是自动的,您仍然会发现很多时间浪费在等待机器上线。到达:从概念上来说,一个容器就是一个Linux进程,Linux认为它只是一个正在运行的进程。该过程只知道它被告知的内容。另外,在容器化方面,容器进程也被分配了自己的IP地址。这个非常重要。重要的事情说三次,这是第二次。在容器化方面,容器进程有自己的IP地址。一旦获得IP地址,该进程就是主机网络上的可识别资源。然后,您可以在容器管理器上运行命令,将容器IP映射到主机上可公开访问的IP地址。建立该映射后,就所有意图和目的而言,容器是可在网络上访问的独立机器,在概念上类似于虚拟机。这是第三步,容器是一个单独的Linux进程,具有不同的IP地址,使其在网络上可识别。这是一个示意图:容器/进程以动态、协作的方式共享主机上的资源。如果容器只需要1GB的内存,它只会使用1GB。如果它需要4GB,它将使用4GB。CPU和存储利用率也是如此。CPU、内存和存储空间的分配是动态的,与典型虚拟机的静态方法相反。所有这些资源的共享由容器管理器管理。***,容器启动非常快。所以,容器的优势在于:你得到了虚拟机独立性和封装性的好处,摒弃了静态资源独占的缺陷。此外,由于容器可以快速加载到内存中,因此在扩展到多个容器时可以获得更好的性能。容器托管、供应和管理托管容器的计算机运行一个精简版的Linux,只剩下基本要素。今天,流行的主机底层操作系统是前面提到的CoreOS。当然还有其他的,比如RedHatAtomicHost和UbuntuSnappy。这个Linux操作系统由所有容器共享,减少了容器占用空间中的重复和冗余。每个容器仅包含特定于该容器的部分。这是一个示意图:您可以使用所需的组件配置容器。容器组件称为层。层是容器镜像(您将在后面的部分中看到更多关于容器镜像的信息)。你从一个基础层开始,它通常是你想在容器中使用的操作系统。(ContainermanagersonlyprovidethepartoftheOSyouwantthatdon'texistinthehostOS.)当你构建你的容器配置时,你添加层,比如Apache如果你想添加一个web服务器,如果为容器要运行脚本,需要添加PHP或Python运行环境。分层非常灵活。如果您的应用程序或服务容器需要PHP5.2,您可以相应地配置容器。如果您有其他应用程序或服务需要PHP5.6,没问题,您可以使用PHP5.6配置容器。与虚拟机不同,更改运行时依赖项的版本需要您进行大量配置和安装;对于容器,您只需在容器配置文件中重新定义层。上述容器的所有各种功能都由一个称为容器管理器的软件控制。目前,最好的容器管理器是Docker和Rocket。上图显示了一个主机场景,其中容器管理器是Docker,主机操作系统是CentOS。容器是由镜像组成的当你需要将我们的应用程序构建到容器中时,你必须编译镜像。一个图像代表一个容器模板,您的容器需要它来完成它的工作。(容器可以在容器内部,如下图所示)。图像存储在注册表中,可通过网络访问。从概念上讲,注册表对于使用Java的人来说就像Maven存储库,对于使用.NET的人来说就像NuGet服务器。您将创建一个容器配置文件,其中列出您的应用程序需要的图像。然后使用容器管理器创建一个容器,其中包含您的应用程序代码和从容器注册表下载的一些资源。例如,如果您的应用程序包含一些PHP文件,您的容器配置文件将声明您将从注册中心获取PHP运行环境。此外,您使用容器配置文件来声明需要复制到容器文件系统的.php文件。容器管理器将有关您的应用程序的所有内容封装到一个容器中,该容器将在容器管理器的管理下在主机上运行。这是容器创建背后的概念图:让我们仔细看看这个图。(1)表示一个容器配置文件,它定义了你的容器需要什么以及你的容器是如何构建的。当你在主机上运行一个容器时,容器管理器会读取配置文件,从云端的注册表中获取你需要的容器镜像,并且(2)将镜像作为一个层添加到你的容器中。另外,如果需要其他镜像来组成镜像,容器管理器也会把这些镜像拿来做图层添加。(3)容器管理器将需要的文件复制到容器中。如果你使用一个供应服务,比如Deis,你刚刚创建的应用程序容器被镜像,并且(4)供应服务会把它部署到你选择的云供应商,比如AWS和Rackspace云供应商。集群中的容器都很好。这是一个很好的例子,说明容器如何提供比虚拟机更好的配置灵活性和资源利用率。然而,这还不是全部。容器真正的灵活性在于集群。请记住,每个容器都有一个唯一的IP地址。因此,它可以放在负载均衡器后面。将容器放在负载均衡器后面将其提升到另一个层次。您可以在负载均衡的容器后面运行容器集群,以获得更高的性能和高可用性计算。下面是一个示例:假设您开发一个资源密集型应用程序,例如图像处理。使用类似Deis的容器配置技术,您可以创建一个包含图形应用程序和图形应用程序所需的所有资源的容器镜像。然后,您可以将一个或多个容器镜像部署到主机上的负载均衡器。创建容器镜像后,您可以随时使用它。当系统繁忙时,可以增加更多的容器实例来满足手头的工作。这里有更多好消息。您无需在每次向环境中添加实例时手动配置负载均衡器来接受您的容器映像。您可以使用服务发现技术让容器告诉平衡器它可用。然后,一旦知道,平衡器就会将流量分配到新节点。将它们放在一起容器技术完成了虚拟机缺失的部分。CoreOS、RHELAtomic和Ubuntu等Snappy主机操作系统与Docker和Rocket等容器管理技术的结合使容器越来越受欢迎。尽管容器变得越来越普遍,但要掌握它们还需要一段时间。但是一旦掌握了它们,就可以使用像Deis这样的配置技术来简化容器的创建和部署。从概念上理解容器与进一步了解并实际使用它们来完成工作一样重要。但我认为如果不将这个想法付诸实践,这个概念是很难理解的。因此,我们进入本系列的下一阶段:创建一些容器。
