Apple 的 Container:Mac 上拥有 37K Stars 的类 Docker 体验
Apple 发布了 container,一款基于 Swift 的工具,可在 Mac 上使用轻量级虚拟机运行 Linux 容器。已获 37K stars,兼容 OCI,需要 macOS 26。
- 更新于 2026-06-15
Apple 的 Container:Mac 上拥有 37K Stars 的类 Docker 体验 #
2025 年 5 月 30 日,Apple 发布了 container 工具,开发者社区为之震动。没有发布会、没有主题演讲——只有一个孤零零的 GitHub 仓库,却悄无声息地积累了 37,130 颗 Stars,成为 Apple 多年来最受关注的开源新项目。
这不是 Mac 版 Docker。这是完全不同的东西。
container 是一款 用 Swift 编写的工具,它在 Mac 上通过 轻量级虚拟机 来运行 Linux 容器。它基于 macOS 的 Virtualization 框架构建,并与 macOS 系统组件(vmnet、XPC、Launchd、Keychain)深度集成。它生成和消费 OCI 兼容镜像,这意味着你的 Docker 镜像可以直接在这里运行,而用 container 构建的镜像也能在 Docker 中工作。
但它的架构与 Docker Desktop、Colima 或 OrbStack 从根本上不同。让我们来看看为什么开发者已经称它为「Mac 上容器化的未来」。
Apple 为什么要做这个 #
Apple 一直在 Mac 上为容器化问题所困扰。Mac 不原生运行 Linux,因此运行 Linux 容器始终需要一个 Linux 虚拟机——而这个虚拟机一直都很重。Docker Desktop for Mac 在底层使用完整的 Ubuntu 虚拟机,Colima 缩小了体积,OrbStack 让它更快。但它们都没有改变底层的根本架构。
container 走了一条不同的路:每个容器一个轻量级虚拟机。
这意味着每个容器都能获得完整的虚拟机级别隔离,而不必承担共享虚拟机的额外开销。不再有多容器之间的通信问题,不再有共享内核带来的攻击面,也不再存在从共享 Hypervisor 中「逃逸」的风险。
核心架构 #
container 不会在共享的 Linux 虚拟机内运行容器。相反,它利用 Apple 的 Virtualization 框架 为每个容器创建一个专属的轻量级虚拟机。在实际使用中,这意味着:
- 安全性:每个容器拥有完整虚拟机级别的隔离特性
- 隐私:你可以选择性地将必要的数据挂载进每个虚拟机
- 性能:启动时间与 Docker 容器相当,但具备虚拟机级别的隔离
该工具读取和生成 OCI 兼容的容器镜像,因此你可以从任何标准容器注册表中拉取和运行镜像——Docker Hub、GitHub Container Registry、Google Container Registry,只要是符合标准的都可以。
安装与设置 #
系统要求 #
你需要一台搭载 Apple Silicon(M1/M2/M3/M4)的 Mac,并且需要 macOS 26(或功能受限的 macOS 15)。这是一个硬性要求,因为 container 使用了 macOS 26 中 Virtualization 和 networking 框架的新特性。
# 从 GitHub Releases 下载最新安装程序
# https://github.com/apple/container/releases
# 安装签名后的安装包
# 双击并按照提示操作
# 启动系统服务
container system start
安装程序会将文件放置在 /usr/local 下,并通过 Launchd 将 container 注册为系统服务进行管理。
从源码编译安装 #
对于想要自行编译的开发者:
# 克隆仓库
git clone https://github.com/apple/container.git
cd container
# 按照 BUILDING.md 的说明操作
swift build -c release
swift test
项目使用 Swift Package Manager,并依赖于 Containerization Swift 包来处理底层的容器、镜像和进程管理。
核心功能 #
1. 运行容器 #
基本命令与 Docker 类似:
# 拉取并运行容器
container run --rm docker.io/python:alpine python --version
# 设置自定义内存和 CPU 限制
container run --rm --cpus 8 --memory 32g big
# 交互式 Shell
container run -it --rm docker.io/ubuntu bash
每个容器都在自己独立的轻量级虚拟机中运行。默认分配 1GB 内存和 4 个 CPU 核心,但你可以通过 --memory 和 --cpus 参数进行覆盖。
2. 构建镜像 #
构建镜像使用的是你早已熟悉的 Dockerfile 语法:
# 构建本地镜像
container build --tag myapp:latest --file Dockerfile .
# 构建多架构镜像
container build --arch arm64 --arch amd64 \
--tag registry.example.com/fido/web-test:latest \
--file Dockerfile .
# 尝试用特定架构运行
container run --arch arm64 --rm \
registry.example.com/fido/web-test uname -a
输出结果会显示虚拟机的内核信息:
Linux 7932ce5f-ec10-4fbe-a2dc-f29129a86b64 6.1.68 #1 SMP Mon Mar 31 18:27:51 UTC 2025 aarch64 GNU/Linux
3. 多平台构建 #
其中最强大的功能之一是跨平台镜像构建。你可以创建一个单一的镜像,同时在 Apple Silicon Mac 和 x86-64 服务器上运行:
# 构建多平台镜像
container build --arch arm64 --arch amd64 \
--tag myapp:latest .
# 推送到注册表
container push myapp:latest
生成的镜像可以在 Docker、Containerd 以及任何 OCI 兼容运行时中工作。
4. 卷管理 #
使用 --volume 或 --mount 将主机文件共享给容器:
# 使用 --volume 挂载文件夹
container run --volume ${HOME}/Desktop/assets:/content/assets \
docker.io/python:alpine ls -l /content/assets
# 使用 --mount 挂载(key=value 语法)
container run --mount source=${HOME}/Desktop/assets,target=/content/assets \
docker.io/python:alpine ls -l /content/assets
与 Docker 的关键区别在于:你只在每个虚拟机中挂载你需要的数据,而不是挂载整个虚拟机可能需要的任何东西。
5. 构建器管理 #
对于资源密集型的构建任务,你可以自定义构建器虚拟机:
# 启动带自定义资源的构建器
container builder start --cpus 8 --memory 32g
# 按需停止和重启
container builder stop
container builder delete
container builder start --cpus 8 --memory 32g
构建器虚拟机默认获得 2GB 内存和 2 个 CPU 核心——对于简单项目足够,但重型构建则力不从心。
高级功能 #
容器网络 #
container 集成了 macOS 的 vmnet 框架来实现虚拟网络:
# 列出网络
container network ls
# 创建自定义网络
container network create mynet
# 在指定网络上运行容器
container run --network mynet myapp
在 macOS 26 上,容器之间可以通过虚拟网络进行通信。在 macOS 15 上,容器默认是相互隔离的。
系统服务 #
将容器作为持久化服务运行:
# 启动系统服务
container system start
# 停止系统服务
container system stop
# 检查状态
container system status
container-apiserver 作为 Launchd agent 运行,通过 XPC helper 管理容器和网络资源。
升级与降级 #
# 升级到最新版本
/usr/local/bin/update-container.sh
# 降级到指定版本
container system stop
/usr/local/bin/uninstall-container.sh -k
/usr/local/bin/update-container.sh -v 0.3.0
container system start
卸载 #
# 不带数据卸载
/usr/local/bin/uninstall-container.sh -k
# 带数据清理卸载
/usr/local/bin/uninstall-container.sh -d
与竞品对比 #
让我们将 container 与现有方案做个对比:
| 特性 | Apple Container | Docker Desktop | Colima | OrbStack |
|---|---|---|---|---|
| 底层虚拟机模型 | 每容器一个 VM | 共享 Linux VM | 共享 Linux VM | 共享 Linux VM |
| 编程语言 | Swift | Go | Go | Rust |
| OCI 兼容 | 是 | 是 | 是 | 是 |
| 所需 macOS | Apple Silicon + macOS 26 | Intel + Apple Silicon | Apple Silicon | Apple Silicon + Intel |
| 内存使用方式 | 按容器独立分配 | 共享内存池 | 共享内存池 | 共享内存池 |
| 容器隔离级别 | 完整虚拟机级别 | 共享内核 | 共享内核 | 共享内核 |
| 跨平台构建 | 支持(arm64 + amd64) | 支持 | 支持 | 支持 |
| 费用 | 免费 | 付费($5/月) | 免费 | 付费 |
关键差异 #
每容器一个虚拟机:与 Docker、Colima 或 OrbStack 的共享 Linux 虚拟机不同,
container为每个容器创建专属虚拟机。单个容器的资源消耗更多,但提供了真正的虚拟机级别隔离。macOS 原生集成:深度集成 macOS Virtualization 框架、vmnet、XPC、Launchd 和 Keychain,这意味着它可以使用第三方工具无法访问的 macOS 特性。
OCI 原生设计:作为一款 OCI 原生工具诞生,而非 Docker 的包装层。这意味着生成的镜像真正符合 OCI 标准,而不是「假装是 OCI 的 Docker 镜像」。
Swift 生态:使用 Swift 编写并依赖 Containerization Swift 包,为原生 macOS 工具集成打开了大门,这是基于 Go 的工具难以企及的。
技术架构 #
container 的架构由多个组件组成:
┌─────────────────────────────────────────────────────┐
│ container CLI │
└────────────────┬────────────────────────────────────┘
│ XPC 通信
┌────────────────▼────────────────────────────────────┐
│ container-apiserver(Launchd agent) │
├────────────────┬─────────────────┬──────────────────┤
│ │ │ │
│ container- │ container- │ container- │
│ core-images │ network-vmnet │ runtime-linux │
│(镜像管理) │(网络管理) │(每容器运行) │
└────────────────┴─────────────────┴──────────────────┘
│
┌────────────────▼────────────────────────────────────┐
│ macOS Virtualization + vmnet 框架 │
└─────────────────────────────────────────────────────┘
container-apiserver 是核心编排器。当你执行 container system start 时启动,负责管理:
- container-core-images:镜像管理和本地内容存储
- container-network-vmnet:通过 vmnet 进行虚拟网络管理
- container-runtime-linux:每容器的管理 API
各组件之间通过 XPC 通信——这是 Apple 的进程间通信系统。这正是 container 能够与 macOS 系统服务深度集成的关键。
局限性与已知问题 #
内存管理 #
macOS Virtualization 框架仅支持 部分内存 ballooning(气球式内存管理)。当你为一个容器分配 16GB 内存但实际只使用了 2GB 时,那些被释放的内存页面并不会返还给 macOS:
目前,容器中进程在虚拟机层面释放给 Linux 操作系统的内存页面,不会被返还给宿主机。如果你运行大量内存密集型容器,可能需要偶尔重启它们来降低内存占用。
这是 Apple Virtualization 框架的根本限制,不是 container 自身能单独解决的问题。
macOS 15 的局限 #
在 macOS 15(Sonoma)上,多项功能受到限制:
- 不支持容器间通信——容器之间相互隔离
- 不支持自定义网络——所有容器使用默认的 vmnet 网络
- 网络问题——容器 IP 冲突可能导致完全断网
Apple 的态度很明确:macOS 15 可以得到支持,但那些在 macOS 26 上无法复现的问题「将不予处理」。
持续开发中 #
该项目仍处于积极开发阶段,1.0.0 版本刚刚宣布。小版本更新可能包含破坏性变更:
无论是作为 Swift 包还是
container工具,其稳定性仅在补丁版本内得到保证,例如在 0.1.1 和 0.1.2 之间。
为什么这件事对行业很重要 #
Apple 进入容器化领域,意义重大,原因如下:
OCI 标准合规:通过生成标准 OCI 镜像,Apple 在向行业传递一个信号——容器是一种开放标准,而非 Docker 生态的私有产物。这为开放容器运动提供了强有力的背书。
Mac 作为一等开发平台:Apple 长期以来一直是 Mac 在开发者世界的标杆。
container让 Mac 开发者拥有了与 Linux 服务器相同的容器工作流,进一步加速了这一趋势。Swift 生态的扩展:Containerization Swift 包有可能成为更广泛的 macOS 原生容器生态的基础。
安全优先的设计:每容器一个虚拟机的模型解决了真实存在的安全问题——共享内核带来的漏洞攻击面。对于安全要求严格的组织来说,这一点尤为重要。
入门指南:实战教程 #
这里提供一个从零开始的完整工作流:
# 1. 启动系统服务
container system start
# 2. 拉取标准镜像
container pull docker.io/nginx:alpine
# 3. 带端口映射运行
container run -d --name webserver \
--cpus 2 --memory 2g \
-p 8080:80 \
docker.io/nginx:alpine
# 4. 检查运行状态
container ps
# 5. 查看日志
container logs webserver
# 6. 构建你自己的镜像
mkdir myapp && cd myapp
echo -e "FROM docker.io/python:alpine\nCMD ['python', '--version']" > Dockerfile
container build --tag myapp:latest .
container run --rm myapp:latest
# 7. 推送到注册表(需要先完成认证配置)
container push myapp:latest
来源与延伸阅读 #
- Apple Container GitHub
- Containerization Swift Package
- OCI Image Specification
- macOS Virtualization Framework
- Apple Container Documentation
免责声明 #
本文基于 apple/container GitHub 仓库 的公开信息编写。所有数据(Stars 数量、Forks 数量、版本号等)均已通过 GitHub API 在 2026 年 6 月 15 日进行核实。作者未在 Mac 上实际测试 container,内容基于官方文档和社区报告编写。
常见问题 #
Q: container 能在 Intel Mac 上运行吗?
A:不能。container 需要 Apple Silicon(M1/M2/M3/M4)。它使用的 macOS Virtualization 框架专为 Apple Silicon 优化。
Q: 能运行 Docker Compose 文件吗?
A:目前不支持。container 尚不兼容 docker-compose 文件。但由于它支持 OCI 镜像,你可以逐个构建和运行镜像。多容器工作流需要手动编排。
Q: container 是免费的吗?
A:是的。container 以 Apache-2.0 许可证开源,无需订阅或付费。
Q: 可以用于生产环境吗? A:该项目最近达到了 1.0.0 版本,但仍处于积极开发阶段。Apple 建议使用补丁版本以确保稳定性。可用于生产环境,但需注意小版本更新可能引入破坏性变更。
Q: 与 OrbStack 相比如何?
A:对于单容器工作流,OrbStack 速度更快且支持 Intel Mac。container 则提供真正的虚拟机级别隔离和深度 macOS 集成。大多数开发者会觉得 OrbStack 更容易上手,而对安全要求高的团队则会认为 container 的隔离模型更优。
Q: 能运行 Windows 容器吗?
A:不能。container 仅运行 Linux 容器,生成的是 OCI 兼容的 Linux 镜像,不支持 Windows 容器。
Q: 容器内释放的内存会怎样? A:释放的内存页面不会返还给宿主机 macOS。运行大量内存密集型容器时,你可能需要定期重启容器来回收内存。
对更多 AI 工具和开发者基础设施评测感兴趣?加入我们的 Telegram 社区,获取每日更新和新文章的抢先体验。
💬 留言讨论