## CoreOS vs. Docker 容器大战引擎 文/雷伟 >选择哪个技术流派从某种意义上,也决定了选择哪种生态,这也是当前使用容器的公司面临的一大难题。本文将从容器引擎为切入点,说明这两大流派的历史、初衷和技术对比。 ### 容器引擎玩家知多少 看到这个标题,你的表情可能是这样滴“惊愕”。容器引擎不就是 Docker 么?这时,CoreOS 可能在后面默默地流泪,因为 CoreOS 的 rkt 也是玩家中的一员。虽然目前 Docker 的容器使用者相对更多,但 rkt 的发展也不可忽视。 ### Rocket 与 Docker 引发的站队 #### 前世 故事要从2013年开始说起。是的,Docker 公司在2013年发布了后来红遍大江南北的 Docker 产品,新技术带来一次革命,也带来新的市场机遇,CoreOS 也是其中的一员,在容器生态圈中贴有标签:专为容器设计的操作系统 CoreOS。作为互补,CoreOS+Docker 曾经也是容器部署的明星套餐。值得一提的是,CoreOS 为 Docker 的推广和源码社区都做出了巨大的贡献。 然而好景不长,CoreOS 认为 Docker 野心变大,与之前对 Docker 的期望是“一个简单的基础单元”不同,Docker 也在通过开发或收购逐步完善容器云平台的各种组件,准备打造自己的生态圈,而这与 CoreOS 的布局有直接竞争关系。 2014年底,CoreOS 的 CEO Alex Polvi 正式发布了 CoreOS 的开源容器引擎 Rocket(简称 rkt),作为一份正式的“分手”声明。当然,Docker 的 CEO Ben Golub 也在官网作出了及时回应,总体意思表明没有违背初心,但这些都是应用户和贡献者的要求而扩展的,希望大家能一起继续并肩作战。 图1  容器生态 图1 容器生态 #### 今生 当然,我们都知道了后来的事实,作为容器生态圈的一员,Google 坚定的站在了 CoreOS 一边,并将 Kubernetes 支持 rkt 作为一个重要里程碑,Docker 发布的 Docker 1.12版本开始集成了集群 Swarm 的功能。作为相亲相爱的一家人,Google 于2015年4月领投 CoreOS 1200万美元,而 CoreOS 也发布了 Tectonic,成为首个支持企业版本 Kubernetes 的公司。从此,容器江湖分为两大阵营,Google 派系和 Docker 派系。 而 CoreOS 除了 Rocket 和 CoreOS 外,也提供类似 Docker Hub 的 Quay 的公共镜像服务,也逐步推出容器网络方案 Flannel、镜像安全扫描 Clair、容器分布式存储系统 Torus(2017年2月在对应 GitHub 项目上表示停止开发)等优质的开源产品,包括早期的 etcd,各个产品都和 Kubernetes 有了很好的融合。 图2  容器组织 图2 容器组织 #### CNI & CNCF 在两大派系的强烈要求(对撕)下,2015年6月,Docker 不得已带头成立了 OCI 组织,旨在“制定并维护容器镜像格式和容器运行时的正式规范(OCI Specifications),以达到让一个兼容性的容器可以在所有主要的具有兼容性的操作系统和平台之间进行移植,没有人为的技术屏障的目标 (artificial technical barriers)”。在2016年8月所罗门和 Kubernetes 的 Kelsey Hightower 的 Twitter 大战中,所罗门透露出对容器标准化消极的态度。 有意思的是,同年(2015年)7月,Google 联合 Linux 基金会成立了最近国内容器厂商陆续加入的 CNCF 组织,并将 Kubernetes 作为首个编入 CNCF 管理体系的开源项目。旨在“构建云原生 计算并促进其广泛使用,一种围绕着微服务、容器和应用动态调度的以基础设施架构为中心的方式”。陆续加入 CNCF 的项目有 CoreDNS、Fluentd(日志)、gRPC、Linkerd(服务管理)、openTracing、Prometheus(监控)。 表1 常用功能对比 表1 常用功能对比 表2 安全对比 表2  安全对比 表3 兼容运行单元对比 表3  兼容运行单元对比 ### Docker 与 Rocket 的关系 接下来说说 Docker 和 Rocket 的一些对比。 Docker 和 Rocket 目前都遵循 OCI 标准,但两者对容器引擎的设计初衷有较大差异: - 功能边界 总的来说,CoreOS 认为引擎作为一个独立的组件,而 Docker 目前已发展成为一个平台,这也是 CoreOS 推出 Rocket 的官方原因之一。从功能角度来对比,Docker 提供了日志、镜像和管理,甚至在1.12版本集成了 swarm 集群功能。而 Rocket(rkt)的边界为在 Linux 系统上运行应用容器的功能组件。 - 容器安全 容器安全也是 CoreOS 一直诟病 Docker 的地方,Docker 自1.10后的版本在安全性上也在不断增强。以下从容器的安全方面,包含镜像、系统、容器运行时三部分横向对比。需要说明的是,镜像安全中镜像扫描也尤为重要,Docker Cloud 和 Docker Hub 提供在线漏洞扫描,CoreOS 也提供了 Clair 开源项目对接 CVE 库进行镜像的漏洞扫描。 - 兼容性 除了两者在功能和安全上的对比,为了用户方便评估,在兼容性上也稍作比较。可以看到,发布较晚的 rkt 在对 Docker 兼容性方面采用包容的态度,且 rkt 和 Kubernetes 保持一致,基本运行单元为 pod。 ### 总结 本文从历史的角度说明 rkt 的由来,及引伸的技术流派问题。同时,也对 Docker 和 rkt 从设计(功能、安全和兼容性)的初衷进行简单对比。如果单从 Docker 和 rkt 社区相比,Docker 目前热度更高,但后续如何发展,与其说是简单的 Docker 和 rkt 对比,倒不如说是两大技术流派的选择。 对于容器引擎的选择,虽然 rkt 在安全和兼容性设计上更胜一筹,但当前用户使用 Docker 较多,笔者分析主要也是以下原因: - 安装便利。对于企业常用的 OS,在 CentOS 中进行 yum 和 Ubuntu 中进行 apt-get,即可方便安装;同比,目前 CoreOS 官网信息表明,rkt 针对 CentOS 版本还不能使用在生产环境中,对 Ubuntu 也没有发布对应的安装包。另外,对于国内的网络环境,笔者科学上网后几经波折才下载到 rkt 的 release 版本。 - 社区活跃度。从两者在 Git Hub 中的数据,可以看到 Docker 社区无论在贡献者数量和提交次数上都比 rkt 社区要多,一定程度上也说明了两者用户的使用数量。这点和两者首个版本发布的时间有很大关系。 鉴于以上,建议容器平台使用者和学习者目前可以优先考虑 Docker 作为容器引擎,或是直接使用容器相关厂家提供的从容器引擎到容器云平台的整体解决方案。对于需要基于容器进行二次开发形成产品的容器厂家,尤其是基于 Kubernetes 提供服务的厂家,建议同时对 rkt 保持关注。