1.jpg

基于高度虚拟化所诞生的容器技术,如今已经走向大规模应用。那么容器、虚拟机、Docker、Openstack、Kubernetes 之间又有什么关系,对现在的选择有什么影响呢?

上世纪 60 年代,计算机是一种稀有商品。即便只租不买,每月也要花一千多美元,这使许多企业都无法承受。而且早期的计算机通常专用于某一项特定的任务,需要同时在许多用户之间共享计算机资源,并且可能花费几天甚至几周的时间才能运行完毕。俗话说:“需求是发明之母”,有了需求人们就会去发明创造来满足需求。计算机的历史也不例外,过于昂贵的费用和长时间的共享需求刺激了虚拟化的逐渐发展。

Docker 与容器

于需求刺激,容器技术应运而生。容器的发展从 Chroot,FreeBSD jails,OpenVZ,LXC,到如今的 Docker、Rocket 真正走向了大规模应用。

2.png

△ 容器技术发展史(图片来源:pivotal.io)

相比普通服务器,容器是一种更轻量级,更灵活的虚拟化处理方式,它将一个应用程序所需的一切打包在一起。一般情况下开发人员在编写代码时,他们是在自己本地的开发环境中工作;当他们准备将代码移至生产环境时,总会发生一些意想不到的事情。原因多种多样:不同的操作系统,不同的依赖项,不同的库。

而容器解决了可移植性这一关键问题,它可以将代码与运行它的环境分开。开发人员可以将应用程序(包括正确运行所需的所有库)打包到一个小的容器镜像中。该镜像可以在其他任何计算机上运行。

Docker 的兴起

虽然 Docker 经常会和“容器(Container)”一词相提并论,但是 Docker 本身并不是容器。从字面意思可以解读,“Container”原译为“集装箱”,而“Docker”被译为“码头工人”。

Docker 是一个开源的应用容器引擎,是创建容器的工具。让开发者可以打包他们的应用和依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器或 Windows 机器上。

2013 年 PyCon 大会之后,Docker 迅速成为社区、客户和更广泛行业的实际标准与基石。Docker 的强大之处在于它通过可移植的形式和易于使用的工具,在应用程序和基础设施之间创造了独立性,使得容器技术大众化,并使容器技术成为主流。

3.png

△ Docker Logo(图片来源:docker.com)

Docker 如此大火,但是我们需要知道,Docker 并不是唯一的,也不是第一个出现的容器平台。其他的框架,例如 OpenVZ 和 LXC(Linux Container),于 2000 年中期就已经开始使用。而 FreeBSD jails,则可以追溯到更远的年代。Docker 是在 2013 年发布的,与当今大多数主流的容器技术相比,它是非常年轻的。

虽然 Docker 不是最成熟的,却引起了极大的关注。这是因为 Docker 是一个扩展的 Linux 容器(LXC),是一种独特轻巧、以应用为中心的虚拟化工具。它大大降低了企业开销,也更容易让企业在服务器上部署软件。且 Docker 允许系统管理员和开发人员在容器中构建任何应用程序,节省资源。

除此之外,Docker 发展迅猛的原因还有:

  • Docker 从一开始就是开源的,这使得 Docker 在行业内有了强大的吸引力。直到 2013 年,行业才开始将“开源”视为软件生产的默认模式。

  • Docker 出现在了正确的时间。到 2013 年,虚拟机似乎已经成为了过时的技术。大家一直在寻找一种更精简,更方便的方式来部署应用程序,而这时 Docker 出现了,它恰好符合要求。

  • Docker 使用的另一个主要重点是 DevOps。DevOps 在 2010 年初开始流行,它强调了软件交付的敏捷性、灵活性和可扩展性。Docker 恰好为根据 DevOps 部署应用程序提供了合适的环境。


Docker 与 OpenStack

容器和虚拟机这两种技术经常被互相比较。所谓虚拟机(Virtual Machine)是指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。

Docker 可能被认为是当前容器技术的代表,而作为虚拟机技术的代表,OpenStack 也被大众所周知。

OpenStack 是一个开源的云计算管理平台项目,是一系列软件开源项目的组合。它不是一个软件,而是一个云平台管理的项目。这个项目由几个主要的组件组合起来完成一些具体的工作。其中主要包括:

  • Nova(Compute):在 OpenStack 环境中计算实例(即创建的云主机)的生命周期管理。按需响应包括生成、调度、回收虚拟机等操作。

  • Neutron(Networking):确保为其它 OpenStack 服务提供网络连接即服务。

  • Swift(Object Storage):通过基于 HTTP 的应用程序接口存储和任意检索的非结构化数据对象。

  • Glance(Image service):存储和检索虚拟机磁盘镜像,OpenStack Compute 会在实例部署时使用此服务。

4.png

△ OpenStack 构成(图片来源:openstack.org)

许多人都会常用 Docker 和传统虚拟机来做比较,并且经常凸显出 Docker 的优势。其实这和 OpenStack 没有直接关系。曾经许多的性能测试都会将 Docker 与 KVM 进行对比,但是后来发现这些测试是通过 OpenStack 运行的,这表明两种技术其实可以很好地协同工作。

那么如果使用了 Docker,还能使用 OpenStack 吗?

答案是可以的,Docker 以最简单的形式提供了一个容器,用于管理共享基础架构上的应用程序,同时又使它们彼此隔离。而虚拟机则通过创建一个完整的操作系统来完成类似的工作。OpenStack 的官方文档(https://wiki.openstack.org/wiki/Docker)特别提供了部署 Docker 的解决方案,并且单独指出:“容器并非旨在替代虚拟机,它们是互补的,因为它们更适合特定的用例。”

5.png

△ OpenStack & Docker 架构图(图片来源:openstack.org)


Docker 与 Kubernetes

如果第一次看到 Kubernetes 这个词,可能会比较好奇它为何简写为 K8S。其实是 k 与 s 中间正好隔了 8 个字母,K8S 为一种偷懒地写法。Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

作为容器编排的解决方案,随着 Kubernetes 越来越流行,“Kubernetes” 与 “Docker” 这两个词也经常会相提并论。

6.png

△ Kubernetes Logo(图片来源网络)

目前,Kubernetes 可以说是市场领导者,及编排容器和部署分布式应用程序的标准化方法。Kubernetes 可以在公共云服务或本地运行,具有高度模块化,开放源代码,并且拥有一个活跃的社区。许多云厂商也都已经提供了 Kubernetes 作为服务。

当然了,Docker 和 Kubernetes 并不是竞争对手。Docker 是一个容器化平台,而 Kubernetes 是 Docker 等容器平台的协调器。它旨在为容器提供高效地管理,监视应用程序的运行状况,使应用程序提供不间断地服务,而不需要运维人员去进行复杂的手工配置和处理。

云计算技术发展至今,从最开始的硬件虚拟化、IaaS、OpenStack、PaaS、容器到如今的 Serverless,云计算已经越来越接近应用逻辑。容器实现了应用的分装,方便了应用在不同环境间的迁移,轻量级的特性又使它能够消耗更少的资源而带来更大的便利。当然,技术更新迭代迅速,我们只有不断学习才能跟上行业的步伐,加油吧,小伙伴们!