替代容器运行时

Docker Engine 使用 containerd 来管理容器生命周期, 这包括创建、启动和停止容器。 默认情况下,containerd 使用 runc 作为其容器运行时。

我可以使用哪些运行时?

您可以使用任何实现 containerd shim API 的运行时。 此类运行时附带一个 containerd shim,您可以在没有任何 其他配置。请参阅使用 containerd 填充程序

实现自己的 containerd 填充程序的运行时示例包括:

您还可以使用设计为 runc 的直接替代品的运行时。这样 运行时依赖于 runc containerd shim 来调用运行时二进制文件。 您必须在 daemon 配置中手动注册此类运行时。

Youki 是 Runtime 的一个例子,它可以用作 RunC 的直接替代品。 请参阅解释设置的 youki 示例

使用 containerd 填充码

containerd 填充码允许您使用替代运行时,而不必更改 Docker 守护程序的配置。要使用 containerd 填充程序,请安装 shim binary 打开。PATH

要将填充码与 一起使用,请指定 runtime 作为标志的值:docker run--runtime

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

使用 containerd 填充程序而不在 PATH 上安装

您可以使用 shim 而不将其安装在 上,在这种情况下,您需要 在 daemon 配置中注册 shim,如下所示:PATH

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

要使用填充码,请指定您为其分配的名称:

$ docker run --runtime foo hello-world

配置填充码

如果需要为 containerd shim 传递其他配置,则可以 使用 daemon 配置文件中的选项。runtimes

  1. 编辑守护程序配置文件,方法是为 shim 进行配置。runtimes

    • 在 key 中指定运行时的完全限定名称runtimeType
    • 在 key 下添加运行时配置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. 使用 的 标志 .--runtimedocker run

    $ docker run --runtime gvisor hello-world
    

有关 containerd 填充程序的配置选项的更多信息,请参阅配置 containerd 填充程序

例子

以下示例演示如何设置和使用备用容器 使用 Docker Engine 的运行时。

妖姬

youki 是用 Rust 编写的容器运行时。 Youki 声称比 runc 更快且使用更少的内存, 使其成为资源受限环境的不错选择。

Youki 作为 runc 的直接替代品,这意味着它依赖于 runc shim 调用运行时二进制文件。当您注册运行时时,充当 runc 替换,您可以配置运行时可执行文件的路径,以及 (可选)一组运行时参数。有关更多信息,请参阅配置 runc 直接替换。

要将 youki 添加为容器运行时:

  1. 安装 youki 及其依赖项。

    有关说明,请参阅官方设置指南

  2. 通过编辑 Docker 守护进程将 youki 注册为 Docker 的运行时 配置文件,默认情况下位于 。/etc/docker/daemon.json

    该键应指定您安装 youki 的位置的路径。path

    # 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 是一个字节码联盟项目,也是一个 Wasm 运行时,可让您运行 Wasm 容器。 使用 Docker 运行 Wasm 容器可提供两层安全性。 您可以获得容器隔离的所有好处, 加上 Wasm 运行时环境提供的附加沙箱。

要将 Wasmtime 添加为容器运行时,请执行以下步骤:

  1. 开启守护进程配置文件中的 containerd 镜像存储功能。

    注意

    这是一项实验性功能。

    {
      "features": {
        "containerd-snapshotter": true
      }
    }
  2. 重新启动 Docker 守护程序。

    # systemctl restart docker
    
  3. 在 上安装 Wasmtime containerd 填充程序。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