Container 容器技术开源项目综述

2016-02-28

2015年容器大火,围绕着容器技术的发展也涌现了许多新项目。同时,许多“老”项目也开始支持容器作为运行环境。下面介绍这些项目:

一、规范标准类容器使用了Linux内核的特性,Docker的成功也主要在于其充分挖掘了此类特性。但Docker流行之后,社区开始思考怎么定义一套完整的容器规范标准,使容器的规范不再局限于Docker。同时,Docker仅仅定义了一个容器,多容器的互联也需要规范标准。下面提到的项目是目前主流的标准,有的并非为容器而生,但也在为容器规范化做出努力。


1. OCF


OCF(Open ContainerFormat)是由OCI(Open Container Initiative)发布的一套容器规范和运行时环境,其初步版本基于Docker镜像和运行时,但是最终目的是定义一套不受任何软硬件平台、不受任何公司和项目束缚的容器标准。OCI由各大厂商组成,包括谷歌、红帽、华为等。OCF对标准容器规范指定了5条规则: 

- 标准化操作:例如,创建容器、删除容器、打包容器等操作都必须标准化; 

- 内容无关性:不管容器内部内容是什么,上述操作不能有任何行为上的变化; 

- 平台无关性:在任何OCI支持的平台上,上述操作都必须能够无差别执行; 

- 为自动化而设计:标准容器是为自动化而生,其规范必须满足自动化条件; 

- 企业级交付:标准容器需要适用于企业级流水线交付任务。 下面简要介绍OCF标准。目前,OCI定义一个容器包含如下内容: 

├── config.json 

├── runtime.json 

├── rootfs/ 

config.json表示与容器相关的配置,例如启动容器之后执行的命令,容器的环境变量等 

runtime.json表示与host相关的配置,例如对cgroup、namespace的支持 rootfs表示容器可见的根目录,即容器中的“/”目录。OCF对其内容不作约束,常见的子目录有lib, bin等等。

任何基于OCF规范实现的命令行工具,都可以解析上述内容并管理容器,例如runC(https://github.com/opencontainers/runc),TODO。

目前为止,OCI主要精力集中在容器运行环境,之后,OCI还将对容器打包、验证、分发等模块进行标准化。总而言之,OCI是继Docker大火之后,社区对容器标准的一种尝试,现在已经得到非常多大公司的认可。


2. appC


appC是CoreOS提出的容器运行标准,早于OCF标准。CoreOS目前是OCI成员之一,在大力推进OCI的发展,appC和OCI最终可能会合并为一个标准。不同于OCI,appC更加成熟,其内容除了容器运行时环境,还包括:

-包规范:appC定义了如何将一个应用打包(tar文件),如何保持环境变量、挂载点等内容。相比之下,OCF仅定义了目录结构。

- 镜像验证:appC定义了如何验证镜像内容未被修改过,如何保证镜像安全传输;

- 镜像传输:appC定义了镜像传输的机制,包括https, bittorrent等,这一点与Docker的centralized hub有明显的区别。

目前基于appC规范已经有不少实现,如Jetpack, Kurma, rkt等。其中rkt是CoreOS对appC的标准实现。


3. Nulecule


Docker对应用的打包方式仅仅局限于单个容器层面,我们可以使用Dockerfile描述一个容器配置,然后打包、分发镜像,之后该容器便可以在任何Linux机器上运行。但是,Docker缺少一个多容器运行的标准:既如何描述一个由多容器组成的应用。目前一些基于Docker的集群管理系统已经能够支持多容器的部署,比如Docker Swarm,Kubernetes,但是这些系统并没有定义一个标准的、通用的、可移植的格式。此外,此类系统的特点是将多容器应用的部署当做系统的状态,即他们更多的是强调应用的调度、互联、监控,而非应用的部署。缺少复合应用的支持,使Docker的许多特点黯然失色,因为实际生产环境中的应用必然是由多应用构成的。例如:我们现在可以很方便地部署一个redis容器,但是部署redis cluster容器很困难,更不用说基于redis cluster的应用。

红帽公司在2015年提出了Nulecule,该项目定义了一个多容器应用部署的规范,包括应用的元数据、依赖、参数配置等等。应用发布者只需要依照Nulecule的规范提供应用的构成方式,然后将此构成方式打包成Docker镜像发布。Nulecule的打包方式可以参考:https://github.com/projectatomic/nulecule/tree/master/spec/examples/template。具体来讲,Nucecule包括以下文件: 

├── Dockerfile 

├── artifacts 

│ └──kubernetes 

│   ├── pod.json 

│   └── service.json 

├── Nulecule 

└── README.md 

Dockerfile将该目录所有文件打包成Docker镜像; Nulecule文件是具体的应用描述,例如每个组件的容器镜像,还包括上面提到的依赖、参数配置等; artifacts目录包括底层集群管理系统所使用的配置文件。 Nulecule本身只是一个规范文档,红帽公司基于Nulecule实现了Project Atomic,包括命令行工具atomic。运行一个应用和运行一个容器的方式几乎相同,例如:使用下述命令即可启动一个应用:“atomic run company/myapp:v0.1”。其中镜像`company/myapp:v0.1`为前文提到的打包后的Docker镜像。


4. TOSCA


TOSCA(Topology and OrchestrationSpecification for Cloud Applications),是OASIS维护的一套用于描述应用和基础设施的标准,包括服务组件类型、组件关系、操作方式(例如,部署,补丁,关机)等等。这些描述独立于创建服务的供应商、任何特定的云服务提供商或托管服务的技术。采用TOSCA标准的项目主要有OpenStack Heat,Cloudify等。

TOSCA并非为容器而生,有人将TOSCA和Nulecule做对比,认为Nulecule可以粗略地理解成容器版的TOSCA 。尽管有相似之处,但TOSCA包含了大量规范细则,涉及面非常广。


5. Cloud Native


经过长期发展,云计算领域逐渐认识到应用架构模式已经成为云计算发展的瓶颈,因此,国外几乎所有互联网公司联合成立了Cloud NativeComputing Foundation,来促进云计算的发展,旨在提高企业对上述模式的采纳程度。简单来讲,cloud native指的是:

- 容器为载体:使用容器作为应用运行、交付的载体,可以提高开发效率、增大代码重用率、简化部署等;

- 动态管理:建立一套中心管理系统(私有云或公有云)来动态调度容器、机器资源,提高运维效率,机器使用率;

- 微服务架构:利用服务依赖解耦合来提高敏捷性,降低代码维护开销。


二、项目类

本节综述了目前开源社区和互联网公司围绕容器技术开发的相关项目。这里只列举出了较为完善和流行的项目。


1. Docker Machine


Docker Machine是Docker公司为解决Docker安装、环境配置等问题而开发项目,现在已经支持10余种云平台和虚拟机软件,包括AWS、OpenStack、VirtualBox等。创建一个支持Docker的机器只需要使用命令:“docker-machine create –d virtualbox default” 。Docker Machine屏蔽了底层资源的复杂性,使得开发人员可以自动化创建、删除机器资源,尽可能地避免在平台差异性上消耗精力。


2. Swarm


Swarm是Docker公司为解决容器集群化而开发的项目。Swarm将多台主机抽象成一台主机,用户可以像使用一台主机般使用Docker。例如,当使用命令“docker run app”时,Swarm会根据集群状态将容器调度到一台远程的服务器运行,用户同样可以使用“docker ps”来查看当前容器状态。对于用户而言,Swarm的调度是透明的。

Swarm极大程度地兼容了Docker的API,同时有效地调度集群资源,向容器集群化迈出了一大步。Swarm还在不断开发中,需要解决容器互联、数据共享等迫切问题。


3. Compose


Compose是Docker公司解决容器编排的项目,其前身是Fig项目。Compose解决的问题类似Nulecule规范,既如何部署多容器应用。不管是Docker本身也好,Machine、Swarm等项目也好,都集中在了单容器应用,Compose很大程度上是对前面项目的补充。用户向Compose提交一个yaml文件,包含所有容器的配置,例如各自的端口、容器互联信息等;Compose根据该文件内容,启动容器。Compose的具体格式,可以参考:https://docs.docker.com/compose/yml

4. Mesos

Mesos是一套资源管理与调度平台,目前可以支持上千台机器的管理任务。Mesos对资源的管理方式是独有的两层调度:Mesos核心调度器负责管理所有机器资源,并为上层Framework提供计算资源。Framework是第二层调度器,它根据核心调度器提供的资源判断是否满足需求,如果满足需求,则运行Framework所管理的任务;否则重新像核心调度器申请资源。常见的Framework有Marathon, Chronos,分别负责长时间运行的服务和Cron任务,其他Framework还包括常用的大数据平台,例如Spark、Hadoop等。


5. Kubernetes


Kubernetes来自于Google内部的大规模集群管理工具Borg,根据官方说法“Kubernetes代表了Google过去十余年设计、构建和管理大规模容器集群的经验”。简单地说,Kubernetes是一个管理跨主机的容器化应用的系统,支持多容器部署、高可用性、应用弹性伸缩、跨主机网络、负载均衡、服务发现等应用级功能,同时支持集群自恢复机制、资源调度、资源隔离、监控等集群级功能。Kubernetes是目前唯一遵循“一切皆容器”的项目,既所有功能都是基于“应用容器化”实现,并稳定而快速地发展着。


6. Hyper


Hyper是HyperHQ公司发布了的一个开源项目,初衷是结合Docker容器和虚拟机的优点,可以在hypervisor上运行Docker镜像的引擎。根据Hyper官方的说法,他们与Docker的核心区别在于Hyper没有使用Container技术,而是通过VM直接运行Docker镜像,是一个完全基于虚拟化的解决方案。


7. Containerd


Containerd是docker公司开源项目,旨在为runC提供守护进程。Containerd沿袭了docker C/S的结构,server守护进程的核心是一个eventloop,负责监听容器的创建,销毁,快照等事件;client名为ctr,通过gRPC与server通信。

Containerd还处在非常早期的阶段,功能还并不完善。docker公司发布该项目的主要是表明其对容器生态环境的支持,也同时汲取runC高级特性对docker进行互补。

 

8. Clear Container


Clear Container是由intel推出的Clear Linux( Clear Linux是Intel提供的面向云场景的linux发行版)中的一项技术,通过将虚拟机和容器结合起来,旨在提供安全容器。官方宣称目标是让用户可以充分使用虚拟机的隔离,同时拥有容器的部署能力。

三、最小OS

1. RancherOS

RancherOS是Rancher Labs的一个开源项目,其宗旨是开发一个支持docker的最小化操作系统。在RancherOS中,所有应用都采用容器,包括系统程序udev, rsyslog等;同时,RancherOS用docker daemon取代了传统的初始化系统如sysvinit、systemd。承载初始化任务的docker daemon称为系统Docker,该系统docker会创建一个特殊的系统服务容器,即用户Docker,来负责管理用户的docker容器,避免了用户对系统docker容器的直接操作。具体系统结构可以参加github项目主页:https://github.com/rancher/os


2. CoreOS


CoreOS本身是Linux的一个发行版,但与其他发行版(如Centos、Ubuntu)有着很大的区别:CoreOS是为容器集群而生。不同于许多基于Linux做容器管理、编排系统的项目,CoreOS将这些功能并入了操作系统中。这样,每个装有CoreOS的主机就可以随时随地加入一个CoreOS集群而不需要额外配置。对开发人员而言,无论集群中有多少CoreOS主机,操作方法都是相同的。

CoreOS主要开发了两个项目来达到这一目的:etcd和Fleet。etcd是分布式的键值存储系统,主要负责CoreOS集群中节点间的服务发现和配置共享;etcd提供多种功能来保证集群的高可用性。Fleet是分布式的systemd系统。对用户而言,与操作单机systemd无差别,fleet会将用户的systemd unit动态分发到集群中。


3. Project Atomic


Project Atomic是红帽公司开发的操作系统,专门为运行容器而作了优化。Project Atomic采用docker运行容器、kubernetes管理容器,使用systemd做系统服务,rpm-ostree做系统包管理。其中rpm-ostree实现了Atomic升级,是红帽主推的功能之一。它的核心原理是升级操作系统是原子操作。Atomic会将需要升级的内容保存在专门的目录,分开存储,如此以来,Atomic可以将操作系统的变更进行版本控制,当出现问题,可以快速回滚到上一个版本。


4. Ubuntu Core


snappy Ubuntu是一个专为云平台和智能设备打造的全新ubuntu操作系统。Canonical公司对Ubuntu Core的核心优势做出以下几点评论:

- 安全——Snappy应用受Canonical的AppArmor内核安全系统限制,该系统提供了严格的、基于MAC的隔离和人性化的安全配置文件。

- 可靠性——Snappy可以提供可靠的更新,在自动修复安全问题的同时,它还能够更快地更新云上的服务器。

- 更好的开发体验——创建snappy Ubuntu应用比传统打包方式简单许多。

- 扩展性——Ubuntu Core支持许多模块化框架,它们可以由与Canonical合作的供应商提供。

ubuntu core包含四层:Application,Framework, Ubuntu Core和Enablement层。Application层将所有应用进行了隔离,因此用户可以下载安装任意的应用;fromework曾用来扩张ubuntu core,例如docker即是ubuntu core中的一个framework,为ubuntu core提供运行容器的框架。Ubuntu Core层即Canonical提供的最小OS,用户可以通过snappy命令行安装多个ubuntu core,来对系统进行原子更新。Enablement层是硬件层,由设备提供商或者Canonical公司提供。

Canonical公司有意将snappy安装模式引入到新的ubuntu桌面系统,使snappy包管理和debian packages (deb)共存。至于是否snappy会代替dpkg,还有待时间的考量


5. Microsoft Nano


Nano是Windows Server带来一个全新的Nano Server选项。这是微软配合Docker所产生的一个底层的OS. 据微软称,Nano Server体积非常苗条、极为精简,极佳优势,剥离了GUI,专注于云基础设施、云应用程序以及容器。


6. Vmware Photon


Vmare Photon是Vmware为vSphere而优化的Linux发行版,专门为运行容器而生,支持多项容器技术如docker, rkt和pivatal gardencontainer。Vmware Photon的设计也遵循了其他最小化OS,具有运行快,体积苗条,强化容器安全等优点。Photon的主要使用对象是采用了Vmware虚拟化技术的客户 - Photon可以使他们轻松地在已有的基础设施中运行容器,并得到企业级的支持。

点击体验,开启谷歌级数字化之旅
立即体验
立即咨询