替代容器執行時

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 選項。

  1. 編輯 daemon 設定檔,為您想要設定的 shim 新增一個 runtimes 項目。

    • runtimeType 鍵中指定執行階段的完整名稱。
    • options 鍵下新增您的執行階段設定。
    {
      "runtimes": {
        "gvisor": {
          "runtimeType": "io.containerd.runsc.v1",
          "options": {
            "TypeUrl": "io.containerd.runsc.v1.options",
            "ConfigPath": "/etc/containerd/runsc.toml"
          }
        }
      }
    }
  2. 重新載入 daemon 設定。

    # systemctl reload docker
    
  3. 透過 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 作為容器執行階段:

  1. 安裝 youki 及其依賴項。

    相關說明請參閱 官方設定指南

  2. 透過編輯 Docker daemon 設定檔(預設位於 /etc/docker/daemon.json)來註冊 youki 作為 Docker 執行階段。

    path 鍵應指定您安裝 youki 的路徑。

    # cat > /etc/docker/daemon.json <<EOF
    {
      "runtimes": {
        "youki": {
          "path": "/usr/local/bin/youki"
        }
      }
    }
    EOF
    
  3. 重新載入 daemon 設定。

    # systemctl reload docker
    

現在,您可以執行使用 youki 作為執行階段的容器了。

$ docker run --rm --runtime youki hello-world

Wasmtime

可用性: 實驗性功能

Wasmtime 是一個 Bytecode Alliance 專案,也是一個讓您能執行 Wasm 容器的 Wasm 執行階段。透過 Docker 執行 Wasm 容器提供了兩層安全保障:您不僅能獲得容器隔離的所有優勢,還能享受由 Wasm 執行環境所提供的額外沙盒保護。

若要新增 Wasmtime 作為容器執行階段,請依照下列步驟操作:

  1. 在 daemon 設定檔中開啟 containerd 映像檔儲存庫功能。

    {
      "features": {
        "containerd-snapshotter": true
      }
    }
  2. 重新啟動 Docker daemon。

    # systemctl restart docker
    
  3. 將 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
© . This site is unofficial and not affiliated with Kubernetes or Docker Inc.