无数的文章、社交媒体在探讨Docker、Kubernetes、Mesos三者之间孰优孰劣。如果你听信了某些一知半解者的言论,你可能会认为这三个开源项目正在为争夺容器霸权而殊死战斗。同时,你也会相信,在这三者间的选择无异于对其所奉宗教的信仰,而且真正的信徒敢于大胆和异教徒作斗争,并且拥护自己的信仰。
那些都是扯淡。
虽然这三种技术都可以使用容器来部署、管理和扩展应用程序,但实际上它们每个都侧重解决不同的问题,并且扎根非常不同的环境之上。事实上,这三种被广泛采用的工具链彼此完全不同。
与其比较这些快速演进的技术的重叠特性,不如让我们回顾一下每个项目的原始任务、架构以及它们之间如何相互补充和交互。
让我们从Docker开始
今天的Docker公司脱胎于一个平台即服务的初创公司dotCloud。dotCloud团队发现,在许多应用程序和客户之间管理依赖关系和二进制文件需要做大量的工作。因此,他们将Linux cgroups和namespaces的一些功能组合成一个简单易用的包,这样应用程序就可以在任何基础设施上持续运行。这个包就是Docker镜像,它提供以下功能:
1.将应用程序和库封装在单个包中(Docker镜像),因此应用程序可以跨多环境一致部署;
2.提供类似于git的语义,例如“dockerpush”,“docker commit”,这样可以让应用程序开发人员可以轻松地采用新技术,并将其融入到现有的workflow中;
3.将Docker镜像定义为不可变层,启用不可变的基础设施。提交的更改被存储为一个单独的只读层,这让镜像复用和跟踪更改变得更加容易。另外,层还可以通过传输更新而不是整个镜像来节省磁盘空间和网络流量;
4.通过使用可以临时存储运行时更改的可写层来实例化不可变映像,从而方便快速部署和扩展应用程序的多个实例。
随着Docker的风靡,开发人员开始从笔记本电脑转移到在生产环境中运行。这就需要借助工具来协调这些容器,我们称为容器编排。有趣的是,Apache Mesos的马拉松称为当时(2014年6月)第一个支持Docker镜像的容器编排工具(我们将在下面详细描述它)。就连Docker创始人、首席技术官Solomon Hykes也推荐Mesos为“生产集群的黄金标准”。不久之后,除了马拉松之外,许多容器编排技术出现了,这其中包括:Nomad、Kubernetes、DockerSwarm(现在是Docker引擎的一部分)。
随着Docker开始商业化开源文件格式,该公司也开始引入工具来补充核心Docker文件格式和runtime引擎,包括:
1.Dockerhub
2.Docker registry
3.Docker cloud
4.Dockerdatacenter
Docker让开发者可以打包他们的应用以及依赖包到一个可移植的容器中的特性,使其成为软件行业的游戏规则改变者;这有点类似mp3格式帮助重塑了音乐产业。Docker文件格式成为行业标准,并且领导容器技术供应商(包括Docker、Pivotal, Mesosphere以及其他许多)成立CNCF和OCI。今天,CNCF和OCI的目标就是确保跨容器技术的互操作性和标准化接口,并确保使用任何工具构建的Docker容器,都可以在任何runtime或基础设施上运行。
Kubernetes
谷歌很早就认识到Docker镜像的潜力,并试图在谷歌云平台上交付“容器编排即服务”。谷歌在容器方面有丰富的经验(他们在Linux中引入了cgroups),但是现有的内部容器和像Borg这样的分布式计算工具与它们的基础设施直接耦合。因此,谷歌没有使用现有系统中的任何代码,而是从头开始设计了Kubernetes,以编排Docker容器。Kubernetes于2015年2月发布,并提出以下目标和考虑:
1.为应用程序开发人员提供一个强大的工具,用于Docker容器编排,而不必与底层基础设施交互;
2.跨云环境下,为一致的应用程序部署经验和APIs 提供标准部署接口和原型;
3.构建一个模块化的API核心,允许供应商围绕核心Kubernetes技术集成系统。
截至2016年3月,谷歌向CNCF捐赠了Kubernetes,至今谷歌仍是该项目的主要贡献者(其次是Redhat、CoreOS等)。
Kubernetes对应用程序开发人员非常有吸引力,因为它减少了对基础设施和操作团队的依赖。供应商也非常喜欢Kubernetes,因为它提供了一种简单的方式来让他们拥抱容器运动,并为他们运行自己的Kubernetes部署提供一个商业化解决方案。Kubernetes之所以很有吸引力,因为它是CNCF下的开源项目,与Docker集群相比,后者虽然是开源的,但却受到Docker Inc .的严格控制。