容器技术生态概览

从chroot,control groups,lxc,warden,一路走到如今的docker、rocket、windows container、hyper,容器技术才算是真正的走向了大规模应用。详细的容器技术发展历史可以参考下面这篇文章

容器技术发展历史

本文主要从宏观的角度,梳理Docker与hyper这两种container runtime及其相关生态的一个关系,帮助感兴趣的人建立一个整体的印象。

Docker

Docker一路走来,从独立发展到参与开放容器规范的建设,自身架构也在不断调整与完善,逐渐走向了更加规范和生态化的道路。宏观上看,Docker Engine是一种client/server架构,server端,也即是daemon,由一个后台常驻进程dockerd构成。对外提供REST API,整体架构如下图所示。


自1.11版本起,Docker全面调整模块架构,成为了第一个符合OCI规范的容器运行时。具体来说,Docker Engine目前是基于containerd和runc构建的。下面详细介绍相关OCI规范、runC、containerd。

什么是OCI规范

OCI(Open Container Initiative)致力于建立一个容器运行时和镜像格式的规范,其核心目的在于避免容器生态的分化,确保在不同容器引擎上构建的容器可以相互兼容。这是容器可移植性的根本保证。虽然Docker目前是容器的事实规范,但随着时间的推移,会不断涌现一些其他的容器引擎,这个时候就很有必要来定义一下“什么是一个容器”,保证不同的实现遵循一些共同的东西。这既是OCI期望做的事情。

  • runtime spec

OCI Runtime Specification,主要定义如何container配置、执行环境以及container生命周期。

  • image spec

OCI Image Format Specification,主要定义一个OCI image由一个manifest, 一个image index (optional), 一组filesystem layers, 以及一个configuration组成。该规范的目的在于确保能构建一套不同容器引擎间可互操作的工具,用于镜像的构建、传输,以及镜像运行准备工作。

有关OCI详细资料,可参考其官方网站

什么是runC

在早期的Docker Engine中,主要用LXC工具来运行和管理容器;后来采用自研的libcontainer来做这类事情,libcontainer直接使用Linux内核提供的相关隔离技术,比如cgroups、namespace等等。

runC是一个轻量级的工具,做且只做一件事情,那就是运行一个容器。由libcontainer演变而来,并且由Docker捐献给Linux基金会,作为OCI的参考实现。

有关runC详细资料,可参考其github repo

什么是containerd

2016年12月14日,Docker公司宣布将containerd从Docker Engine中分离,并捐赠到一个新的开源社区独立发展和运营,"一个工业标准的容器运行时,注重简单、 健壮性、可移植性"。containerd可以作为daemon程序运行在Linux和Windows上,管理机器上所有容器的生命周期。

Docker 1.11的Docker Engine里就包含了containerd,而现在则是把containerd从Docker Engine里彻底剥离出来,作为一个独立的开源项目独立发展,目标是提供一个更加开放、稳定的容器运行基础设施。和原先包含在Docker Engine里containerd相比,独立的containerd将具有更多的功能,可以涵盖整个容器运行时管理的所有需求。

containerd并不是直接面向最终用户的,而是主要用于集成到更上层的系统里,比如Swarm, Kubernetes, Mesos等容器编排系统。containerd以Daemon的形式运行在系统上,通过unix domain docket暴露很低层的gRPC API,上层系统可以通过这些API管理机器上的容器。每个containerd只负责一台机器,Pull镜像,对容器的操作(启动、停止等),网络,存储都是由containerd完成。具体运行容器由runC负责,实际上只要是符合OCI规范的容器都可以支持。

  • 整体架构
  • 模块分层

有关详细信息可参考官网github项目主页

Docker如何组合上述组件

先看上面这张图,docker目前被分成了4个独立部分,engine管理镜像,通过containerd,containerd调用containerd-shim,containerd-shim调用runc启动容器。containerd只与容器打交道。图中列出的每个组件,都有一个独立的二进制可执行文件与之对应,如下所示


Kubernetes on Docker

基本的容器runtime还远远不能满足大规模应用的需求,典型的诉求就是容器的编排管理系统,Docker公司自身的swarm,google的kubernetes,以及mesos marathon就是这类编排系统。经过这几年的发展,kubernetes大有一统江湖的趋势,kubernetes本身与docker的结合方式也在不断的变化,自身的定位也逐渐在往通用性容器编排调度系统发展,所以k8s一直在探索如何兼容更多的container runtime,CRI就是在这种背景下诞生的。

CRI

从1.5版本开始,kubernetes引入了CRI(Container Runtime Interface),可参考Introducing Container Runtime Interface (CRI) in Kubernetes,其核心目的在于通过一种标准的方式来集成各种不同容器runtime。并且是一种可插拔的架构,可以在不改变kubernetes的前提下,使用不同的container runtime。在CRI之前,不同的container runtime(docker/rkt等)集成到kubelet是通过在kubelet中实现一个高层接口来完成的,之前叫做OCID,CRI-O则是完全聚焦与OCI兼容的container runtime和container images。

CRI-containerd

CRI-containerd则是基于containerd的CRI实现,目前是kubernetes的一个孵化项目,kubernetes 1.8中已进入beta版本。主要用于替代前期基于dockerd的CRI实现。

  • kubelet从dockershim向cri-containerd迁移


  • CRI-containerd架构
    [图片上传失败...(image-c3ebe5-1517490845623)]

所以在这种新型架构下,kubelet直接通过基于containerd的CRI实现(CRI-containerd)与docker-containerd交互,以实现container的管理。

hyper container

鉴于docker是共享宿主机的内核,所以在安全性方面有天然的弱势。传统的虚拟机则属于内核相互隔离的。那么能否结合二者的优点呢,答案就是hyper container。

hyper container主要有4部分构成,hyperctl客户端,hyperd,hyperkernel,hyperStart。整体架构如下图所示


hyper container直接使用OCI镜像规范,hyper的runtime是基于hypervisor的runV,兼容OCI runtime规范,但是由于hypervisor和container的天然区别,OCI中有部分规范在hyper里是没有的,详情可参见github项目主页。

类似hyper的还有intel开源的clearcontainers

小结

容器生态正在走向规范化,结和虚拟机和container二者优势的hyper正在快速发展,编排系统kubernetes正在稳步成熟,周边生态也在不断完善,CNCF家庭成员也在不断壮大,微服务理念也逐步深入人心,service mesh技术正在高速发展...一切值得期待

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容

  • Docker — 云时代的程序分发方式 要说最近一年云计算业界有什么大事件?Google Compute Engi...
    ahohoho阅读 15,418评论 15 147
  • 虽然不是神笔马良, 但手中的这支笔最是真爱啊!!! 随手来几套不同风格的手迹。。 ️ ✒️✏️️️️✒️ ✒️✏️...
    april_wyj阅读 168评论 0 0
  • (一) 到此时此刻我才发现,假使密度可以无限大,我的生活里,总是有难以言喻的空洞感。两个钟头前,公寓里跳了闸,于是...
    反造神阅读 410评论 4 5
  • 怎么办?心疼你,“我从来都不认识你,就像自己从来不认识自己一样”感觉你喜欢的那个人好幸福啊祝福你,希望你心里可以一...
    帅zyc阅读 166评论 0 1