youki:Rust 開發的容器運行時

Rust 是時下最流行的編程語言,而容器開發也是一個時興的應用領域。將兩者結合使用 Rust 來做容器開發是一個值得嚐鮮的體驗。本文就介紹一個這樣的項目:youki 是使用 Rust 的實現 OCI 運行時規範,類似於 runc。

概述

youki 發音爲 / joʊki / 或 yoh-key。Youki 源於日語單詞 “youki”,意思是“容器。同時,youki 也有“快樂”、“快樂” 或“熱鬧”的意思。用 Rust 重新造輪子主要基於以下原因:

Rust 是實現 oci-runtime 規範的最佳語言之一。許多非常好的容器工具目前都是用 Go 編寫的。但是,容器運行時需要使用系統調用(例如 namespaces(7) , fork(2) ),在 Go 實現比較麻煩。而用 Rust,則方便的多。另外,Rust 從語言層面就提供了內存安全。雖然 Rust 還不是容器領域的開發還是初始階段,但是很適合探索新領域。

youki 有可能比 runc 更快並使用更少的內存,因此可以在內存使用要求嚴格的環境中工作。沒有任何基準測試,但預計 Rust 的語義將帶來更高的性能。

截止目前 youki 還沒有進入實用階段,但是越來越接近實際使用,一個測試運行實例:

截止目前相關支狀態持如下:

youki 的設計與實現結構圖如下:

安裝

本地構建僅真刺激在 Linux 上運行。對於其他平臺,需要使用 Vagrant。運行 youki 還需要 Rust 環境(2021 版本)和最新版本 Docker。可以使用 linux 發行版的安裝。

Debian、Ubuntu 系

sudo apt-get install \
pkg-config \
libsystemd-dev \
libdbus-glib-1-dev \
build-essential \
libelf-dev \
libseccomp-dev

紅帽系,包括 Fedora、Centos、RHEL

sudo dnf install \
pkg-config \
systemd-devel \
dbus-devel \
elfutils-libelf-devel \
libseccomp-devel

構建

git clone git@github:containers/youki.git
cd youki
./build.sh
./youki -h # 可以獲取youki命令的信息

使用教程

創建並運行容器

首先嚐試運行一個執行簡單的容器,並執行 sleep 30 命令。要以 root 權限。

mkdir -p chongchong/rootfs
cd chongchong/

使 docker 將 busybox 導出到 rootfs 目錄

docker export $( docker create busybox ) |tar -C rootfs -xvf -

然後,準備一個配置文件。該文件包含容器的元數據和規範,例如要運行的進程、要注入的環境變量、要使用的沙盒功能等。

../youki spec

這會生成一個 config.json 文件

可以編輯 config.json 爲容器添加自定義行爲。修改 proces 要運行的字段爲 sleep 30.

"process": {
...
"args": [
"sleep", "30"
],
...
}

然後可以查看一個容器的生命週期:

cd .. # 回到倉庫根目錄
sudo ./youki create -b tutorial_container # 創建一個名爲`tutorial_container` 的容器
sudo ./youki state tutorial_container # 可以看到容器的狀態是`created`
sudo ./youki start tutorial_container # 啓動容器
sudo ./youki list # 會顯示容器列表,容器正在`running`
sudo ./youki delete tutorial_container # 刪除容器

可以將 sleep 30 更改爲其他要執行的命令然後看其執行效果。

無根容器

youki 提供以非 root 用戶身份運行容器的能力(無根模式)。要以無根模式運行容器,需要修改 config.json,其他步驟同上:

mkdir -p chongchong/rootfs
cd chongchong

用 docker 將 busybox 導出到 rootfs 目錄

docker export $( docker create busybox ) | tar -C rootfs -xvf -
../youki spec --rootless

將以無根模式生成一個 config.json 的規範文件

根據需要修改 args 字段

然後就可以以無根模式創建並運行一個容器

../youki run rootless-container

其他相關

docker 守護進程

啓動

dockerd --experimental --add-runtime="youki=$(pwd)/target/x86_64-unknown-linux-gnu/debug/youki"

如果拋出錯誤消息:

failed to start daemon: pid file found, ensure docker is not running or delete /var/run/docker.pid

則表示普通 Docker 守護程序正在運行,需要將其停止。

然後重複上述命令,應該會啓動 docker 守護進程。

可以在不同的終端中使用 youki 來啓動容器。

docker run -it --rm --runtime youki busybox

之後,可以在其他終端中關閉 docker 守護進程。要重新啓動普通的 docker 守護進程,請運行:

systemctl start docker

集成測試

git submodule update --init --recursive
./integration_test.sh

使用模式運行特定的 test_cases

./integration_test.sh linux_ *

Vagrantfile

可以使用 Vagrantfile 在 Linux 以外的平臺上試用 youki。Vagrantfile 中準備了兩個環境,分別是 rootless 模式和 rootful 模式

git clone git@github:containers/youki.git
cd youki

默認模式是在 rootless 開發模式

vagrant up
vagrant ssh

要切換到 rootful 模式下

VAGRANT_VAGRANTFILE=Vagrantfile.root vagrant up
VAGRANT_VAGRANTFILE=Vagrantfile.root vagrant ssh
cd youki
./build.sh

總結

本文我們介紹了一個,基於 Rust 開發的容器運行時 youki,目前他還處於很早期的開發狀態,可以作爲一個好玩嚐鮮的工具,也可以作爲 Rust 在容器領域開發的初始項目,期待項目的不斷成熟完整,以便可以在生產環境使用。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/ZAoyPFrroVIfvzhduM98bQ