什么是容器机
容器机(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 服务器上一样。 - 每个目标发行版一个独立环境。 你有多少个目标发行版,就创建多少个容器机——
alpine、ubuntu、debian、fedora,各一个。它们共享来自 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 ls、m 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——分配给用户的组 IDCONTAINER_HOME——用户家目录路径CONTAINER_MACHINE_ID——容器机的唯一标识CONTAINER_UID——分配给用户的用户 IDCONTAINER_USER——用户名
这种设计让容器机既可以开箱即用,又保留了深度定制的能力,满足了从日常开发到复杂测试环境的各种需求。
(完)