应用2026 年 8 月 6 日

Apple container:在 Mac 上原生运行 Linux 容器

Apple 开源了一个叫 container 的命令行工具,让 Mac 可以不依赖 Docker Desktop 就跑 Linux 容器,而且用了一种和 Docker 不太一样的思路:每个容器都是一台独立的轻量虚拟机。本文介绍它是什么、怎么用,以及目前的成熟度。

Apple container:在 Mac 上原生运行 Linux 容器

Mac 上跑 Linux 容器,长期以来的主流方式是 Docker Desktop:先起一台 Linux 虚拟机,再把所有容器都塞进这台虚拟机里共享同一个内核。

Apple 的开源项目 container 是另一种实现思路:用 Swift 写了一个命令行工具,直接调用 macOS 自带的虚拟化框架,在 Apple silicon 上运行 Linux 容器,不依赖 Docker Desktop 或其他第三方虚拟化方案。

和 Docker 最大的不同:一个容器,一台虚拟机

container 的设计思路和 Docker 不一样。Docker Desktop 是一台虚拟机装所有容器,而 container 反过来,每启动一个容器就单独开一台轻量虚拟机。官方文档里的说法是,这样每个容器都有「完整虚拟机级别的隔离性」—— 容器之间互相看不见,也不会因为共享内核而产生安全或者资源上的相互影响。

按照官方文档的说法,因为虚拟机只挂载容器实际需要的数据(不是整个共享环境都挂进去),内存占用比传统虚拟机低,启动速度也接近普通容器的水平。这一说法来自项目文档本身,实际表现如何,需要用起来之后自行判断。

底层能做到这件事,靠的是苹果同步开源的 Containerization 这个 Swift 包,负责镜像、容器、进程这些底层管理;再往下打通了 macOS 的 Virtualization framework(虚拟化)、网络管理、XPC 进程通信和 launchd。你敲的每条 container 命令,实际上是命令行工具在和后台的 container-apiserver 通信,再由它去调度几个专职的助手进程 —— 一个管镜像、一个管网络、一个管 Linux 运行时。

镜像格式上没有自立门户,遵循的是 OCI(Open Container Initiative)标准,所以从 Docker Hub 之类的标准仓库拉镜像、把自己构建的镜像推上去,都是兼容的。

谁能用:先看清门槛

这不是一个"随便什么 Mac 都能装"的工具,门槛卡得比较死:

  • 只支持 Apple silicon,Intel Mac 用不了
  • 系统要求 macOS 26 及以上,更低版本官方明确表示不维护

如果你的开发机还在用 Intel 芯片,或者系统没升到 26,这个工具目前和你没什么关系。

装起来看看

安装包从 GitHub Releases 页面下载,是签名过的安装包,双击、输管理员密码,会被装到 /usr/local。装完手动把服务拉起来:

bash
1
container system start

以后要升级,得先停掉服务再跑升级脚本:

bash
1
2
container system stop /usr/local/bin/update-container.sh

不想要了,卸载脚本给了两种选项,一种保留用户数据(比如以后可能还会重装),一种彻底清掉:

bash
1
2
3
4
5
# 只卸载程序,保留数据 /usr/local/bin/uninstall-container.sh -k # 连数据一起删 /usr/local/bin/uninstall-container.sh -d

实际用起来是什么样

装好之后的操作体验和用惯 Docker CLI 的人不会有太大陌生感,主要区别就是命令前缀从 docker 换成了 container

比如构建一个多架构镜像:

bash
1
2
3
container build --arch arm64 --arch amd64 \ --tag registry.example.com/fido/web-test:latest \ --file Dockerfile .

跑一个容器,限制资源、挂载本地目录、映射端口,这些常见需求都支持:

bash
1
2
3
4
5
6
7
container run --rm --cpus 8 --memory 32g big container run --volume ${HOME}/Desktop/assets:/content/assets \ docker.io/python:alpine ls -l /content/assets container run -d --rm -p 127.0.0.1:8080:8000 \ node:latest npx http-server -a :: -p 8000

看现有的镜像和正在跑的容器:

bash
1
2
container image list container list

想要机器可读的详细信息,加个 jq 就行:

bash
1
container inspect my-web-server | jq

容器该停就停,日志该看就看:

bash
1
2
container stop my-web-server container logs my-web-server

镜像建完了推到仓库:

bash
1
container image push registry.example.com/fido/web-test:latest

有一个细节比较值得一提:因为每个容器本身就是一台独立虚拟机、有自己的网络接口,container 支持给容器接入自定义网络后直接用容器名当域名访问(形如 hostname.test),不用像传统容器那样非得靠端口映射才能互相访问:

bash
1
container run -d --name my-web-server --network foo --rm web-test

目前还不够完善的地方

官方自己列出来的问题主要有两条:

  • 内存气球(memory ballooning,一种动态回收/归还虚拟机内存的技术)支持还不完整,如果长时间跑一个吃内存的容器,可能得定期重启才能把内存要回来
  • 早期 macOS 15 环境下,网络隔离、多网络、IP 分配这些功能都还有限制(不过这也侧面说明,为什么现在官方直接要求 macOS 26)

版本走到哪了

项目用的是 Apache License 2.0 协议。当前最新版本是 1.2.0(2026-07-29 发布),距离项目在 2026-06-09 发布 1.0.0 已经过去了两个次版本。1.2.0 主要是工程性质的更新:补充了集成测试、底层 Containerization 依赖升级到 0.40.1、加了 --kernel-arg 可以自定义内核启动参数、XPC 请求增加了容器 ID 校验和内核归档完整性校验。

需要注意的是,README 里到现在还留着"次版本可能有破坏性变更,直到发布 1.0.0"这样的旧描述,但项目实际上已经过了这个节点,这段文字没有跟着更新——想确认真实的版本状态,以 GitHub Releases 页面为准更可靠。