过去大家在苹果电脑上跑容器,像先租一套合租房,再给每个程序分一张床。苹果偏不,它给每个箱子单独办了一居室。我觉得,苹果把容器重新定义成了微型虚拟机。

这不是文字游戏。传统容器的思路,是几户人家共用一块操作系统底盘;到了苹果电脑上,常见做法也不过是先起一台 Linux(服务器常用的操作系统)虚拟机,再让所有容器进去合租。苹果新出的 container(苹果开源的容器工具)干的事更狠:每个容器自己带一台轻量虚拟机,自己有门,自己有锁,自己有门牌,连底盘都尽量独立。

所以这件事的反常识,不是“苹果终于会做容器了”,而是“苹果把虚拟机瘦成了容器的样子”。别人说容器比虚拟机轻;苹果这次说,不,我让虚拟机轻到你以为它是容器。

这背后不是工程师的洁癖,是苹果一贯的边界政治。数据中心的机器像营房,陌生程序合住一层楼,能跑就行;个人电脑却是住家,里面有照片、合同、密码、聊天记录。营房可以大通铺,卧室不会。苹果受不了一群来路不同的镜像,共用同一套底盘,再顺着挂载目录和网络到处串门。

于是它把“容器”改成了更像苹果的东西:精简过的内核,极小的根文件系统,启动快到几乎像开灯;每个容器可以拿独立地址,不必永远靠端口转发假扮自己;你只把需要的目录挂进去,不用先把整套家当搬进一栋共享的大楼;甚至连内核版本,都可以按容器换。说得刻薄一点,这已经不是传统意义上的容器工具,而是一套披着容器语法的微型虚拟机编排术。

凌晨一点,望京一间合租房里,小程要测一个网页服务、一个缓存服务、一个命令行工具。老办法像宿舍楼:三个人共用厨房和下水道,谁把锅烧糊了,整层楼都闻得到。苹果这套不是。三个容器像三间独立单间,各吃各的内存,各拿各的地址,各关各的门。你在系统监视器里看到的,不再是一头共享的 Linux 巨兽,而是一排小屋同时亮灯。

下午四点,静安一家公司要跑第三方发来的报销镜像。传统做法往往是先把整套项目目录放进那台共享的 Linux 楼里,再从楼里挑一间房给这个镜像。苹果的做法更像门卫发钥匙:你只给它报表目录,别的文件连楼门都没进。隐私从来不是发布会上的形容词,隐私是少给陌生程序一把钥匙。

晚上十点,某团队追一只只在旧内核上出现的故障。合租楼里,换内核像给整栋楼掀屋顶;苹果这套里,你可以给这个容器单独换底盘,构建老镜像时,甚至还能借 Rosetta(苹果的指令翻译层)去照顾旧架构。到这一步,“容器”这个词已经有点客气了。它表面是箱子,骨头里却是虚拟机。

这就是我真正想说的判断:苹果不是来补一门“如何把 Linux 那套搬到苹果电脑上”的课,它是在重写“容器”两个字的户口本。Linux 世界里,容器首先是效率;苹果世界里,容器先过边界审查。前者关心多少服务能塞进一栋楼,后者关心谁该拿钥匙、谁该有门锁、谁出了事别连累邻居。

技术史上,很多词都会被发明两次。第一次是工程师给它命名,第二次是平台公司给它改规矩。容器这个词,轮到苹果来改规矩了。货箱本来只是装货的,苹果却给每个货箱焊上了门、轮子、发动机和锁。你可以说它不像你熟悉的容器;我倒觉得,正因为它不像,判断才更要说死一点:苹果把容器重新定义成了微型虚拟机。

文中涉及的机制依据 Apple 官方资料:https://github.com/apple/containerhttps://github.com/apple/containerizationhttps://github.com/apple/container/blob/main/docs/technical-overview.md