macOS 原生容器 Apple Container 架构解析

macOS 原生容器 Apple Container 架构解析

TL;DR

Apple Container 结合 macOS 框架与模块化插件体系,提供了强大的容器化环境。理解其架构与可扩展性,有助于开发者在云原生与虚拟化场景下充分发挥其能力。

引言

Container 是 Apple 提供的开源命令行工具,专为在 Mac 上运行 Linux 容器而构建,尤其针对 Apple Silicon 进行了优化。它由 Swift 编写,基于 Containerization Framework 构建。Apple Containerization 和 Container CLI 于 WWDC 2025 发布。

延伸阅读:

Apple Container 是一种客户端 - 服务器架构系统,使 macOS 上能够运行容器化工作负载。本文将深入探讨其架构、启动流程、核心插件、可扩展性及安全性等内容。

架构概览

Apple Container 利用多项关键技术与框架:

  • Virtualization framework
  • vmnet framework
  • XPC
  • Launchd
  • Keychain
  • Unified logging system

该系统采用客户端 - 服务器模型,CLI 通过 client 与 container-apiserver 及其辅助进程通信。

启动流程

安装 container 后,需执行的首个命令为:

container system start

未执行该命令时,运行其他命令会出现 XPC connection error: Connection invalid 等错误。这是因为 CLI 依赖 client 与 container-apiserver 通信,而 container-apiserver 是通过 container system start 启动的 launch agent。apiserver 提供一系列 API 用于管理容器与网络资源。

XPC 提供了一种轻量级的进程间通信(IPC)机制,实现客户端与服务端的点对点连接。XPC 服务由 launchd 系统管理,按需启动和停止。

container-apiserver 启动后,会加载位于 /usr/local/libexec/container/plugins 目录下的核心插件。这些插件即为 XPC 服务。插件启动后,三大核心服务即可使用。

ls -l /usr/local/libexec/container/plugins
total 0
drwxr-xr-x  4 root  wheel  128 Jun 10 04:04 container-core-images
drwxr-xr-x  4 root  wheel  128 Jun 10 04:04 container-network-vmnet
drwxr-xr-x  4 root  wheel  128 Jun 10 04:04 container-runtime-linux

核心插件

核心插件及其职责如下:

  • container-core-imagescom.apple.container.core.container-core-images):提供镜像与本地内容存储管理 API,支持拉取、推送及管理容器镜像。
  • container-network-vmnetcom.apple.container.network.container-network-vmnet):提供网络管理 API,基于 vmnet 框架实现容器网络的创建与管理。
  • container-runtime-linuxcom.apple.container.runtime.container-runtime-linux):提供容器运行时管理 API,基于虚拟化框架实现 Linux 容器的创建与管理。

核心插件通过 Containerization Framework 提供的 API 进行交互,支持容器化工作负载的创建、管理与网络配置。关于 Containerization Framework 的工作原理,有时间我会单独写一篇文章进行详细介绍。

可扩展性

除内置插件外,container-apiserver 还会从以下目录加载用户插件:

/Users/addo/Library/Application Support/com.apple.container/user-plugins

目前暂无用户插件,但该目录为开发者自定义插件、扩展容器系统功能提供了入口。

(转载本站文章请注明作者和出处乱世浮生,请勿用于任何商业用途)

comments powered by Disqus