替代容器執行時
Docker Engine 使用 containerd 來管理容器生命週期,包括建立、啟動和停止容器。預設情況下,containerd 使用 runc 作為其容器執行階段。
我可以選擇哪些執行階段?
您可以利用任何實作了 containerd shim API 的執行階段。這類執行階段隨附 containerd shim,無需額外設定即可使用。請參閱 使用 containerd shims。
實作自身 containerd shim 的執行階段範例包括:
您也可以使用設計為 runc 直接替代品(drop-in replacement)的執行階段。這類執行階段依賴 runc containerd shim 來呼叫執行階段二進位檔。您必須手動在 daemon 設定中註冊這類執行階段。
youki 是一個可以作為 runc 直接替代品的執行階段範例。請參閱解釋設定方式的 youki 範例。
使用 containerd shims
containerd shims 讓您無需更改 Docker daemon 設定即可使用替代執行階段。若要使用 containerd shim,請將 shim 二進位檔安裝在 Docker daemon 執行所在系統的 PATH 中。
若要透過 docker run 使用 shim,請將執行階段的完整名稱指定為 --runtime 旗標的值:
$ docker run --runtime io.containerd.kata.v2 hello-world
在未安裝至 PATH 的情況下使用 containerd shim
若您未將 shim 安裝在 PATH 中,則需要在 daemon 設定中註冊該 shim,如下所示:
{
"runtimes": {
"foo": {
"runtimeType": "/path/to/containerd-shim-foobar-v1"
}
}
}若要使用該 shim,請指定您為其指派的名稱:
$ docker run --runtime foo hello-world
設定 shims
如果您需要為 containerd shim 傳遞額外設定,可以使用 daemon 設定檔中的 runtimes 選項。
編輯 daemon 設定檔,為您想要設定的 shim 新增一個
runtimes項目。- 在
runtimeType鍵中指定執行階段的完整名稱。 - 在
options鍵下新增您的執行階段設定。
{ "runtimes": { "gvisor": { "runtimeType": "io.containerd.runsc.v1", "options": { "TypeUrl": "io.containerd.runsc.v1.options", "ConfigPath": "/etc/containerd/runsc.toml" } } } }- 在
重新載入 daemon 設定。
# systemctl reload docker透過
docker run的--runtime旗標來使用自訂執行階段。$ docker run --runtime gvisor hello-world
有關 containerd shim 設定選項的詳細資訊,請參閱 設定 containerd shims。
範例
以下範例說明如何設定並使用 Docker Engine 的替代容器執行階段。
youki
youki 是以 Rust 編寫的容器執行階段。youki 聲稱比 runc 更快且佔用更少記憶體,這使其成為資源受限環境的絕佳選擇。
youki 作為 runc 的直接替代品運作,這意味著它依賴 runc shim 來呼叫執行階段二進位檔。當您註冊作為 runc 替代品的執行階段時,您需要設定執行階段執行檔的路徑,並選擇性地設定一組執行階段參數。更多資訊請參閱 設定 runc 直接替代品。
若要新增 youki 作為容器執行階段:
安裝 youki 及其依賴項。
相關說明請參閱 官方設定指南。
透過編輯 Docker daemon 設定檔(預設位於
/etc/docker/daemon.json)來註冊 youki 作為 Docker 執行階段。path鍵應指定您安裝 youki 的路徑。# cat > /etc/docker/daemon.json <<EOF { "runtimes": { "youki": { "path": "/usr/local/bin/youki" } } } EOF重新載入 daemon 設定。
# systemctl reload docker
現在,您可以執行使用 youki 作為執行階段的容器了。
$ docker run --rm --runtime youki hello-world
Wasmtime
Wasmtime 是一個 Bytecode Alliance 專案,也是一個讓您能執行 Wasm 容器的 Wasm 執行階段。透過 Docker 執行 Wasm 容器提供了兩層安全保障:您不僅能獲得容器隔離的所有優勢,還能享受由 Wasm 執行環境所提供的額外沙盒保護。
若要新增 Wasmtime 作為容器執行階段,請依照下列步驟操作:
在 daemon 設定檔中開啟 containerd 映像檔儲存庫功能。
{ "features": { "containerd-snapshotter": true } }重新啟動 Docker daemon。
# systemctl restart docker將 Wasmtime containerd shim 安裝到
PATH中。下列 Dockerfile 命令從原始碼建置 Wasmtime 二進位檔,並將其匯出至
./containerd-shim-wasmtime-v1。$ docker build --output . - <<EOF FROM rust:latest as build RUN cargo install \ --git https://github.com/containerd/runwasi.git \ --bin containerd-shim-wasmtime-v1 \ --root /out \ containerd-shim-wasmtime FROM scratch COPY --from=build /out/bin / EOF將此二進位檔放入
PATH中的目錄。$ mv ./containerd-shim-wasmtime-v1 /usr/local/bin
現在,您可以執行使用 Wasmtime 作為執行階段的容器了。
$ docker run --rm \
--runtime io.containerd.wasmtime.v1 \
--platform wasi/wasm32 \
michaelirwin244/wasm-example
相關資訊
- 若要進一步了解容器執行階段的設定選項,請參閱 設定容器執行階段。
- 您可以設定 daemon 預設使用的執行階段。請參閱 設定預設容器執行階段。