为什么容器对 OpenStack 来说很重要?

LXC是历史上第一个试图普及容器化技术的工具。和Linux容器生态系统的其他工具一起,LXC成为了容器化系统中被广泛采用的工具。它完成了一套系统API让Linux内核的容器特征能够被用户层使用:在不脱离Linux标准下通过共享内核,LXC在chroots和虚拟机之间构建了一个体系结构。

Docker

Docker是最具有吸引力的一种容器技术,它易于理解,可快速启动,运行方式简单,同时带来了容器编排工具的一个巨大生态系统。

从工程角度,Docker通过API实现,它有自己的服务端(daemon),命令行客户端以及从注册中心到精美UI界面等大量可以使用的工具。

Docker的强大在于之前提到的chroot、进程分组、进程隔离等功能都可以通过它的一些命令来实现。在其他容器化技术中开发人员或者管理人员需要频繁手动操作的一些事情,例如拉取补丁、工具与部署等,在Docker中已经不在需要,因为所有的操作都封装在了命令行客户端工具 docker 中。

客户端和REST API都是与Docker服务端进行交互,它是可以远程访问的一个标准可接入守护进程,用来接收和处理所有的请求。这个守护进程负责在Docker宿主机之上操控镜像和容器,并已经通过IANA官方确认,将端口绑定到tcp/2375和tcp/2376。

Docker最初基于LXC,但现在放弃了LXC,而使用Libcontainer。Libcontainer通过GO完全重写了用来抽象Linux内核虚拟化机制的基础库和API。

Open Container Initiative的细节

随着Docker的成功,引发了更多类似产品的出现:CoreOS的 Rkt、亚马逊的容器服务(Amazon Container Service)、Apcera的Kurma等等。这种分化发展不由让人担心容器技术领域的分裂,好在通过今年在旧金山举办的DockerCon15,这些组织已经开始共同努力,期望为容器创建统一的格式。这就是Open Container Initiative的由来,它基于Linux基金会,致力于为容器镜像和容器的运行制定标准化。通过Open Container规定格式创建的容器可以在不同的生态环境中共存。Open Container Initiative的成员包括了所有的容器参与者,例如亚马逊(Amazon)、CoreOS、谷歌、Oracle等等,当然也包括Docker。

Open Container的规格说明书(github地址为https://github.com/opencontainers/specs)还在制定过程中,鼓励所有的组织或者个人都可以参与其中。到目前为止依据不同平台和内容、工业级别交付流程以及自动化最小需求,规格说明书已经定义了一些容器的统一接口和标准。支持Open Container的所有企业将完全依赖这些规格说明书来制作容器。

同时,开发RunC运行库(github地址为https://github.com/opencontainers/runc)也是为了给各种容器提供统一运行库命令行工具的顶级封装器(而不是使用专有的命令,例如Docker的 docker 或者Rocket的 rkt)。

微服务

随着云计算的不断发展该利用容器做什么?在云计算中我们能看到的的微服务的不断发展。

在云上,整体的应用程序开发已经是过去的事情了,新的范例称为微服务体系结构。利用微服务,庞大的应用程序可以根据其诸多的功能进行解耦,分成多个微小且只有单一目的的服务,这些服务之间通过规定的接口进行通信,例如API。微服务被称为云计算中的乐高积木玩具。

在许多方面,容器都是实现微服务的一种杰出的技术:每一个容器化的微服务具有唯一的角色(数据库、队列、web服务器),然后使用容器编排工具(在许多容器开发生态系统中是非常有用的)使所有的容器相互通信来组装成整个应用程序。

上述方式有很多好处:可组合性、更快的工作流、功能的分离、可维护性和可升级性。进一步来讲,对微服务框架进行扩容变得更加容易。在不影响系统其他功能的前提下,微服务能够更加快速、更加容易地置换到更加高效的对等服务上,或者是当遇到问题时进行回滚处理。多种不同的技术都可以用来分离微服务,不同的团队可以根据自身手头上的任务来选择更加合适的技术。

一些大公司,像Amazon或者Netflix,在生产环境中已经有了一些基于微服务的应用程序。

因此,我们所具备的是借助容器技术能够在云环境上实现一种完美的程序设计范式,即微服务。

总结

对于软件程序和依赖关系来说,容器是一种轻量的可移植的工具。这么说看起来有些繁琐,但是容器真的改变了我们开发、部署和运行软件程序的方式。

Docker的发展是令人惊讶的,容器与云基础架构的结合也受到越来越多的关注。事实上,OpenStack有三个工程的核心组件都和容器有着密切关系:Kolla使用容器化服务来部署OpenStack、Murano使用Kubernetes提供一种简单的方式来部署容器化应用程序以及 Magnum为容器或者“容器即服务”提供了完整的编排系统。