Apple Container:在 Mac 上实现类 Docker 体验,斩获 37K Star
Apple 发布了 container,这是一款基于 Swift 的工具,可在 Mac 上使用轻量级虚拟机运行 Linux 容器。已获得 37K star,兼容 OCI,需要 macOS 26。
- 更新于 2026-06-15
RAGFlow:部署一个拥有 80K+ Star 的生产级 RAG 引擎 • Puppeteer:94,300 个 GitHub Star
当 Apple 在 2025 年 5 月 30 日发布 container 时,开发者社区一片安静。没有大张旗鼓,没有主题演讲——只有一个 GitHub 仓库,悄然积累了 37,130 个 star,成为多年来 Apple 最受关注的新开源项目。
这不是 Mac 版 Docker。这是完全不同的东西。
container 是一款 用 Swift 构建的工具,它在 Mac 上以 轻量级虚拟机 的形式运行 Linux 容器。它使用 macOS 虚拟化框架,并与 macOS 系统组件——vmnet、XPC、Launchd、Keychain——深度集成。它生成并使用 兼容 OCI 的镜像,也就是说你的 Docker 镜像在这里可以正常工作,用 container 构建的镜像也能在 Docker 中运行。
但其架构与 Docker Desktop、Colima 或 OrbStack 有着本质区别。让我们来看看为什么开发者已经将它称为"Mac 上容器化的未来"。
Apple 为什么要打造这个工具 #
Apple 在 Mac 容器化这件事上一直很吃力。Mac 本身不原生运行 Linux,因此运行 Linux 容器始终需要一个 Linux 虚拟机——而这个虚拟机一直都很重。Mac 版 Docker Desktop 底层使用了一个完整的 Ubuntu 虚拟机。Colima 缩小了体积。OrbStack 让它变快了。但它们都没有改变根本架构。
container 采取了不同的方法:每个容器一个轻量级虚拟机。
这意味着每个容器都能获得完整的虚拟机级别隔离,而无需共享虚拟机的开销。不再有容器间通信问题,不再有共享内核的漏洞面,也不再有来自共享虚拟机管理程序的"容器逃逸"风险。
核心架构 #
container 不会在共享的 Linux 虚拟机内运行容器。相反,它使用 Apple 的 虚拟化框架(Virtualization framework) 为每个容器创建一个专属的轻量级虚拟机。在实践中这意味着:
- 安全性:每个容器都拥有完整虚拟机级别的隔离属性
- 隐私性:你可以有选择性地只将必要的数据挂载进每个虚拟机
- 性能:启动时间与 Docker 容器相当,但拥有虚拟机级别的隔离
该工具能够使用和生成 兼容 OCI 的容器镜像,因此你可以从任何标准容器镜像仓库拉取并运行镜像——Docker Hub、GitHub Container Registry、Google Container Registry,随便哪个都行。
Deploy Apple's Container: Docker-Like Experience on Mac with 37K Stars on DigitalOcean安装与配置 #
系统要求 #
你需要一台配备 Apple Silicon(M1/M2/M3/M4)的 Mac,并运行 macOS 26(或有一些限制的 macOS 15)。这是一项硬性要求,因为 container 用到了 macOS 26 虚拟化和网络框架中的新特性。
# Download the latest installer from GitHub releases
# https://github.com/apple/container/releases
# Install the signed installer package
# Double-click and follow the instructions
# Start the system service
container system start
安装过程会将文件放置在 /usr/local 目录下,并将 container 注册为一个由 Launchd 管理的系统服务。
从源码安装 #
对于想要从源码构建的开发者:
# Clone the repository
git clone https://github.com/apple/container.git
cd container
# Follow the BUILDING.md instructions
swift build -c release
swift test
该项目使用 Swift Package Manager,并依赖 Containerization 这个 Swift 包来完成底层的容器、镜像和进程管理。
核心功能 #
1. 运行容器 #
基本命令与 Docker 类似:
# Pull and run a container
container run --rm docker.io/python:alpine python --version
# Run with custom memory and CPU limits
container run --rm --cpus 8 --memory 32g big
# Interactive shell
container run -it --rm docker.io/ubuntu bash
每个容器都运行在自己独立的轻量级虚拟机中。默认分配是 1GB 内存和 4 个 CPU,你可以用 --memory 和 --cpus 来覆盖这个默认值。
2. 构建镜像 #
构建镜像使用的是你已经熟悉的 Dockerfile 语法:
# Build a local image
container build --tag myapp:latest --file Dockerfile .
# Build for multiple architectures
container build --arch arm64 --arch amd64 \
--tag registry.example.com/fido/web-test:latest \
--file Dockerfile .
# Try running with a specific architecture
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 服务器上运行:
# Build a multi-platform image
container build --arch arm64 --arch amd64 \
--tag myapp:latest .
# Push to a registry
container push myapp:latest
生成的镜像可以在 Docker、Containerd 以及任何兼容 OCI 的运行时中使用。
4. 卷管理 #
使用 --volume 或 --mount 与容器共享主机文件:
# Mount a folder using --volume
container run --volume ${HOME}/Desktop/assets:/content/assets \
docker.io/python:alpine ls -l /content/assets
# Mount using --mount (key=value syntax)
container run --mount source=${HOME}/Desktop/assets,target=/content/assets \
docker.io/python:alpine ls -l /content/assets
与 Docker 的关键区别在于:你只把需要的数据挂载进每个虚拟机,而不是把虚拟机可能用到的一切都挂载进去。
5. 构建器管理 #
对于资源密集型的构建任务,你可以自定义构建器虚拟机:
# Start builder with custom resources
container builder start --cpus 8 --memory 32g
# Stop and restart if needed
container builder stop
container builder delete
container builder start --cpus 8 --memory 32g
构建器虚拟机默认拥有 2GB 内存和 2 个 CPU——对简单项目来说够用,但应付不了繁重的构建任务。
高级功能 #
容器网络 #
container 与 macOS 的 vmnet 框架集成以实现虚拟网络:
# List networks
container network ls
# Create a custom network
container network create mynet
# Run a container on a specific network
container run --network mynet myapp
通过虚拟网络实现的容器间通信在 macOS 26 上可用。在 macOS 15 上,容器默认彼此隔离。
系统服务 #
将容器作为持久化服务运行:
# Start the system service
container system start
# Stop the system service
container system stop
# Check status
container system status
container-apiserver 作为一个 Launchd 代理运行,并通过 XPC 辅助进程管理容器和网络资源。
升级与降级 #
# Upgrade to latest
/usr/local/bin/update-container.sh
# Downgrade to specific version
container system stop
/usr/local/bin/uninstall-container.sh -k
/usr/local/bin/update-container.sh -v 0.3.0
container system start
卸载 #
# Remove without data
/usr/local/bin/uninstall-container.sh -k
# Remove with data wipe
/usr/local/bin/uninstall-container.sh -d
与其他方案的比较 #
我们来把 container 和其他方案做个对比:
| 特性 | Apple Container | Docker Desktop | Colima | OrbStack |
|---|---|---|---|---|
| 基础虚拟机模型 | 每容器一个虚拟机 | 共享 Linux 虚拟机 | 共享 Linux 虚拟机 | 共享 Linux 虚拟机 |
| 编写语言 | 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 虚拟化框架、vmnet、XPC、Launchd 和 Keychain 的深度集成,意味着它能够利用第三方工具无法触及的 macOS 特性。
OCI 优先:从一开始就是一个 OCI 原生工具,而非 Docker 的封装层。这意味着它生成的镜像是真正符合 OCI 规范的,而不只是"假装是 OCI 的 Docker 镜像"。
Swift 生态:使用 Swift 和 Containerization Swift 包构建,为原生 macOS 工具链集成打开了大门,这是基于 Go 的工具无法比拟的。
技术架构 #
container 的架构由几个组件组成:
┌─────────────────────────────────────────────────────┐
│ container CLI │
└────────────────┬────────────────────────────────────┘
│ XPC Communication
┌────────────────▼────────────────────────────────────┐
│ container-apiserver (Launchd agent) │
├────────────────┬─────────────────┬──────────────────┤
│ │ │ │
│ container- │ container- │ container- │
│ core-images │ network-vmnet │ runtime-linux │
│ (image mgmt) │ (network mgmt) │ (per-container) │
└────────────────┴─────────────────┴──────────────────┘
│
┌────────────────▼────────────────────────────────────┐
│ macOS Virtualization + vmnet frameworks │
└─────────────────────────────────────────────────────┘
container-apiserver 是核心的编排器。它在你运行 container system start 时启动,管理以下内容:
- container-core-images:镜像管理和本地内容存储
- container-network-vmnet:通过 vmnet 进行虚拟网络管理
- container-runtime-linux:单个容器的管理接口
每个组件都通过 XPC(Apple 的进程间通信系统)进行通信。这正是它能与 macOS 系统服务紧密集成的原因。
局限性与已知问题 #
内存管理 #
macOS 虚拟化框架只支持 部分内存气球(partial memory ballooning)。当你给一个容器分配了 16GB 内存但它只用了 2GB 时,那些释放出来的页面不会归还给 macOS:
目前,容器虚拟机内运行的进程释放给 Linux 操作系统的内存页面不会归还给宿主机。如果你运行了很多占用大量内存的容器,可能需要偶尔重启它们来降低内存占用。
这是 Apple 虚拟化框架本身的一个根本性限制,不是 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. Start the system service
container system start
# 2. Pull a standard image
container pull docker.io/nginx:alpine
# 3. Run it with port mapping
container run -d --name webserver \
--cpus 2 --memory 2g \
-p 8080:80 \
docker.io/nginx:alpine
# 4. Check it's running
container ps
# 5. View logs
container logs webserver
# 6. Build your own image
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. Push to a registry (requires auth setup)
container push myapp:latest
来源与延伸阅读 #
- Apple Container GitHub
- Containerization Swift Package
- OCI Image Specification
- macOS Virtualization Framework
- Apple Container Documentation
信息披露 #
本文基于 apple/container GitHub 仓库 的公开信息撰写。所有数据(star 数、fork 数、版本号)截至 2026 年 6 月 15 日均通过 GitHub API 核实。作者本人尚未在 Mac 上亲自测试过 container,本文内容依据官方文档和社区报告整理。
常见问题 #
问:container 能在 Intel Mac 上运行吗?
答:不能。container 需要 Apple Silicon(M1/M2/M3/M4)。它使用的 macOS 虚拟化框架是专为 Apple Silicon 优化的。
问:我可以运行 Docker Compose 文件吗?
答:不能直接运行。container 目前不支持 docker-compose 文件。不过由于它支持 OCI 镜像,你可以单独构建和运行各个镜像。多容器工作流需要手动编排。
问:container 是免费的吗?
答:是的,container 采用 Apache-2.0 许可证开源,无需订阅或付费。
问:我可以将它用于生产环境吗? 答:该项目最近发布了 1.0.0 版本,但仍处于积极开发中。Apple 建议使用补丁版本以获得稳定性。生产环境使用是可行的,但要注意次版本更新可能包含破坏性变更。
问:它与 OrbStack 相比如何?
答:OrbStack 在单容器工作流上速度更快,并且支持 Intel Mac。container 提供真正的虚拟机级别隔离和深度的 macOS 集成。对大多数开发者来说,OrbStack 更容易上手。对注重安全的团队来说,container 的隔离模型更具优势。
问:我可以运行 Windows 容器吗?
答:不能。container 只能运行 Linux 容器,生成的是兼容 OCI 的 Linux 镜像,不支持 Windows 容器。
问:容器内部释放的内存会发生什么? 答:释放的内存页面不会归还给宿主机 macOS。如果你运行了很多占用大量内存的容器,可能需要定期重启容器来回收内存。
对更多 AI 工具和开发者基础设施评测感兴趣?加入我们的 Telegram 社区,获取每日更新和新文章的抢先体验。
💬 留言讨论