Skip to content

Apple container

Apple 在 2025.06.10 的 WWDC 2025 发布了针对 Apple Silicon 的 Containerization 框架,使开发者能够直接在 Mac 上创建、下载或运行 Linux 容器镜像。

GitHub:https://github.com/apple/container

了解 Containerization - WWDC25:https://developer.apple.com/cn/videos/play/wwdc2025/346/

本人尝试学习其源码,本文首先尝试编译 apple/container

编译准备

编译遵循文件:https://github.com/apple/container/blob/0.1.0/BUILDING.md

文件指出需要:

  • macOS 15 or newer and Xcode 26 Beta
  • macOS 26 Beta 1 or newer

检查了Xcode 26 Beta Release Notes,指出:

Xcode 26 beta requires a Mac running macOS Sequoia 15.4 or later.

所以我们的 macOS 需要 Sequoia 15.4 or later。

本文环境:

截屏2025-06-12 22.31.08
git clone git@github.com:apple/container.git
git checkout tags/0.1.0

使用Xcode打开项目,等待加载依赖和索引,即可点击左上角开始编译:

image-20250612223338140

编译产物位置

在 Xcode 中点击 Build 按钮后,Xcode 会将产物(build artifacts)放在一个叫做 DerivedData 的目录中。这个目录的位置可能有点深,具体来说:

  1. 打开 Xcode。
  2. 在菜单栏选择:Xcode > Settings(或 Preferences...,快捷键 Cmd + ,)。
  3. 切换到 Locations 选项卡。
  4. 在 Derived Data 项你会看到一个路径。

如下图,Derived Data 项就是编译产物目录。

image-20250612224350967

编译产物定义

在 XCode 菜单栏「Product -> Scheme -> Edit Scheme... 」(或使用快捷键 ⌘ + < )中,可以看到一次 Build 都编译了哪些 target:

image-20250612225528884

这些 Target 是在项目根目录的 Package.swift 中定义的,下面圈出了可执行文件 container 的 Target 定义,他依赖了一些库,和一些其他的 Target。

image-20250612233309674

同时 path: "Sources/CLI" 指定了 Target 的目录,目录中有程序主入口,如下图圈出的位置:

image-20250612233742680

可以看出,Apple 的 container 使用了和 Docker 一样的 CLI 和 Server 分离的架构设计。可执行文件 container 主要解析了命令行指令和参数,并将指令通过 XPC 的方式发给 APIServer 执行。

具体可以看这个图:

functional-model-light

总结

apple/container 这个仓库主要是提供了命令行到虚拟Linux的连接,真正的 runtime-linux 位于 apple/containerization 中。

如果想要学习 Swift 开发命令行程序,可以阅读 apple/container 这个仓库。如果想要学习 Apple 是如何使用 Swift 在 Apple Silicon 上面做虚拟化的,可以阅读 apple/containerization 这个仓库。