替代容器运行时

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

您可以在不将其安装到PATH的情况下使用 shim,在这种情况下,您需要按如下所示在守护程序配置中注册 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. 使用docker run--runtime标志使用自定义运行时。

    $ 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是字节码联盟的一个项目,也是一个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