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還沒有進入實用階段,但是越來越接近實際使用,一個測試執行例項:
截止目前相關支援狀態持如下:
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在容器領域開發的初始專案,期待專案的不斷成熟完整,以便可以在生產環境使用。