apple/containerization
GitHub: apple/containerization
Apple 官方推出的 Swift 库,在 macOS 上通过轻量级虚拟机运行 Linux 容器,实现亚秒级启动。
Stars: 8379 | Forks: 257
# 容器化
Containerization 包允许应用程序使用 Linux 容器。
Containerization 使用 [Swift](https://www.swift.org) 编写,并在 Apple silicon 上使用 [Virtualization.framework](https://developer.apple.com/documentation/virtualization)。
Containerization 提供以下 API:
- [管理 OCI 镜像](./Sources/ContainerizationOCI/)。
- [与远程注册表交互](./Sources/ContainerizationOCI/Client/)。
- [创建和填充 ext4 文件系统](./Sources/ContainerizationEXT4/)。
- [与 Netlink 套接字族交互](./Sources/ContainerizationNetlink/)。
- [创建经过优化的 Linux 内核以实现快速启动](./kernel/)。
- [生成轻量级虚拟机并管理运行时环境](./Sources/Containerization/LinuxContainer.swift)。
- [生成容器化进程并与之交互](./Sources/Containerization/LinuxProcess.swift)。
- 使用 Rosetta 2 在 Apple silicon 上运行 linux/amd64 容器。
请查看 [API 文档](https://apple.github.io/containerization/documentation/) 以获取有关 Containerization 提供的 Swift 包的信息。
## 设计
Containerization 在其自己的轻量级虚拟机内执行每个 Linux 容器。客户端可以为每个容器创建专用 IP 地址,从而无需单独的端口转发。通过优化的 [Linux 内核配置](/kernel)和带有轻量级 init 系统的最小 root 文件系统,容器可以实现亚秒级的启动时间。
[vminitd](/vminitd) 是一个小型 init 系统,它是 Containerization 的一个子项目。
`vminitd` 作为虚拟机内的初始进程生成,并通过 vsock 提供 GRPC API。
该 API 允许配置运行时环境并启动容器化进程。
当进程运行时,`vminitd` 向调用进程提供 I/O、信号和事件。
## 需求
要构建 Containerization 包,您需要:
- 配备 Apple silicon 的 Mac
- macOS 26
- Xcode 26
不支持旧版本的 macOS。
## 示例用法
有关如何使用部分库接口的示例,`cctl` 可执行文件是一个很好的起点。此应用程序是探索 API 的实用演练场。它包含一些命令,用于演练各产品的部分核心功能,例如:
1. [操作 OCI 镜像](./Sources/cctl/ImageCommand.swift)
2. [登录容器注册表](./Sources/cctl/LoginCommand.swift)
3. [创建 root 文件系统块](./Sources/cctl/RootfsCommand.swift)
4. [运行简单的 Linux 容器](./Sources/cctl/RunCommand.swift)
## Linux 内核
在 macOS 上生成轻量级虚拟机需要 Linux 内核。
Containerization 提供了一个优化的内核配置,位于 [kernel](./kernel) 目录中。
该目录包含一个容器化的构建环境,以便轻松编译与 Containerization 配合使用的内核。
该内核配置是一组最小功能集,旨在支持快速启动时间和轻量级环境。
虽然此配置适用于大多数工作负载,但我们理解有些场景需要额外功能。
为了解决此问题,Containerization 提供了一流的 API,支持在每个容器的基础上使用不同的内核配置和版本。
这使得能够在不同的内核版本上开发和验证容器。
请参阅内核目录中的 [README](/kernel/README.md) 以获取有关如何编译优化内核的说明。
### 内核支持
Containerization 允许用户提供内核,但从内核版本 `6.14.9` 开始测试功能。
### 预构建内核
如果您希望使用预构建的内核,请确保其已将 `VIRTIO` 驱动程序编译到内核中(而不仅仅是作为模块)。
[Kata Containers](https://github.com/kata-containers/kata-containers) 项目提供了一个为容器优化的 Linux 内核,并启用了所有必需的配置选项。[releases](https://github.com/kata-containers/kata-containers/releases/) 页面包含可下载的构件,镜像本身(`vmlinux.container`)可以在 `/opt/kata/share/kata-containers/` 目录中找到。
## 准备构建包
安装推荐版本的 Xcode。
将活跃开发者目录设置为已安装的 Xcode(替换 ``):
```
sudo xcode-select -s
```
安装 [Swiftly](https://github.com/swiftlang/swiftly)、[Swift](https://www.swift.org) 和 [Static Linux SDK](https://www.swift.org/documentation/articles/static-linux-getting-started.html):
```
make cross-prep
```
如果您使用自定义终端应用程序,可能需要将此命令从 `.zprofile` 移动到 `.zshrc`(替换 ``):
```
# Added by swiftly
. "/Users//.swiftly/env.sh"
```
重启终端应用程序。确保此命令返回 `/Users//.swiftly/bin/swift`(替换 ``):
```
which swift
```
如果您之前安装或使用过 Static Linux SDK,可能需要从系统中移除较旧的 SDK 版本(替换 ``):
```
swift sdk list
swift sdk remove
```
## 构建包
从源代码构建 Containerization:
```
make all
```
## 测试包
构建完成后,运行基本测试和集成测试:
```
make test integration
```
运行集成测试需要内核。
如果您本地没有可用的内核,可以使用 `make fetch-default-kernel` 目标获取默认内核。
获取默认内核仅需在初次构建后或执行 `make clean` 后进行。
```
make fetch-default-kernel
make all test integration
```
## Protobufs
Containerization 依赖于特定版本的 `grpc-swift` 和 `swift-protobuf`。您可以安装它们并重新生成 RPC 接口:
```
make protos
```
## 构建内核
如果您想构建自己的内核,请参阅 [kernel 目录](./kernel/README.md)中的说明。
## Pre-commit hook
运行 `make pre-commit` 以安装 pre-commit hook,以确保当您运行 `git commit` 时,您的更改具有正确的格式和许可证头。
## 文档
生成 API 文档以供本地查看:
```
make docs
make serve-docs
```
通过在另一个终端中运行以下命令来预览文档:
```
open http://localhost:8000/containerization/documentation/
```
## 贡献
欢迎并鼓励对 Containerization 进行贡献。请参阅 [CONTRIBUTING.md](/CONTRIBUTING.md) 了解更多信息。
## 项目状态
版本 0.1.0 是 Containerization 的首个正式版本。早期版本不保证源稳定性。
由于 Containerization 库正处于活跃开发阶段,仅保证次要版本(例如 0.1.1 和 0.1.2 之间)内的源稳定性。如果您不希望出现 potentially 源码破坏性的包更新,可以使用 .upToNextMinorVersion(from: "0.1.0") 来指定您的包依赖项。
未来的次要版本可能会根据需要更改这些规则。
标签:Apple Silicon, DevOps工具, ext4文件系统, GRPC, Hakrawler, Linux容器, macOS开发, Netlink, NIDS, OCI镜像, Rosetta 2, Swift, Virtualization框架, vminitd, Vsock, 内核优化, 安全渗透, 容器化, 容器运行时, 开源库, 微虚拟机, 快速启动, 搜索引擎爬虫, 系统编程, 虚拟化技术, 跨平台开发, 轻量级虚拟机