Apple Container:在 Mac 上实现类 Docker 体验,斩获 37K Star

Apple 发布了 container,这是一款基于 Swift 的工具,可在 Mac 上使用轻量级虚拟机运行 Linux 容器。已获得 37K star,兼容 OCI,需要 macOS 26。

  • 更新于 2026-06-15
Apple Container:在 Mac 上实现类 Docker 体验,斩获 37K Star #

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 ContainerDocker DesktopColimaOrbStack
基础虚拟机模型每容器一个虚拟机共享 Linux 虚拟机共享 Linux 虚拟机共享 Linux 虚拟机
编写语言SwiftGoGoRust
兼容 OCI
macOS 要求Apple Silicon + macOS 26Intel + Apple SiliconApple SiliconApple Silicon + Intel
内存使用按容器分配共享内存池共享内存池共享内存池
容器隔离完整虚拟机级别共享内核共享内核共享内核
跨平台构建是(arm64 + amd64)
免费付费($5/月)付费

关键差异 #

  1. 每容器一个虚拟机:与 Docker、Colima 或 OrbStack 使用共享 Linux 虚拟机不同,container 会为每个容器创建一个专属虚拟机。这样每个容器占用的资源更多,但能提供真正的虚拟机级别隔离。

  2. macOS 原生集成:与 macOS 虚拟化框架、vmnet、XPC、Launchd 和 Keychain 的深度集成,意味着它能够利用第三方工具无法触及的 macOS 特性。

  3. OCI 优先:从一开始就是一个 OCI 原生工具,而非 Docker 的封装层。这意味着它生成的镜像是真正符合 OCI 规范的,而不只是"假装是 OCI 的 Docker 镜像"。

  4. 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 进军容器化领域,出于以下几个原因,意义重大:

  1. 遵循 OCI 标准:通过生成标准的 OCI 镜像,Apple 正在传递一个信号:容器是一种开放标准,而不是 Docker 的生态系统。这为开放容器运动提供了背书。

  2. Mac 作为一流的开发平台:Apple 长期以来一直是开发者世界中 Mac 的主要推动者。container 通过赋予 Mac 开发者与 Linux 服务器上相同的容器工作流,进一步加速了这一点。

  3. Swift 生态的成长:Containerization Swift 包有可能成为更广泛的 macOS 原生容器生态系统的基础。

  4. 安全优先的设计:每容器一个虚拟机的模型解决了一个真实存在的安全问题——共享内核的漏洞面。对于有严格安全要求的组织而言,这一点很重要。

快速上手:实操教程 #

下面是一个从零开始的完整工作流:

# 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 仓库 的公开信息撰写。所有数据(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 社区,获取每日更新和新文章的抢先体验。

💬 留言讨论