每天資訊Rust開發的容器執行時youki

菜單

Rust開發的容器執行時youki

Rust開發的容器執行時youki

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

概述

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

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

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

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

Rust開發的容器執行時youki

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

Rust開發的容器執行時youki

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

Rust開發的容器執行時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在容器領域開發的初始專案,期待專案的不斷成熟完整,以便可以在生產環境使用。