Apple 官方下场做容器,一天涨 1611 stars,Swift 写的、专为 Apple Silicon 优化。
读完本文你将了解:实际安装步骤 | 与 Docker Desktop 的本质区别 | lightweight VM 的技术原理 | 值不值得现在换。
🎯 这个项目解决什么问题?
你在 Mac 上跑容器,大概率用的是 Docker Desktop——一个装完就 4GB+、后台默默吃 CPU、订阅政策反反复复的庞然大物。Mac 用户用了十年,期间出过 Lima、Colima、OrbStack 几波替代品,但都是"民间方案",缺少官方背书。
apple/container解决的就是这个问题:Apple 自己下场,给 macOS 开发者一个原生、轻量、官方支持的容器运行时。
它不只是又一个 Docker 替代品。它的设计前提是:Apple Silicon 上的虚拟化能力(Virtualization.framework + macOS 26 的新调度优化)已经足够好,不需要再套一层 Linux VM + Docker daemon。每个容器直接跑在一个轻量 VM 里——隔离性接近 VM,启动速度接近原生进程。
简单说:Docker Desktop = 一个大 Linux VM 里跑很多容器;apple/container =每个容器一个微型 VM,互相硬隔离。
🔧 快速上手
系统要求(先看这里)
- ✅必须 Apple Silicon Mac(M1/M2/M3/M4)
- ✅必须 macOS 26(用到了新版虚拟化和网络栈,旧系统不支持也不修)
- ❌ Intel Mac 用户请绕道
安装步骤
- 去 GitHub Releases 下载签名安装包(
.pkg) - 双击安装,输入管理员密码(会装到
/usr/local) - 启动系统服务:
container system start跑你的第一个容器
# 拉镜像container image pull alpine:latest# 跑一个交互式 shellcontainer run-italpine:latestsh# 跑个 nginx 试试container run-d--nameweb-p8080:80 nginx镜像走 OCI 标准,Docker Hub 上的镜像直接能拉,不用换 registry。
升级和卸载
# 升级前先停服务container system stop /usr/local/bin/update-container.sh# 卸载(保留用户数据)/usr/local/bin/uninstall-container.sh-k# 卸载(连数据一起删)/usr/local/bin/uninstall-container.sh-d⚠️ 踩坑提示
- macOS 26 以下别装——Apple 明确说不会修旧版的兼容问题
- 目前还在0.x 版本(README 写 “minor version 之间可能 breaking change”),生产环境慎用
- 网络配置和 Docker 不完全一致,复杂的 compose 项目搬过来可能需要调整
⚙️ 技术原理:为什么是 lightweight VM 而不是 namespace?
这里是 apple/container 最核心、也最有意思的地方。
Docker 的老路:共享 Linux Kernel
经典 Docker 在 Linux 上的模型是:所有容器共享宿主机的 kernel,用 namespace + cgroup 做隔离。轻量、快,但隔离性弱——一旦 kernel 出漏洞,所有容器都受影响。
在 Mac 上呢?因为 macOS 没有 Linux kernel,Docker Desktop 的做法是:先在 Mac 上起一个 Linux VM,然后在这个 VM 里跑 Docker daemon。所有容器都挤在同一个 VM 里,性能损耗、内存占用、启动慢都跟这个架构有关。
apple/container 的新路:每个容器一个微型 VM
apple/container 跳出了这个框架:每个容器都是一个独立的轻量 VM,由 Apple Silicon 的硬件虚拟化能力直接拉起。
这件事在性能上能跑通,全靠两个底层突破:
- Apple Silicon 的硬件虚拟化效率——M 系列芯片的虚拟化指令几乎无开销,启动一个空白 VM 的时间已经压到亚秒级
- macOS 26 的新虚拟化调度——可以并发管理大量小 VM,资源回收很快
与 Docker Desktop 的对比
| 维度 | Docker Desktop | apple/container |
|---|---|---|
| 架构 | 单个大 Linux VM + Docker daemon | 每容器一个微型 VM |
| 隔离性 | namespace 隔离(弱) | VM 硬件隔离(强) |
| 启动速度 | 需要先启 VM,daemon 常驻 | VM 即开即用 |
| 内存占用 | 持续占用(VM 不释放) | 按需分配,关掉就释放 |
| 镜像格式 | OCI 兼容 | OCI 兼容 |
| 跨平台 | macOS / Windows / Linux | 仅 macOS 26+ Apple Silicon |
最大的取舍是通用性 vs 集成度——Docker Desktop 跨平台、生态成熟,apple/container 专注一个平台但深度优化。
🏗️ 架构分析
apple/container 自己是个 CLI 工具,真正的底层工作交给了同期开源的apple/containerizationSwift 包:
┌─────────────────────────────────┐ │ container CLI(用户接口) │ ← Swift 写的命令行 ├─────────────────────────────────┤ │ containerization (Swift Pkg) │ ← 容器、镜像、进程管理 ├─────────────────────────────────┤ │ Virtualization.framework │ ← macOS 系统级 API ├─────────────────────────────────┤ │ Apple Silicon Hardware │ ← 硬件虚拟化 └─────────────────────────────────┘几个设计亮点
- CLI 和底层库分离:containerization 是独立的 Swift 包,理论上别的工具也能直接调用它来管容器,不一定非走 CLI
- OCI 兼容是第一公民:不搞自己的镜像格式,直接吃 Docker Hub、GHCR 的现成镜像
- 没有 daemon 常驻:传统 Docker 有个 dockerd 进程一直跑,apple/container 是按需启停
container system start/stop,更"Mac 原生"
不够好的地方
- 生态缺失:没有 docker-compose 直接对应,多容器编排目前要靠脚本
- Linux 镜像才能跑:还是基于 OCI Linux 镜像,跑 Windows 容器免谈
- 版本不稳定:0.x 阶段,README 自己写了"minor 版本可能 breaking"
- macOS 锁死:只能在 macOS 26+ Apple Silicon 上用,团队里有 Intel Mac 或 Linux 同事的话不通用
✅ 优缺点 & 适用场景
三个优点
- 官方背书:Apple 自己维护,不用担心订阅政策变脸或者项目突然停更
- 隔离性强:每容器一个 VM,安全敏感场景下比 namespace 隔离踏实得多
- 真正的 Mac 原生:Swift 写的,跟系统调度、资源管理深度整合,没有"塞了一个 Linux VM 在那里"的别扭感
两个缺点
- 平台锁死:macOS 26 + Apple Silicon 双重门槛,团队协作可能出问题
- 生态还薄:compose、kubernetes 等周边工具链需要时间适配
谁应该立刻试试
- 个人开发者:只在 Mac 上写代码、本地跑容器,已经升 macOS 26 的,可以马上换过去试
- 隐私/安全敏感场景:需要强隔离跑不可信容器的,VM 隔离比 namespace 香
- 被 Docker Desktop 订阅政策折磨过的人:终于有官方平替了
谁应该再等等
- 生产环境团队:0.x 版本,等到 1.0 稳定再说
- 跨平台团队:Linux/Windows 同事还得用 Docker,统一性更重要
- 重度依赖 compose / k8s 工作流:周边工具还没跟上,硬切换不划算
一点想法
apple/container 不是又一个 Docker 替代品。它在做一件更长远的事——把容器从"Linux 上的进程隔离"这个原始定义里抽出来,变成一个跨平台的运行时抽象。Apple 用自己的硬件虚拟化能力,证明了"每容器一个 VM"在性能上是可行的,这件事本身就在重新定义容器的形态。
对 Mac 开发者来说,这是十年来第一个官方答案。对整个容器生态来说,这是 Apple 第一次正式参与游戏。
值得看,值得等,但短期不必着急换。
项目地址:https://github.com/apple/container