查看原文
其他

容器入门知识ABC

2015-10-01 云头条

作者简介:Bob Reselman 目前是Edmunds公司的技术流程架构师。Edmunds公司是一家知名发布商,专门发布高容量、高可用性、最先进的、基于Java的网站,这些网站专门面向汽车消费者。


大概六个月前,我就开始注意到业界在容器方面的动静很大,容器被誉为是一种处理虚拟计算的新方法。我生性喜欢探究新技术,于是这几个开始研究容器技术的细枝末节。我可以告诉各位的是,容器是不会很快销声匿迹的一项重要技术。这个领域有许多玩家,新厂商一直在涌进来。如果你是与时俱进的开发人员,学会使用容器是职业生涯中必不可少的技能。


所以,本着倡导一种优秀技术概念的宗旨,我想回答下列问题,为各位介绍容器技术的基本知识:


  • 何谓容器?

  • 容器有何特别之处?

  • 该如何使用容器?


我希望,回答这些问题后,你对容器有一个基本的了解和认识,以便开发和部署代码时可以开始使用容器。


还是言归正传吧。


何谓容器?


容器技术是通过使用主机上的孤立进程,建立虚拟环境的一种方法。这种孤立进程就叫容器,它有自己的一套文件系统资源和从属进程。容器不会侵扰主机系统,主机系统也不会侵扰容器。


容器在主机内核上运行(见图1)。一个名为容器管理器的组件确保容器可以在主机上运行(文章后面对容器管理器会有详细介绍)。


图1:容器提供了运行孤立进程的功能,孤立进程在共享环境下有自己的资源。


容器有何特别之处?


想了解什么让容器如此特别,我们就需要审视虚拟机这个概念。虚拟机是一个模拟计算机的软件。虚拟机的优点在于,可以大大提高使用硬件的效率。你可以让好多虚拟机在单单一个硬件上运行(见图2)。


图2:如果你使用虚拟机,针对每个虚拟机的资源分配是固定的。


然而,虚拟机技术有其缺点。不妨看一下图2。你会注意到,在图中,三个虚拟机在一台计算机上运行,该计算机配备48 GB内存、12核处理器和3TB磁盘存储空间。每个虚拟机被分配了16 GB内存、4核和1TB存储空间。到目前为此很好。但是这里有个缺点。无论任何一个虚拟机使用它的全部资源,还是只是一小部分资源,硬件分配是静态的。换句话说,如果其中一个虚拟机使用的内存从不超过1GB,只存储100MB的文件系统,该虚拟机仍占用4 GB内存和整整1TB的存储空间,尽管该虚拟机只使用25%的内存和1%的存储空间。这就不太好。


另一方面,容器并不死死占用资源。你构建一个容器时,不用为它分配内存、处理器或存储空间。事实上,容器以共享方式使用主机上的内存、处理器和存储空间。只要物理机处理得了,可以将好多个容器装入到该物理机上。容器只有在需要资源时才占用所需的那部分资源。不存在资源分配是固定的说法。


好处不止这些。运行容器的硬件通常使用轻量版Linux作为操作系统。这个轻量级主机操作系统提供了内核级服务。CoreOS是流行的主机操作系统之一。还有其他主机操作系统,比如Ubuntu Snappy和Red Hat Atomic。


你在构建容器时,可以添加所选择的操作系统;比如说,你想使用Ubuntu。容器里面的Ubuntu操作系统会充分利用主机内核,不过会有属于Ubuntu一部分的程序包。比如说,虽然内核对软件包管理一无所知,但Ubuntu会提供软件包管理工具apt-get。此外,你可以配置容器,以便使用特殊的Web服务器和脚本解释器等等。结果就是,你获得了虚拟机提供的环境配置,又不因静态分配而死死占用主机系统上的资源。另外,容器会有一个主机里面可见的IP地址。因而,主机可以通过容器的IP地址,直接访问容器(见图3)。


图3:容器共享主机资源,并充分利用主机操作系统提供的内核级服务。


附文:使用Windows怎么样?

容器面临的一个约束是,无法混合搭配多个操作系统。在虚拟机领域,让Windows主机支持运行Linux的虚拟机或者让OS X系统运行Windows虚拟机相当常见。而容器就不是这样了;原因是,就本身而言,容器使用主机内核。因而,你要做到操作系统相互匹配。也就是说,Linux容器在Linux主机上运行。你可以在Windows Server(直至Windows Server 2016)上运行Windows容器。另外,还有Windows版的容器管理器:Docker。

要是你发现自己需要在Windows上运行Linux容器,总是可以在Windows下启动Linux虚拟机,使用Linux虚拟机作为主机系统。


该如何使用容器?


为了使用容器,你就要明白三个概念。第一个概念是容器管理器。第二个是了解容器层架构。第三个是容器注册中心。


容器管理器


容器管理器是一种工具,可用来构建容器、部署容器,让容器在主机上运行。截至本文截稿时,市面上最流行的容器管理器是Docker和Rocket。


容器管理器的工作方式如下:假设你用PHP编写了一个短小的Hello World Web应用程序。你要创建一个容器配置文件,你会在其中描述应用程序所需的PHP文件。同样在该配置文件中,你要定义应用程序所需的各层。在这里,假设你的应用程序需要PHP 5.6解释器,你想要在Apache网站服务器下运行。到时就可以通过容器管理器,发出命令来运行你的应用程序。容器管理器在后台会执行这些操作:(1)读取配置文件,确定需要从注册中心获得的各层;(2)创建容器映像;(3)添加应用程序源文件;以及(4)在主机上启动容器(见图4)。


图4:配置文件、映像和注册中心都是容器生态系统的一部分。


听起来觉得很简单?你可能会问:“层是什么?映像是什么?注册中心是什么?怎么回事?”这些问题提得好,有必要回答。下面我就逐一回答。


了解层和映像


容器由一个个层组成。层就是容器映像(没错,容器由其他容器组成这个概念一开始可能让人困惑)。可能先是操作系统底层。然后,你声明其他层,比如说Web服务器和脚本运行时环境。一旦定义好了容器,就可以在已定义容器的基础上构建映像。映像是容器的模板,你可以在一个或多个主机上重复使用它。


图5表明了主机运行CoreOS、使用Docker作为容器管理器的一种场景。有三个容器在主机上运行。一个容器使用Debian作为基本的操作系统层,Apache用作网站服务器,PHP 5.5用作脚本运行时环境,还使用自定义PHP应用程序(已为它构建了容器)。另一个容器用于额外的自定义PHP应用程序,使用nginx作为网站服务器,PHP 5.6作为脚本解释器,它们都在RHEL基本映像上运行。最后,第三个容器有一个JSP应用程序在Tomcat和Apache上运行,位于Ubuntu基本映像上。


图5:容器映像可以定义某个特殊主机为基本映像,然后分别为网站服务器、脚本运行时环境和脚本文件添加层。


正如你所见,每个容器都不一样。不过,它们都作为孤立进程而并行驻留在主机上,可以利用CoreOS内核。没有实施硬件分配机制。所有环境资源都可以共享。


了解注册中心


容器映像存储在注册中心里面。对熟悉Java框架的人而言,注册中心概念好比是Maven注册中心概念。而.NET环境中的类似技术就是NuGet服务器。


有许多公开的注册中心,你可以将容器映像存储在里面。Docker有Docker Hub,还有其他公开的注册中心。另外,如今出现了越来越多的私有注册中心提供商。


使用注册中心几乎自动会收到神奇效果。你告诉容器管理器运行容器后,它会检查配置文件,确定容器需要哪几个层,然后检查注册中心上面的所需层映像,或者是默认注册中心,或者是你定义的注册中心。容器管理器会组装你的容器从注册中心需要获取的几个层,然后将容器装入到主机上。


使用注册中心让你在容器映像方面拥有高度可重用性。另外,使用容器映像意味着,你可以扩展应用程序,如下文所示。


扩展容器


容器在需要根据需求扩增或缩减资源的动态环境下表现很出色。不像虚拟机要花很长时间才能装入到主机环境,容器可以迅速装入。装入迅速,加上无所不在的容器注册中心,这意味着你可以迅速构建起高可用性、负载均衡的环境。


请看一下图6。该图显示了基于容器的应用程序集群环境。如今,让负载均衡系统协调从同一映像生成的许多容器之间的负载相当常见。实际上,负载均衡系统本身可以是个容器。换句话说,你可以使用nxginx容器作为负载均衡系统,负责协调相同应用程序节点组成的集群之间的流量。


图6:你可以使用充当负载均衡系统的容器来管理应用程序容器集群。


现在怎么办?


容器生态系统在迅速发展壮大。比如说,有谷歌的开源项目Kubernetes,该项目提供了一个平台,可用于在企业层面,跨主机集群部署和扩展应用程序容器。另一个开源项目etcd让你可以共享容器之间的键值信息。如果你需要让容器使用统一的数据存储区或缓存,共享键值信息就很重要。还有fleet,它确保了这一点:如果你在诸多机器上运行许多同样的容器,其中一个机器出现故障,容器可以转移到另一个机器上。这在大规模计算环境下是一种非常有效的技术;在这种环境下,你的容器始终运行至关重要。这方面的项目和产品在迅速涌现。


正如我在文章开头所说,容器不会很快销声匿迹。实际上,微软、谷歌、IBM、红帽、亚马逊及其他许多知名科技公司已联合起来,组建了开放容器项目(Open Container Initiative),这是在Linux基金会下面成立的。设想一下:微软与Linux领导厂商合作。所以,如果雷德蒙德的人全力搭上容器这趟快车,容器进入到你我的世界只是个时间问题。所以,如果你还没有开始接触容器,现在正是时候。


新闻来源:developer.com|云头条翻译(未经授权谢绝转载)


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存