替代容器執行時

Docker Engine 使用 containerd 管理容器生命週期,包括建立、啟動和停止容器。預設情況下,containerd 使用 runc 作為其容器執行時。

我可以使用哪些執行時?

您可以使用任何實現 containerd shim API 的執行時。此類執行時與 containerd shim 捆綁在一起,您可以無需任何額外配置即可使用它們。請參閱 使用 containerd shim

實現自身 containerd shim 的執行時示例包括

您還可以使用設計為 runc 的直接替代品的執行時。此類執行時依賴於 runc containerd shim 來呼叫執行時二進位制檔案。您必須在守護程式配置中手動註冊此類執行時。

youki 是可以作為 runc 直接替代品的執行時的一個示例。請參閱 youki 示例,瞭解設定說明。

使用 containerd shim

containerd shim 允許您使用備用執行時,而無需更改 Docker 守護程式的配置。若要使用 containerd shim,請在執行 Docker 守護程式的系統上將 shim 二進位制檔案安裝到 PATH 上。

若要使用 docker run 的 shim,請將執行時的完全限定名稱指定為 --runtime 標誌的值

$ docker run --runtime io.containerd.kata.v2 hello-world

在不安裝到 PATH 上的情況下使用 containerd shim

您可以在不將 shim 安裝到 PATH 上的情況下使用它,在這種情況下,您需要在守護程式配置中註冊該 shim,如下所示

{
  "runtimes": {
    "foo": {
      "runtimeType": "/path/to/containerd-shim-foobar-v1"
    }
  }
}

若要使用 shim,請指定分配給它的名稱

$ docker run --runtime foo hello-world

配置 shim

如果您需要為 containerd shim 傳遞其他配置,則可以使用守護程式配置檔案中的 runtimes 選項。

  1. 透過新增要配置的 shim 的 runtimes 條目來編輯守護程式配置檔案。

    • runtimeType 金鑰中指定執行時的完全限定名稱
    • options 金鑰下新增您的執行時配置
    {
      "runtimes": {
        "gvisor": {
          "runtimeType": "io.containerd.runsc.v1",
          "options": {
            "TypeUrl": "io.containerd.runsc.v1.options",
            "ConfigPath": "/etc/containerd/runsc.toml"
          }
        }
      }
    }
  2. 重新載入守護程式的配置。

    # systemctl reload docker
    
  3. 使用 --runtime 標誌針對 docker run 使用自定義執行時。

    $ docker run --runtime gvisor hello-world
    

有關 containerd shim 配置選項的更多資訊,請參閱 配置 containerd shim

示例

以下示例展示瞭如何在 Docker Engine 中設定和使用備用容器執行時。

youki

youki 是用 Rust 編寫的容器執行時。youki 聲稱比 runc 更快,並且使用更少的記憶體,這使其成為資源受限環境的理想選擇。

youki 用作 runc 的直接替代品,這意味著它依賴於 runc shim 來呼叫執行時二進位制檔案。當您註冊充當 runc 替代品的執行時時,您可以配置執行時可執行檔案的路徑,以及可選的一組執行時引數。有關更多資訊,請參閱 配置 runc 直接替代品

若要將 youki 新增為容器執行時

  1. 安裝 youki 及其依賴項。

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

  2. 透過編輯 Docker 守護程式配置檔案(預設情況下位於 /etc/docker/daemon.json 中)將 youki 註冊為 Docker 的執行時。

    path 金鑰應指定您安裝 youki 的位置的路徑。

    # cat > /etc/docker/daemon.json <<EOF
    {
      "runtimes": {
        "youki": {
          "path": "/usr/local/bin/youki"
        }
      }
    }
    EOF
    
  3. 重新載入守護程式的配置。

    # systemctl reload docker
    

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

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

Wasmtime

Wasmtime 是 Bytecode Alliance 專案,以及允許您執行 Wasm 容器的 Wasm 執行時。使用 Docker 執行 Wasm 容器提供了兩層安全保障。您將獲得容器隔離的所有優勢,以及 Wasm 執行時環境提供的額外沙箱。

若要將 Wasmtime 新增為容器執行時,請執行以下步驟

  1. 在守護程式配置檔案中啟用 containerd 映象儲存 功能。

    注意

    這是一個實驗性功能。

    {
      "features": {
        "containerd-snapshotter": true
      }
    }
  2. 重新啟動 Docker 守護程式。

    # 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