首页 / 文章 / macOS Container Machines——Apple 为 Mac 打造的轻量级 Linux 容器
← 返回
AI技术

macOS Container Machines——Apple 为 Mac 打造的轻量级 Linux 容器

✍️ zhirenhun 📅 2026/6/14 👁 52 阅读 ⏱ 13 分钟
macOS Container Machines——Apple 为 Mac 打造的轻量级 Linux 容器

什么是容器机

容器机(Container Machine)是 Apple 推出的一种高度集成的 Linux 虚拟化环境,能在你的 Mac 上无缝运行。与传统的 Docker 容器不同,容器机并不是为单个应用设计的——它模拟的是一个完整的 Linux 环境,运行着 init 系统,可以管理长期运行的后台服务。

容器机快速、轻量且持久化。它们基于标准 OCI 镜像构建和共享,这意味着你可以用已有的 Docker 镜像创建容器机,也可以构建自定义镜像在团队间分发。主机集成功能——诸如自动用户映射和家目录共享——让你无论在终端中处于什么位置,都能快速、便捷地访问你的 Linux 环境。

为什么需要容器机

传统容器以应用为模型:一个容器跑一个进程,用完即弃。容器机则以 Linux 环境为模型。它运行镜像的 init 系统,让你可以注册长期运行的服务,或在进程管理器下测试你的应用。想要在本地跑一个完整的 PostgreSQL 集群做测试?用容器机,一条 systemctl start postgresql 就够了。

容器机会自动将你的用户名和家目录映射到 Linux 环境中。你的开发仓库、dotfile 配置在 macOS 和 Linux 两侧都能访问。你可以在 macOS 上继续使用你喜欢的编辑器和开发工具,同时在 Linux 环境内构建和运行应用——无需文件同步、无需 SSH、无需离开终端。

  • 在 Mac 上编辑,在容器内构建。 你的代码仓库位于 macOS 的 $HOME 中,自动挂载到容器机内的 /Users/<用户名>。用你熟悉的 macOS 编辑器或 IDE 写代码;在容器机内编译和运行。
  • 用 macOS 原生工具处理 Linux 产物。 Mac 上的性能分析器、截图工具、浏览器和 GUI 调试器都能直接访问容器机所见的同一组文件——"我构建好了"和"我正在检查它"之间没有复制步骤,零延迟。
  • 运行真实的 Linux 服务做测试。 将数据库或你技术栈所需的任何组件作为系统服务运行——在安装了 systemd 的镜像上,systemctl start postgresql 完全可用,就像在真实的 Linux 服务器上一样。
  • 每个目标发行版一个独立环境。 你有多少个目标发行版,就创建多少个容器机——alpineubuntudebianfedora,各一个。它们共享来自 Mac 的同一份 $HOME 和同一组 dotfile 配置。跨发行版测试只需切换容器机名称。

快速开始

container machine create alpine:latest --name dev
container machine run -n dev whoami       # 输出你的主机用户名,不是 root
container machine run -n dev pwd          # /home/<你> —— 你的 Mac 家目录已挂载
container machine run -n dev              # 打开交互式 shell;直接 cd 进入 $HOME 中的仓库

container machine run 是获取 shell 或执行单条命令的主要方式。如果容器机处于停止状态,run 会自动先启动它,再执行命令。

在容器机中工作

打开 shell,或执行单条命令

不带命令参数时,container machine run 会以与主机账户匹配的用户身份打开一个交互式 shell:

container machine run -n dev

传入命令则执行一次后退出:

container machine run -n dev uname -a
container machine run -n dev -- cat /proc/cpuinfo

设置默认容器机

选择一个默认容器机,这样日常操作可以省略 -n 参数:

container machine set-default dev
container machine run                 # 默认操作 dev 容器机

列出、检查、停止、删除

container machine ls                  # 列出所有容器机
container machine inspect dev         # 查看 JSON 格式的详细配置
container machine stop dev            # 停止容器机
container machine rm dev              # 删除容器机(包括其持久化存储)

container machine 支持别名 m,所以 m lsm run 等简写形式同样有效,适合高频操作。

调整 CPU、内存或家目录挂载模式

container machine set 用于更新容器机的磁盘配置。更改会在下一次停止并重新启动后生效:

container machine set -n dev cpus=4 memory=8G
container machine stop dev
container machine run -n dev -- nproc   # 验证 CPU 数量已更新

内存默认分配主机物理内存的一半。家目录挂载模式支持三种:rw(默认,读写挂载)、ro(只读挂载,适合安全敏感场景)和 none(不挂载家目录)。

制作你自己的容器机镜像

任何包含 /sbin/init 的 Linux 镜像都可以作为容器机使用。这意味着大多数主流 Linux 发行版的 Docker 镜像都能直接使用。以下是一个示例 Dockerfile,构建包含 systemd 和常用工具的 Ubuntu 24.04 容器机镜像:

FROM ubuntu:24.04

ENV container container

RUN apt-get update && \
    apt-get install -y \
    dbus systemd openssh-server net-tools iproute2 iputils-ping curl wget vim-tiny man sudo && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/* && \
    yes | unminimize

RUN >/etc/machine-id
RUN >/var/lib/dbus/machine-id

RUN systemctl set-default multi-user.target
RUN systemctl mask \
      dev-hugepages.mount \
      sys-fs-fuse-connections.mount \
      systemd-update-utmp.service \
      systemd-tmpfiles-setup.service \
      console-getty.service
RUN systemctl disable \
      networkd-dispatcher.service

RUN sed -i -e 's/^AcceptEnv LANG LC_\*$/#AcceptEnv LANG LC_*/' /etc/ssh/sshd_config

构建镜像并创建容器机:

container build -t local/ubuntu-machine:latest .
container machine create local/ubuntu-machine:latest --name ubuntu

默认情况下,container 工具在首次启动时运行内置的配置脚本,自动创建用户账户并进行环境初始化。如果你想使用自己的用户配置逻辑,可以在镜像中添加一个可执行脚本 /etc/machine/create-user.sh。该脚本会在首次启动时以 root 身份执行一次,并可以访问以下环境变量来自定义配置:

  • CONTAINER_GID——分配给用户的组 ID
  • CONTAINER_HOME——用户家目录路径
  • CONTAINER_MACHINE_ID——容器机的唯一标识
  • CONTAINER_UID——分配给用户的用户 ID
  • CONTAINER_USER——用户名

这种设计让容器机既可以开箱即用,又保留了深度定制的能力,满足了从日常开发到复杂测试环境的各种需求。

(完)

——

🧑‍💻

zhirenhun

一个热爱技术的程序员,喜欢分享前沿AI知识和开发经验。

← 上一篇
德国法院里程碑式裁定:Google 对 AI Overviews 虚假内容承担直接责任
下一篇 →
Catlantean 3D:像 1993 年一样做图形

📌 相关推荐

📄
Rhombus 1.0 正式发布
2026/6/24
📄
艾尔登法环的低技术AI
2026/6/24
提示注入的理论基础:角色混淆(Prompt Injection as Role Confusion)
2026/6/23
← 返回文章列表