苹果刚为 Mac 推出了 WSL(容器化虚拟机)

BBetter Stack
컴퓨터/소프트웨어AI/미래기술

Transcript

00:00:00在今年 WWDC 上所有关于 Apple Intelligence 的内容背后,
00:00:03苹果悄悄发布了他们自己的 Windows Subsystem for Linux 版本,称为 Container
00:00:06Machines。它们为你提供了一种轻量级、持久的 Linux 环境,使用起来非常
00:00:10简单,并且它们实际上是构建在苹果去年发布的
00:00:14容器项目之上的,这是一个 Docker 的替代品,所有这些当然都针对 Apple
00:00:18Silicon 进行了优化。那么让我们来看看什么是容器机(Container Machines),它们是如何工作的,
00:00:21同时也为那些错过的人快速回顾一下苹果容器。
00:00:29所以我打算先从设置一个容器机开始,然后稍后再讨论
00:00:32这一切是如何运作的。但我想要的是一个 Ubuntu Linux 环境。所以我只需
00:00:37在这里放一个带有 Ubuntu 镜像的 Dockerfile,然后再加入一些安装常用
00:00:41工具的内容。这适用于任何符合 OCI 标准的镜像,所以几乎所有你
00:00:46在 Docker 中使用的镜像都可以。要成为虚拟机,它唯一需要包含的就是系统初始化
00:00:50程序。一旦我们有了想要用于虚拟机的 Dockerfile 镜像,我们要做的就是
00:00:54使用苹果的容器工具来构建它。你可以看到这是我为自己使用的命令,
00:00:58因为我的 Dockerfile 在这个文件夹里,我只需将其标记为 local
00:01:01Ubuntu machine,然后我们就可以按回车键来构建了。这个容器工具,
00:01:05顺便说一下,适用于 macOS 26 及以上版本,你可以通过简单地前往 GitHub
00:01:09仓库,进入 releases 页面,下载最新的安装包来安装它。看起来我的镜像构建
00:01:13已经完成了,你可以看到它和 Docker 非常相似。它只是在构建一个 OCI 镜像。
00:01:17这就是容器机所需要的全部了,所以现在我们只需运行 container machine create,
00:01:21指定我们要用于容器机的镜像,给它一个好记的名字,
00:01:24我还打算把它设为默认值,这样我运行的任何命令都会默认
00:01:27假设是在这个容器机上,我就不必通过名字来指定它了。这样我们就可以按
00:01:31回车键,只需几秒钟,一切就都设置好了。我们可以通过输入
00:01:35container machine list 查看刚刚创建的容器机的信息。在这里你可以看到
00:01:38有我刚刚创建的那个 Ubuntu 机器,IP 地址,7 个 CPU 核心,以及 18 GB 内存。顺便说一下,CPU 和内存
00:01:44是可以配置的,但默认情况下它会使用你 Mac 一半的内存。要真正开始
00:01:48使用你的容器机,只需输入 container machine run,
00:01:51如果你想进入交互式终端,可以把这里留空,或者如果你想在 Linux 机器上
00:01:54运行某个命令,也可以直接在后面加上命令。在本例中,你可以看到我
00:01:58直接按了回车,现在我就处于 Linux 环境的交互式终端中了。我们可以运行
00:02:02类似 uname-a 的命令来确认这一点,你会看到它返回的是 Linux Ubuntu,
00:02:06而不是当我在 Mac 上运行它时返回的 Darwin。现在,容器机很酷的一点是
00:02:10它具有自动用户共享功能,所以我的用户已经从 Mac 复制到了
00:02:14我的 Linux 环境中,主目录也是如此。它会将你的整个主目录以读写模式挂载,
00:02:18所以我可以在这个 Linux 环境中访问 Mac 上的所有文件。
00:02:23你可以看到当我运行 container run 时,它直接把我带到了 Linux 环境中的那个文件,
00:02:27我们那里已经有那些文件了。它也有自己独立的卷,
00:02:31所以如果我们导航到这台 Ubuntu 机器的主目录,你可以看到目前
00:02:35里面什么都没有,尽管我的 Mac 上有,这是因为这个是 Linux
00:02:39环境,这里是你存放 Linux 特有 .files 的地方。文件夹共享
00:02:43使得在 Mac 上使用你常用的工具开发东西变得超级简单,甚至包括一些
00:02:48只与 macOS 兼容的工具,然后在需要测试时直接切换到 Linux。
00:02:52例如,我这里有一个非常简单的 BUN 应用程序,我想把它编译成一个
00:02:56可以在 Linux 上运行的单一可执行文件,但我无法在 macOS 上测试 Linux,所以运行这个,
00:03:01我不知道它是否生效。但是如果我们切换到容器机,
00:03:04你可以看到我可以直接运行命令。我不必传输文件或做其他事情,
00:03:08多亏了它们共享相同文件系统的事实。如果我在这里按回车,它运行得很好。
00:03:12这个应用程序只是一个带有这个网页的简单 Web 服务器,它打印出它正在
00:03:16运行的环境,所以它目前运行在 Ubuntu 24 上。你还可以看到那里有一个订阅提示,
00:03:20这是你绝对应该做的事情。现在我只是在测试在 Linux 环境中运行 BUN
00:03:23开发服务器,它确实可以运行,我们可以在这里看到,
00:03:27它运行在 BUN dev 上,而且没有经过编译。但如果我修改 Mac 上的一个源文件,
00:03:31比如把 subscribe 改成 hello,我注意到热重载似乎没有
00:03:35捕捉到这个行为,我必须重启 BUN 开发服务器才能使更改生效。
00:03:39好了,现在它显示 hello 了。我认为热重载的工作方式和断点
00:03:43一样,如果你使用 macOS 版本的代码,它们实际上无法工作,但你可以做的是让
00:03:47你的编辑器通过 SSH 连接到容器机,然后以这种方式编辑文件,这样
00:03:52断点和热重载应该就能正常工作了。在他们的文档中实际上有关于如何做到这一点的教程。
00:03:55这就是在使用容器机时需要展示的全部内容。我的意思是,现在它只是一个 Ubuntu 环境,
00:03:59坦白说,整个体验相当无缝。值得指出的是,你并不局限于只使用一台机器。
00:04:03你可以让 Alpine 机器、Ubuntu 机器和 Debian 机器并排运行,这样你就可以为每个目标提供一个发行版,
00:04:08老实说,如果你在做跨目标开发工作,这非常方便。另外,因为这些机器
00:04:12实际上可以运行真正的 SystemD,你可以在里面测试适当的服务堆栈,例如让 Postgres
00:04:17作为一个实际的服务运行,并在其旁边运行你的应用程序,整个环境的表现将和
00:04:22你将要部署到的 Linux 服务器一样。简洁性是苹果在开发容器机时
00:04:26推动的核心设计原则之一。他们想要快速、轻量级的虚拟机,
00:04:30能够集成到你现有的工作流程中,并且可以根据需要超级轻松地启动,
00:04:34同时可以随着时间推移保持持久性,这样你就可以设置一个完整的开发环境虚拟机,
00:04:39其中包含了你需要的所有工具,随时待命。再说一次,这与 Windows Subsystem
00:04:42for Linux 想要实现的目标非常相似。至于这一切是如何构建的,以及它如何与 Docker 和
00:04:47OrbStack 相比,我们首先需要了解去年发布的那个容器工具。
00:04:51它是用 Swift 编写的,旨在成为一个 Docker 替代品,可以运行容器,并运行任何标准
00:04:55OCI 镜像,所以任何你可以从 Docker Hub 拉取的镜像仍然适用。
00:04:59然而苹果的做法独特之处在于,每个容器都通过他们的虚拟化框架拥有
00:05:04自己轻量级的虚拟机,而不是让一堆容器共享一个巨大的 Linux 虚拟机,这正是
00:05:08Docker Desktop 所做的。这种方法的一些好处在于安全性,因为每个容器都具备
00:05:13完整虚拟机的隔离特性。然后还有隐私性,因为你只将必要的数据挂载到每个 VM 中,
00:05:17而在使用共享虚拟机时,你会把所有数据都挂载到那个共享 VM 中,因此它只能被选择性地挂载到各个容器中。
00:05:22最后,还可以有性能优势,因为使用 Apple Container 创建的容器实际上
00:05:27比完整的 VM 需要更少的内存,而且启动时间与 Docker 和其他工具非常相似。
00:05:31如果我们看一下 RepoFlow 在这里做的一些基准测试,将 Apple Containers 与 OrbStack 和 Docker Desktop 进行比较,
00:05:36我们会发现结果其实还不错。虽然很难在这里看出来,但 Apple Containers 确实实现了
00:05:41最多的单线程 CPU 事件,但 OrbStack 非常接近,只有细微差别,同样的情况
00:05:46也延续到了多线程测试中,它们的表现都非常好。不过,苹果在内存吞吐量方面似乎确实稍微领先,
00:05:50OrbStack 位居第二,Docker Desktop 最慢。但当谈到微小容器的启动时间时,
00:05:55苹果似乎还有工作要做,但它仍然在亚秒级,只是 Docker Desktop 和 OrbStack
00:06:00在不到四分之一秒内就完成了。这里还有更多的基准测试,我会留一个指向该测试的链接,
00:06:04但基本上其余的测试表明,OrbStack 在文件系统和小文件处理性能方面表现卓越,
00:06:09但它们也显示 Apple Containers 的表现基本持平,甚至优于 Docker Desktop。
00:06:14在开始使用容器机之前,有几个陷阱你需要注意,
00:06:17首先是内存。正如我前面提到的,机器默认使用你系统内存的一半,
00:06:22所以值得了解的是,它实际上从不归还这些内存。因此,如果你的容器中有内存密集型的
00:06:27工作负载,比如在大规模构建期间,内存会被占用,直到你
00:06:30重启机器。这实际上是 OrbStack 的独特优势之一,它具有动态内存功能,
00:06:35可以通过将未使用的内存返还给 macOS 来减少内存占用。据我所知,
00:06:39没有其他工具能做到这一点。其次,没有 GPU 和 USB 直通功能。
00:06:43我在 GitHub 上看到过针对这两者的公开问题,所以也许未来会得到支持。
00:06:47第三,让 GUI 应用程序运行起来似乎也有些复杂,比如如果你想运行 Linux 版本的
00:06:53VS Code 或其他仅限 Linux 的应用程序。这绝对不是一种无缝的体验,我可能会为此使用其他东西。
00:06:57最后,还有一个安全权衡,因为正如我之前提到的,主目录挂载
00:07:02虽然方便,但默认是读写的,这意味着你在 Linux 机器内运行的任何东西
00:07:06都能触及你的 SSH 密钥、云凭证以及 Mac 上的所有东西。
00:07:11看来你只能将挂载设置为只读或完全关闭。似乎没有能力只挂载特定文件夹。
00:07:15总的来说,在尝试过苹果容器机后,我可能会坚持使用 OrbStack,
00:07:20因为它感觉是目前更精致的选择,具有更好的资源管理和更多的功能,
00:07:25但我知道有些人不喜欢 OrbStack 如果用于业务和商业用途需要付费,
00:07:29所以如果没有 OrbStack,我可能会选择 Apple Containers 而不是 Docker Desktop,还有 Klima,
00:07:33这是另一个不错的选择。你在使用什么?是 OrbStack、Docker Desktop 还是 Lima?
00:07:37在下方评论区告诉我,顺便订阅一下,像往常一样,下期再见。
00:07:40(此段为空,仅作占位处理以保持总数 114 个条目,由于原视频音频在此处可能结束或静音)
00:07:45我会选择 Apple Containers 而不是 Docker Desktop,此外还有 Lima,这是另一个很棒的
00:07:49替代方案。你用的是什么?是 OrbStack、Docker Desktop 还是 Lima?在下方评论区告诉我吧
00:07:53(此段为空,仅作占位处理以保持总数 114 个条目)

Key Takeaway

Apple 推出的容器机(Container Machines)为 Apple Silicon 设备提供了轻量级、原生整合的 Linux 开发环境,但在资源动态管理和功能全面性上相比 OrbStack 仍有差距。

Highlights

  • Apple 推出了容器机(Container Machines),这是一种基于容器工具的轻量级、持久化 Linux 虚拟机环境。

  • 容器机允许在 macOS 上运行符合 OCI 标准的镜像,并支持 SystemD 以实现真实的 Linux 服务测试。

  • 该工具会自动将 macOS 主目录以读写模式挂载到 Linux 环境中,实现文件系统层面的无缝共享。

  • 基准测试显示,Apple Containers 在内存吞吐量方面优于 Docker Desktop,但微小容器的启动时间略长,在亚秒级。

  • 容器机默认分配宿主机 50% 的内存且不支持动态内存回收,同时缺乏 GPU 和 USB 直通功能。

Timeline

容器机的功能与设置

  • 容器机基于苹果的容器项目构建,专为 Apple Silicon 优化。
  • 通过构建符合 OCI 标准的镜像即可创建 Linux 环境,唯一要求是包含系统初始化程序。
  • 创建时可配置 CPU 核心数和内存,默认占用宿主机一半内存。

容器机利用 Dockerfile 构建,适用于 macOS 26 及以上版本。设置过程简单,通过终端命令创建后,可直接在交互式终端中运行 Linux 指令,并能通过 uname-a 验证其独立的 Linux 内核环境。

文件系统集成与开发流程

  • 容器机具备自动用户与主目录共享功能,支持读写访问。
  • 独立卷机制允许 Linux 环境存放特定的 .files 文件。
  • 支持并排运行多种 Linux 发行版,且能运行 SystemD 模拟真实生产部署。

文件共享机制极大简化了跨平台开发,开发者可在 macOS 上使用编辑器,在 Linux 容器中执行测试。通过 SSH 连接容器可以实现代码断点和热重载,避免了文件传输的复杂性。

性能表现与局限性

  • 苹果容器采用每个容器拥有独立轻量级虚拟机的架构,提升了安全性和隐私性。
  • 基准测试显示其内存吞吐量领先于 Docker Desktop。
  • 目前存在内存无法动态返还、缺失 GPU/USB 直通及 GUI 应用支持复杂的问题。

对比显示,尽管 Apple Containers 在内存吞吐量上表现优异,但在资源管理尤其是内存释放方面,OrbStack 提供了更好的动态调节能力。此外,默认的读写挂载存在一定的安全权衡,若需更高级的功能,目前仍需考虑第三方替代方案。

Community Posts

View all posts