Apple 近期在 GitHub 上开源了一个名为 container 的工具,用于在 Mac 上创建和运行 Linux 容器。该项目用 Swift 编写,专门针对 Apple silicon 进行了优化,目前已获得 41.5k star。
仓库地址:https://github.com/apple/container
什么是 container?
container 是一个命令行工具,可以让你在 Mac 上构建、运行 Linux 容器,并与 OCI 标准容器镜像仓库交互。它支持拉取和推送 OCI 兼容的容器镜像,你构建出来的镜像也能在其他任何 OCI 兼容的工具中运行。
底层实现上,container 依赖 Apple 同步开源的 Containerization Swift package,负责容器、镜像和进程的底层管理。
与 Docker Desktop 的核心区别
一般在 macOS 上跑 Linux 容器,通常的做法是启动一个共享的 Linux 虚拟机,把所有容器都塞进去跑。container 的做法不同——每创建一个容器,就启动一个独立的轻量虚拟机。这个设计带来了几个具体的好处:
安全性:每个容器拥有完整 VM 级别的隔离,使用的核心工具和动态库集合极小,攻击面大幅缩减。
隐私性:使用 container 挂载宿主机数据时,只需把必要的数据挂进对应的 VM。用共享 VM 的方案时,你需要把所有"将来可能用到"的数据一次性挂进 VM,再在容器内选择性挂载。
性能:container 创建的容器比完整 VM 占用的内存更少,启动时间与跑在共享 VM 里的容器相当。
系统架构
container 深度集成了 macOS 的核心框架:
- Virtualization framework:管理 Linux 虚拟机及其挂载的设备
- vmnet framework:管理容器接入的虚拟网络
- XPC:进程间通信
- Launchd:服务管理
- Keychain services:镜像仓库凭据存取
- 统一日志系统:应用日志
在进程组织上,CLI 通过客户端库与 container-apiserver 通信。container-apiserver 是一个 launch agent,执行 container system start 后启动,container system stop 后终止。它启动时会拉起两个 XPC helper:container-core-images 负责镜像管理和本地内容存储,container-network-vmnet 负责虚拟网络。每创建一个容器,都会再启动一个 container-runtime-linux helper,专门暴露该容器的管理 API。
安装与使用
系统要求:需要 Apple silicon Mac,官方支持 macOS 26,不支持更旧版本的 macOS(macOS 15 可以运行,但存在网络隔离、多网络、IP 地址分配等已知限制,官方不会修复)。
从 GitHub release 页面 下载最新的签名安装包,双击安装,按提示输入管理员密码(安装目标路径为 /usr/local)。
安装完成后,启动系统服务:
container system start
升级时需先停止服务,再执行更新脚本:
container system stop/usr/local/bin/update-container.shcontainer system start
如需降级,先卸载再指定版本安装:
/usr/local/bin/uninstall-container.sh -k # -k 保留用户数据/usr/local/bin/update-container.sh -v 0.3.0
当前限制
内存回收:macOS Virtualization framework 对 memory ballooning 的支持不完整。VM 内 Linux 进程释放的内存页目前无法归还给宿主机。如果跑了大量内存密集型容器,可能需要定期重启容器来降低内存占用。
项目现状
该项目目前处于活跃开发阶段。在达到 1.0.0 之前,稳定性仅在 patch 版本之间有保障(如 0.1.1 到 0.1.2),minor 版本升级可能包含 breaking change。
项目基于 Apache-2.0 协议开源,欢迎贡献。
仓库地址:https://github.com/apple/container