Phil Karlton 有一句名言:“计算机科学界只有两个真正的难题——缓存失效和命名。”
对我们容器圈而言,我相信「命名」绝对配得上这句话。这毫无疑问是一件让老开发者沉默、让新人落泪的事情。仅就系统软件而言,我们当今比较通行地称为「Linux 容器技术」这个概念,它曾经用过的名字还有 Jail, Zone, Virtual Server, Sandbox 等。同样,在早期虚拟化的技术栈里也把一类虚拟机叫做容器,毕竟这个词本身就指代那些用来包容、封装和隔离的器物。它实在太过常见了,以至于以严谨著称的 Wikipedia,它的词条叫做「OS-Level Virtualization」(系统级虚拟化) ,从而回避了「什么是容器」这个问题。
在 2013 年,Docker 问世之后,容器这个概念伴随着不可变基础设施、云原生这一系列概念在随后的几年间以摧枯拉朽之势颠覆了基于“软件包 + 配置”这种细粒度组合的应用部署,用简单的声明式策略和不可变的容器就清爽地定义了软件栈。应用怎么部署,在这儿似乎有点离题了,我在这里想要强调的是:
“云原生语境下的容器,实质是「应用容器」——是以标准格式封装的,运行于标准操作系统环境(常常是 Linux ABI)上的应用打包——或运行这一应用打包的程序 / 技术。”
这个定义是我下的,但它并不是我的个人意志,是基于 OCI 规范这一共识写出来的。这个规范规定了容器之中应用被放到什么样的环境下、如何运行,比如说容器的根文件系统上哪个可执行文件会被执行,是用什么用户执行,需要什么样的 CPU,有什么样的内存资源、外置存储,还有什么样的共享需求等等。
所以说,标准格式的封装、标准的操作系统环境在一起以应用为中心就构成了应用容器的打包。
以这个共识为基础,就可以来说说安全容器了。当年,我和我的联合创始人赵鹏使用「虚拟化容器」这个名字来命名我们的技术的,不过为了博人眼球,我们用了「Secure as VM, Fast as Container」这样的 Slogan,于是,被容器安全性问题戳中心坎的人们立刻用「Secure Container」或者说「安全容器」来称呼这种东西了,一发而不可收。虽然在我们的内心里,这个技术是一层额外的隔离,它只是安全中的一环,但是呢,用户还是愿意用安全容器这个名字来称呼它。我们给安全容器下的定义就是:
安全容器是一种运行时技术,为容器应用提供一个完整的操作系统执行环境(常常是 Linux ABI),但将应用的执行与宿主机操作系统隔离开,避免应用直接访问主机资源,从而可以在容器主机之间或容器之间提供额外的保护。
这就是我们的安全容器。