Linux 容器技术史话:从 chroot 到未来

Linux容器是一个在单一Linux主机上提供多个隔离的Linux环境的操作系统级虚拟技术。不像虚拟机(VM),容器并不需要运行专用的访客(guest)操作系统。容器们共享宿主机的(host)操作系统内核,并使用访客操作系统的系统库来提供所需的功能。由于不需要专用的操作系统,因此容器要比虚拟器启动快得多。

VirtualMachinesVsContainers

VirtualMachinesVsContainers

(图片来自:DockerInc.)

容器借助Linux内核的Namespaces、Apparmor、SELinux情景模式(profile)、chroot和CGroup等功能来提供类似于虚拟机的隔离环境。Linux的安全模块可以确保正确地控制容器对宿主机和内核的访问,从而避免各种入侵活动。此外,在宿主机上可以运行不同的Linux发行版,只要它们运行在同样的CPU架构下。

简单来说,容器提供的是一种基于各种Linux发行版创建容器镜像的方法、一套管理容器生命周期的API、与该API交互的客户端工具、保存快照的功能、在宿主机之间迁移容器实例的能力,等等。

容器历史

以下是容器简史,内容来自维基百科及其它来源:

1979—chroot

容器的概念始于1979年的UNIXchroot,它是一个UNIX操作系统上的系统调用,用于将一个进程及其子进程的根目录改变到文件系统中的一个新位置,让这些进程只能访问到该目录。这个功能的想法是为每个进程提供独立的磁盘空间。其后在1982年,它被加入到了BSD系统中。

2000—FreeBSDJails#p#分页标题#e#

FreeBSDJails是最早的容器技术之一,它由R&DAssociates公司的DerrickT.Woolworth在2000年为FreeBSD引入。这是一个类似chroot的操作系统级的系统调用,但是为文件系统、用户、网络等的隔离增加了进程沙盒功能。因此,它可以为每个jail指定IP地址、可以对软件的安装和配置进行定制,等等。

2001—LinuxVServer

LinuxVServer是另外一种jail机制,它用于对计算机系统上的资源(如文件系统、CPU处理时间、网络地址和内存等)进行安全地划分。每个所划分的分区叫做一个安全上下文(securitycontext),在其中的虚拟系统叫做虚拟私有服务器(virtualprivateserver,VPS)。

2004—SolarisContainers

SolarisContainers支持在x86和SPARC系统,首次出现在2004年2月发布的Solaris10的build51beta上,其后完整发布在2005年的Solaris10上。SolarisContainer是由系统资源控制和通过zones提供的边界分离(boundaryseparation)所组合而成的。zones是一个单一操作系统实例中的完全隔离的虚拟服务器。

2005—OpenVZ

OpenVZ类似于SolarisContainers,它通过对Linux内核进行补丁来提供虚拟化、隔离、资源管理和状态检查(checkpointing)。每个OpenVZ容器都有一套隔离的文件系统、用户及用户组、进程树、网络、设备和IPC对象。

2006—ProcessContainers

ProcessContainers是由Google在2006年实现的,用于对一组进程进行限制、记账、隔离资源使用(CPU、内存、磁盘I/O、网络等)。后来为了避免和Linux内核上下文中的“容器”一词混淆而改名为ControlGroups。它被合并到了2.6.24内核中。这表明Google很早就参与了容器技术的开发,以及它们是如何回馈到社区的。

2007—ControlGroups

如上面所述,ControlGroups(即cgroups)是由Google实现的,并于2007年加到了Linux内核中。#p#分页标题#e#

2008—LXC

LXC的意思是LinuXContainers,它是第一个最完善的Linux容器管理器的实现方案,是通过cgroups和Linux名字空间(namespace)实现的。LXC存在于liblxc库中,提供了各种编程语言的API实现,包括Python3、Python2、Lua、Go、Ruby和Haskell。与其它容器技术不同的是,LXC可以工作在普通的Linux内核上,而不需要增加补丁。现在LXCproject是由Canonical公司赞助并托管的。

2011—Warden

Warden是由CloudFoundry在2011年开发的,开始阶段是使用的LXC,之后替换为他们自己的实现方案。不像LXC,Warden并不紧密耦合到Linux上,而是可以工作在任何可以提供隔离环境的操作系统上。它以后台守护进程的方式运行,为容器管理提供了API。请参考Warden文档和这个博客文章了解更多。

2013—LMCTFY

lmctfy的意思是“让我为你包含(LetMeContainThatForYou)”。这是一个Google容器技术的开源版本,提供Linux应用容器。Google启动这个项目旨在提供性能可保证的、高资源利用率的、资源共享的、可超售的、接近零消耗的容器(参考自:lmctfy演讲稿)。现在为Kubernetes所用的cAdvisor工具就是从lmctfy项目的成果开始的。lmctfy首次发布于2013年10月,在2015年Google决定贡献核心的lmctfy概念,并抽象成libcontainer,因此,lmctfy现在已经没有活跃的开发了。

lincontainer项目最初由Docker发起,现在已经被移交给了开放容器基金会(OpenContainerFoundation)。

2013—Docker

Docker是到现在为止最流行和使用广泛的容器管理系统。它最初是一个叫做dotCloud的PaaS服务公司的内部项目,后来该公司改名为Docker。类似Warden,Docker开始阶段使用的也是LXC,之后采用自己开发的libcontainer替代了它。不像其它的容器平台,Docker引入了一整个管理容器的生态系统,这包括高效、分层的容器镜像模型、全局和本地的容器注册库、清晰的RESTAPI、命令行等等。稍后的阶段,Docker推动实现了一个叫做DockerSwarm的容器集群管理方案。

2014—Rocket#p#分页标题#e#

Rocket是由CoreOS所启动的项目,非常类似于Docker,但是修复了一些Docker中发现的问题。CoreOS说他们的目的是提供一个比Docker更严格的安全性和产品需求。更重要的是,它是在一个更加开放的标准AppContainer规范上实现的。在Rocket之外,CoreOS也开发了其它几个可以用于Docker和Kubernetes的容器相关的产品,如:CoreOS操作系统、etcd和flannel。

2016—WindowsContainers

微软2015年也在WindowsServer上为基于Windows的应用添加了容器支持,它称之为WindowsContainers。它与WindowsServer2016一同发布。通过该实现,Docker可以原生地在Windows上运行Docker容器,而不需要启动一个虚拟机来运行Docker(Windows上早期运行Docker需要使用Linux虚拟机)。

容器的未来

截止到今天(2016年1月),在行业内有一个显著趋势,部署软件应用从虚拟机逐渐移到了容器。其主要的原因是容器相比于虚拟机而言更加灵活和低消耗。Google已经使用容器技术好多年了,它在Borg和Omega容器集群管理平台上可以成规模地运行Google应用。更重要的是,Google为容器领域贡献了cgroups的实现和参与了libcontainer项目。Google也在过去这些年借助容器在性能、资源利用和整体效率方面取得了巨大收益。最近,一直没有操作系统级的虚拟化技术的微软,也在WindowServer上迅速采取动作实现了对容器的原生支持。

Docker、Rocket以及其它的容器平台并不能以一个单一主机运行在产品环境中,原因是这样面临着单点故障。当一组容器运行在一个单一宿主机时,如果宿主机失效,所有运行在该宿主机上的容器也会失效。要避免这个问题,应该使用容器宿主机集群。Google借助其在Borg中取得的经验,开发了一个叫做Kubernetes的开源容器集群管理系统。Docker也启动了一个叫做DockerSwarm的解决方案。目前这些解决方案还都处于相当早期的阶段,也许需要几个月或来年才实现完整的功能集合,才能变得稳定,从而广泛应用于行业内的产品环境中。

微服务(Microservices)是另一个突破性技术,在软件架构上可以将容器用于部署。微服务并不是一个新东西,只是一个相比标准的Web服务超快的轻量级Web服务。这是通过将功能单元(也许是一个单一服务或API方法)打包到一个服务中,并内嵌其到一个轻量级Web服务器软件中实现的。#p#分页标题#e#

通过对上面的介绍,我们可以预测接下来几年,容器也许会替代虚拟机,某些情况下也许会全部取代。去年我为一些企业在POC层面上实现了基于容器的解决方案。也有人想要在产品环境中尝试它们,这一天也许在容器集群管理系统进一步成熟后很快到来。

转载于:http://www.itxuexiwang.com/a/liunxjishu/2016/0228/178.html?1456820003

0

相关推荐