Discover container machines
System Services 进阶 11m

探索容器机

Discover container machines

2026年6月10日

在 Apple 官方观看视频

一句话判断

这场 Session 最值得关注的一件事是:Mac 上的 Linux 开发终于告别了 Docker Desktop 的笨重和传统虚拟机的割裂,Container machine (容器机) 把持久化 Linux 环境做成了 macOS 的原生延伸。

这场 Session 讲了什么

做 Swift 服务端或者跨平台 C++ 开发的同事都知道,在 Mac 上搞 Linux 环境一直是个痛点。Docker Desktop 越来越重,传统虚拟机启动慢且文件共享卡顿。Apple 去年开源了 Containerization (容器化) 框架,今年直接端出了 Container machine

它不是普通的 ephemeral (无状态) 容器,而是一个跑在轻量级 VM 里、支持 OCI 镜像、且有状态的 Linux 环境。最爽的是它自动映射了你的 macOS 用户名和当前工作目录。你在 Mac 上用 Xcode 改完代码,切到终端敲个 container machine run swift build,它直接读取本地文件并在 Linux 里编译,体验就像在跑原生 macOS 程序一样丝滑。这对 Swift 服务端开发者、Rust/C++ 跨平台工程师来说,是实打实的生产力解放。

值得深挖的点

有状态容器:向“纯粹性”妥协,向“开发体验”低头

传统的容器理念是“阅后即焚”,状态全靠 volume 和外部数据库。但在本地开发场景下,开发者需要 apt-get install 装一堆调试工具,需要修改 .bashrc,需要保存编译缓存。如果用纯容器,每次重建环境都要重头再来;如果用 Docker volume,又容易搞出权限和路径映射的烂摊子。

Apple 的设计选择很务实:给 Container machine 加上 Stateful (持久化) 特性。你 stop 掉它,下次 run 的时候,之前装的 gcc、改的配置、甚至跑了一半的进程都还在。它底层依然是基于 Containerization 的轻量级 VM(亚秒级启动),但上层表现得更像一个随叫随到的专属开发机。牺牲了容器“绝对干净”的纯粹性,换来的是不用每次都在 Dockerfile 里写一堆环境初始化脚本。对于本地开发来说,这个 trade-off 简直太值了。

零心智负担的宿主集成:干掉 docker cp

Demo 里最惊艳的不是跑通了 Vapor 服务器,而是文件系统的无缝共享。你在 Mac 的 Icon Composer 里改了个图标,保存到项目目录,Safari 刷新 Linux 里的服务直接就生效了。Container machine 自动把 macOS 的当前工作目录(pwd)和用户名(whoami)映射进 Linux。

这意味着你彻底告别了 docker cp,也不用在配置文件里配半天 volume。Mac 上的 GUI 工具(Xcode、VS Code)和 Linux 里的 CLI 工具链(Swift、GCC)终于可以在同一个文件系统视图下协同工作。不过要注意,这种深度的宿主集成在跨平台文件系统(比如 macOS 的 APFS 映射到 Linux 的 ext4)时,可能会在大量小文件 I/O(如庞大的 Swift build 目录)时遇到性能瓶颈,后续需要关注 Apple 对 virtiofs 的底层优化。

代码片段

1. 创建并设定默认开发机

场景:初始化一个基于 Alpine 的 Linux 环境,并设为默认,后续命令无需再带名字。

# 创建名为 demo 的容器机,使用 alpine 镜像,并设为默认
container machine create --name demo --set-default alpine

坑:如果你没加 --set-default,后续每次 run 都要手动指定 --name,非常反人类。

2. 无缝进入 Linux 交互式环境

场景:在 macOS 终端直接切入 Linux shell,当前目录和用户名自动同步。

# 启动交互式 shell,自动映射当前 macOS 目录和用户
container machine run

坑:虽然目录映射了,但 Linux 里的隐藏文件(如 .build)如果涉及平台特定的二进制缓存,千万别在 Mac 和 Linux 之间混用,记得在 Linux 里单独建个 build 目录。

最佳实践

如果你现在还在用 Docker Desktop 跑本地 Linux 开发环境,建议立刻把日常编译和测试流程迁移到 Container machine。它的亚秒级启动和原生文件系统共享能省下大量等待时间。

对于新项目,推荐把 Container machine 作为跨平台 CI/CD 的本地验证基石。在 Mac 上写完代码,用 container machine run swift test 跑一遍 Linux 测试,再推代码。

实战中最容易踩的坑是网络隔离。Demo 里特意提到,为了让 Mac 上的 Safari 访问 Linux 里的 Vapor 服务,需要把 Vapor 的 hostname 绑定到 Container machine 的特定 IP(通过 container machine list 获取),而不是默认的 127.0.0.1。在配置本地服务端口映射时,务必先查清楚虚拟网卡的 IP 分配规则。

还有什么值得关注

  • OCI 镜像复用Container machine 直接复用 container 工具构建的 OCI 镜像,你不需要为“机器”和“容器”维护两套镜像仓库。
  • CLI 体验统一:所有的操作都整合进了 container CLI,Apple 显然想把 container 打造成 Mac 上的 Docker 替代品。
  • 底层框架开源Containerization 框架完全开源,如果你嫌 CLI 不够用,完全可以用 Swift 自己写一个带 GUI 的 Linux 环境管理器。
Containerization Linux Swift Server CLI Virtualization