9个不稳定版本
新 0.4.0 | 2024年8月23日 |
---|---|
0.3.3 | 2024年5月21日 |
0.3.2 | 2024年1月31日 |
0.3.1 | 2023年12月19日 |
0.0.4 | 2022年12月13日 |
#53 在 Unix API
每月52次 下载
1MB
23K SLoC
youki:Rust编写的容器运行时
youki 是一个用Rust编写的OCI运行时规范的实现,类似于 runc。
欢迎您在这里提出您的想法。
🏷️ 关于名称
youki 发音为 /joʊki/ 或 yoh-key。youki 以日语单词 'youki' 命名,意为 '容器'。在日语中,youki 还意味着 '愉快的'、'快乐的' 或 '好笑的'。
🚀 快速入门
[!TIP] 您可以使用GitHub Codespaces立即设置您在GitHub Codespaces上的环境,并尝试使用youki。
$ just build $ docker run --runtime youki hello-world $ sudo podman run --cgroup-manager=cgroupfs --runtime /workspaces/youki/youki hello-world
🎯 动机
以下是我们要用Rust编写新容器运行时的原因。
-
Rust 是实现 oci-runtime 规范的最佳语言之一。目前,许多非常棒的容器工具是用 Go 编写的。然而,容器运行时需要使用系统调用,这在用 Go 实现时需要一些特殊处理。这些技巧(例如 namespaces(7)、fork(2));用 Rust 也很容易,但不是那么复杂。而且,与 C 语言不同,Rust 提供了内存安全的优势。虽然 Rust 在容器领域还不是主要玩家,但它有很大的潜力做出贡献:本项目试图体现这一点。
-
youki 有可能比 runc 更快、更节省内存,因此可以在内存使用要求严格的环境中运行。以下是从创建到删除容器的简单基准测试。
运行时 时间(平均值 ± σ) 范围(最小 … 最大) 与 youki(平均值)比较 版本 youki 111.5 毫秒 ± 11.6 毫秒 84.0 毫秒 ± 142.5 毫秒 100% 0.3.3 runc 224.6 毫秒 ± 12.0 毫秒 190.5 毫秒 ± 255.4 毫秒 200% 1.1.7 crun 47.3 毫秒 ± 2.8 毫秒 42.4 毫秒 ± 56.2 毫秒 42% 1.15 基准测试的详细信息
-
用于基准测试的命令
hyperfine --prepare 'sudo sync; echo 3 | sudo tee /proc/sys/vm/drop_caches' --warmup 10 --min-runs 100 'sudo ./youki create -b tutorial a && sudo ./youki start a && sudo ./youki delete -f a'
-
环境
$ ./youki info Version 0.3.3 Commit 4f3c8307 Kernel-Release 6.5.0-35-generic Kernel-Version #35~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Tue May 7 09:00:52 UTC 2 Architecture x86_64 Operating System Ubuntu 22.04.4 LTS Cores 16 Total Memory 63870 Cgroup setup unified Cgroup mounts Namespaces enabled mount enabled uts enabled ipc enabled user enabled pid enabled network enabled cgroup enabled Capabilities CAP_BPF available CAP_PERFMON available CAP_CHECKPOINT_RESTORE available
-
-
我喜欢实现这个。事实上,这可能是最重要的。
📍 youki 的状态
youki 已经通过了包括 containerd 的端到端测试在内的实际用例,现在已被几个生产环境采用。我们的路线图在 这里。
🔗 相关项目
- containers/oci-spec-rs - Rust 中的 OCI 运行时和镜像规范
🎨 youki 的设计和实现
youki 的用户和开发者文档托管在 https://containers.github.io/youki/
🎬 入门指南
本地构建仅支持 Linux。对于其他平台,请使用我们准备的 Vagrantfile。您还可以使用 GitHub Codespaces 在云中启动一个完全预配置的开发环境。
要求
- Rust(见 这里),版本 2021
- linux 内核 ≥ 5.3
依赖项
要安装 just
,请按照 这里 的说明操作。
Debian, Ubuntu 和相关发行版
$ sudo apt-get install \
pkg-config \
libsystemd-dev \
build-essential \
libelf-dev \
libseccomp-dev \
libclang-dev \
glibc-static \
libssl-dev
Fedora, CentOS, RHEL 和相关发行版
$ sudo dnf install \
pkg-config \
systemd-devel \
elfutils-libelf-devel \
libseccomp-devel \
clang-devel \
openssl-devel
构建
git clone [email protected]:containers/youki.git
cd youki
just youki-dev # or youki-release
./youki -h # you can get information about youki command
教程
要求
- Docker(见 这里)
创建并运行容器
让我们尝试使用 youki 运行一个执行 sleep 30
的容器。这个教程可能需要 root 权限。
git clone [email protected]:containers/youki.git
cd youki
just youki-dev # or youki-release
mkdir -p tutorial/rootfs
cd tutorial
# use docker to export busybox into the rootfs directory
docker export $(docker create busybox) | tar -C rootfs -xvf -
然后,我们需要准备一个配置文件。此文件包含容器的元数据和规范,例如要运行的进程、要注入的环境变量、要使用的沙箱功能等。
../youki spec # will generate a spec file named config.json
我们可以编辑 config.json
以添加容器的自定义行为。在这里,我们修改 process
字段以运行 sleep 30
。
"process": {
...
"args": [
"sleep", "30"
],
...
}
然后我们可以探索容器的生命周期
cd .. # go back to the repository root
sudo ./youki create -b tutorial tutorial_container # create a container with name `tutorial_container`
sudo ./youki state tutorial_container # you can see the state the container is `created`
sudo ./youki start tutorial_container # start the container
sudo ./youki list # will show the list of containers, the container is `running`
sudo ./youki delete tutorial_container # delete the container
在 config.json
中更改要执行的命令,并尝试除 sleep 30
之外的其他命令。
无根容器
youki
提供了以非 root 用户运行容器的功能(无根模式)。要在无根模式下运行容器,我们需要在 config.json
中添加一些额外的选项,其他步骤与上面相同
$ mkdir -p tutorial/rootfs
$ cd tutorial
# use docker to export busybox into the rootfs directory
$ docker export $(docker create busybox) | tar -C rootfs -xvf -
$ ../youki spec --rootless # will generate a spec file named config.json with rootless mode
## Modify the `args` field as you like
$ ../youki run rootless-container # will create and run a container with rootless mode
用法
启动 docker 守护进程。
dockerd --experimental --add-runtime="youki=$(pwd)/youki"
如果您遇到以下错误,则意味着您的正常 Docker 守护进程正在运行,需要停止它。请使用您的 init 系统(例如,使用 systemd,作为 root 运行 systemctl stop docker
)。
failed to start daemon: pid file found, ensure docker is not running or delete /var/run/docker.pid
现在重复该命令,应该会启动 docker 守护进程。
您可以在不同的终端中使用 youki 启动容器。
docker run -it --rm --runtime youki busybox
之后,您可以在另一个终端中关闭 docker 守护进程。要重启正常 docker 守护进程(如果您之前已停止它),请运行
systemctl start docker # might need root permission
集成测试
运行集成测试需要 Go 和 node-tap。有关详细信息,请参阅 opencontainers/runtime-tools 的 README。
git submodule update --init --recursive
just test-oci
设置 Vagrant
您可以通过使用我们准备的Vagrantfile在Linux以外的平台上尝试youki。我们为vagrant准备了两个环境,即无root模式和无root模式。
git clone [email protected]:containers/youki.git
cd youki
# If you want to develop in rootless mode, and this is the default mode
vagrant up
vagrant ssh
# or if you want to develop in rootful mode
VAGRANT_VAGRANTFILE=Vagrantfile.root vagrant up
VAGRANT_VAGRANTFILE=Vagrantfile.root vagrant ssh
# in virtual machine
cd youki
just youki-dev # or youki-release
👥 社区和贡献
请参阅我们的社区页面。
感谢所有已经做出贡献的人!
依赖项
~21–41MB
~641K SLoC