有无数的文章、讨论和社交网络上的交流在比较 Docker、Kubernetes 和 Mesos。
如果只听取部分信息,你会以为这三个开源项目正在为容器世界的霸权而决战。你也可能认为,选择其一几乎是一个宗教选择;真正的信徒维护他们的信仰,烧死胆敢考虑其它替代品的异端者。
这都是呓语。
虽然三种技术都让利用容器进行部署、管理和扩展应用程序成为可能,其实它们各自解决不同的问题,植根于非常不同的环境背景。事实上,这三种被广泛采用的工具链里,没有彼此完全相同的。
与其比较这几项快速发展的技术的重叠特性,不如让我们重新审视每个项目的原始使命、架构、以及它们如何互相补充与交互。
今天的 Docker 公司,起始于一家平台即服务(Platform-as-a-Service,PaaS)初创公司,叫做 dotCloud。dotCloud 团队发现,为大量应用程序和大量客户去管理软件依赖和二进制文件需要许多工作量。因此他们将 Linux cgroups 和命名空间(Namespace)的功能合并为一个独立的易用的包,以便应用程序能在任何基础设施上无差别的运行。
这个包就是 Docker 镜像,它提供以下功能:
-
将应用程序和库封装进一个包(Docker 镜像),应用程序可以一致地部署在多个环境;
-
提供类似 Git 的语义,如 “docker push”、“docker commit”,让程序开发人员能轻松的采用新技术,并纳入其现有工作流;
-
将 Docker 镜像定义为不可变层,支持不可变基础设施。发布的变动保存在单独的只读层,让重用镜像和追踪变更变得容易。层还能通过只传输变更而不是整个镜像,节省磁盘空间和网络带宽;
-
用不可变镜像启动 Docker 容器实例,附带一个可写层来临时存储运行时更改,让应用程序快速部署和扩展变得容易。
Docker 越来越受欢迎,开发人员由在笔记本上运行容器,开始转为在生产环境运行容器。这需要额外工具在多机之间协调容器,即容器编排。有趣的是,运行于 Apache Mesos(下文详述)之上的 Marathon 是支持 Docker 镜像(2014年6月)的首批容器编排工具之一。那一年,Docker 的创始人兼 CTO Solomon Hykes 称赞 Mesos 为“生产集群的黄金标准”。不久,除运行于 Mesos 之上的 Marathon,还出现了许多容器编排技术:Nomad、Kubernetes,毫不意外,还有 Docker Swarm(现在是 Docker Engine 的一部分)。
随着 Docker 对开源文件格式进行商业化,该公司还开始引入工具来补充核心的 Docker 文件格式和运行引擎,包括:
-
Docker hub 用作公共 Docker 镜像存储;
-
Docker registry 用作内部 Docker 镜像存储;
-
Docker cloud,用于构建和运行容器的托管服务;
-
Docker datacenter 作为商业产品内置提供众多 Docker 技术。
Docker 很有远见,它将软件以及相关依赖封装到了一个包中,这种方式颠覆了软件行业规则;正如 mp3 帮助重塑了音乐行业一样。Docker 文件格式成为行业标准,主要的容器技术厂商(包括 Docker、Google、Pivotal、Mesosphere 等)成立了 Cloud Native Computing Foundation (CNCF) 和 Open Container Initiative (OCI)。
今天,CNCF 和 OCI 旨在确保容器技术之间的互操作性和标准接口,并确保使用任何工具构建的 Docker 容器可以运行在任何运行环境和基础架构上。
Google 很早就认识到了 Docker 镜像的潜力,并设法在 Google Cloud Platform 上实现容器编排“即服务”。Google 虽然在容器方面有着深厚的经验(是他们在 Linux 中引入了 cgroups),但它现有的内部容器和 Borg 等分布式计算工具是和基础设施紧密耦合的。
因此,Google 没有使用任何现有系统的代码,而是重新设计了 Kubernetes 对 Docker 容器进行编排。Kubernetes 是在 2015 年 2 月正式发布的,它的目标和构想是:
-
为广大应用开发者提供一个强大的工具来管理 Docker 容器的编排,而不再需要和底层基础架构进行交互;
-
提供标准的部署接口和元语,以获得一致的应用部署的体验和跨云的 API;
-
建立一个模块化的 API 核心,允许厂商以 Kubernetes 技术为核心进行系统集成。
2016 年 3 月,Google 向 CNCF 捐赠了 Kubernetes,直到今天仍然保持着在这个项目的贡献者中首位的位置(其后是红帽,CoreOS 等)。
来源:wikipedia
应用开发者对 Kubernetes 产生了很大的兴趣,因为 Kubernetes 降低了他们对基础架构和运维团队的依赖。厂商也很喜欢 Kubernetes,因为它让拥抱容器化技术变的简单,并为客户部署自己的 Kubernetes 提供了商业解决方案 (这是很有价值的事情)。Kubernetes 吸引大家的另外一个原因是,它是 CNCF 旗下的开源项目,这与 Docker Swarm 完全不同,Docker Swarm 尽管是开源的,但是却被 Docker 公司牢牢地掌控着。
Kubernetes 的核心优势是为应用开发者提供强大的工具来编排无状态的 Docker 容器。虽然已经有了多个提议,希望扩大这个项目的范围(比如数据分析和有状态的数据服务),这些提议仍然处于非常早期的阶段,能不能成功我们还需要保持观望。
Apache Mesos 是加州大学伯克利分校为了研发新一代集群管理器而发起的项目,它借鉴了 Google Borg 系统和 Facebook’s Tupperware 系统中大规模、分布式计算架构的相关经验,并把它应用到了 Mesos 上。