mirror of https://github.com/docker/docs.git
Merge pull request #17517 from dvdksn/engine/alternative-runtimes
engine: instructions on using alternative container runtimes
This commit is contained in:
commit
9c71f467d9
|
@ -1558,6 +1558,8 @@ manuals:
|
||||||
section:
|
section:
|
||||||
- sectiontitle: Container runtime
|
- sectiontitle: Container runtime
|
||||||
section:
|
section:
|
||||||
|
- path: /engine/alternative-runtimes/
|
||||||
|
title: Alternative container runtimes
|
||||||
- path: /config/containers/resource_constraints/
|
- path: /config/containers/resource_constraints/
|
||||||
title: Configure runtime resource constraints
|
title: Configure runtime resource constraints
|
||||||
- path: /config/containers/runmetrics/
|
- path: /config/containers/runmetrics/
|
||||||
|
|
|
@ -0,0 +1,235 @@
|
||||||
|
---
|
||||||
|
title: Alternative container runtimes
|
||||||
|
description: |
|
||||||
|
Docker Engine uses runc as the default container runtime, but you
|
||||||
|
can specify alternative runtimes using the CLI or by configuring
|
||||||
|
the daemon
|
||||||
|
keywords: engine, runtime, containerd, runtime v2, shim
|
||||||
|
---
|
||||||
|
|
||||||
|
Docker Engine uses containerd for managing the container lifecycle,
|
||||||
|
which includes creating, starting, and stopping containers.
|
||||||
|
By default, containerd uses runc as its container runtime.
|
||||||
|
|
||||||
|
## What runtimes can I use?
|
||||||
|
|
||||||
|
You can use any runtime that implements the containerd
|
||||||
|
[shim API](https://github.com/containerd/containerd/blob/main/runtime/v2/README.md){: target="blank" rel="noopener"}.
|
||||||
|
Such runtimes ship with a containerd shim, and you can use them without any
|
||||||
|
additional configuration. See [Use containerd shims](#use-containerd-shims).
|
||||||
|
|
||||||
|
Examples of runtimes that implement their own containerd shims include:
|
||||||
|
|
||||||
|
- [Wasmtime](https://wasmtime.dev/){: target="blank" rel="noopener"}
|
||||||
|
- [gVisor](https://github.com/google/gvisor){: target="blank" rel="noopener"}
|
||||||
|
- [Kata Containers](https://katacontainers.io/){: target="blank" rel="noopener"}
|
||||||
|
|
||||||
|
You can also use runtimes designed as drop-in replacements for runc. Such
|
||||||
|
runtimes depend on the runc containerd shim for invoking the runtime binary.
|
||||||
|
You must manually register such runtimes in the daemon configuration.
|
||||||
|
|
||||||
|
[youki](https://github.com/containers/youki){: target="blank" rel="noopener"}
|
||||||
|
is one example of a runtime that can function as a runc drop-in replacement.
|
||||||
|
Refer to the [youki example](#youki) explaining the setup.
|
||||||
|
|
||||||
|
## Use containerd shims
|
||||||
|
|
||||||
|
containerd shims let you use alternative runtimes without having to change the
|
||||||
|
configuration of the Docker daemon. To use a containerd shim, install the shim
|
||||||
|
binary on `PATH` on the system where the Docker daemon is running.
|
||||||
|
|
||||||
|
To use a shim with `docker run`, specify the fully qualified name of the
|
||||||
|
runtime as the value to the `--runtime` flag:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ docker run --runtime io.containerd.kata.v2 hello-world
|
||||||
|
```
|
||||||
|
|
||||||
|
### Use a containerd shim without installing on PATH
|
||||||
|
|
||||||
|
You can use a shim without installing it on `PATH`, in which case you need to
|
||||||
|
register the shim in the daemon configuration as follows:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"runtimes": {
|
||||||
|
"foo": {
|
||||||
|
"runtimeType": "/path/to/containerd-shim-foobar-v1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
To use the shim, specify the name that you assigned to it:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ docker run --runtime foo hello-world
|
||||||
|
```
|
||||||
|
|
||||||
|
### Configure shims
|
||||||
|
|
||||||
|
If you need to pass additional configuration for a containerd shim, you can
|
||||||
|
use the `runtimes` option in the daemon configuration file.
|
||||||
|
|
||||||
|
1. Edit the daemon configuration file by adding a `runtimes` entry for the
|
||||||
|
shim you want to configure.
|
||||||
|
|
||||||
|
- Specify the fully qualified name for the runtime in `runtimeType` key
|
||||||
|
- Add your runtime configuration under the `options` key
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"runtimes": {
|
||||||
|
"gvisor": {
|
||||||
|
"runtimeType": "io.containerd.runsc.v1",
|
||||||
|
"options": {
|
||||||
|
"TypeUrl": "io.containerd.runsc.v1.options",
|
||||||
|
"ConfigPath": "/etc/containerd/runsc.toml"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Reload the daemon's configuration.
|
||||||
|
|
||||||
|
```console
|
||||||
|
# systemctl reload docker
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Use the customized runtime using the `--runtime` flag for `docker run`.
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ docker run --runtime gvisor hello-world
|
||||||
|
```
|
||||||
|
|
||||||
|
For more information about the configuration options for containerd shims, see
|
||||||
|
[Configure containerd shims](./reference/commandline/dockerd.md#configure-containerd-shims).
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
The following examples show you how to set up and use alternative container
|
||||||
|
runtimes with Docker Engine.
|
||||||
|
|
||||||
|
- [youki](#youki)
|
||||||
|
- [Wasmtime](#youki)
|
||||||
|
|
||||||
|
### youki
|
||||||
|
|
||||||
|
youki is a container runtime written in Rust.
|
||||||
|
youki claims to be faster and use less memory than runc,
|
||||||
|
making it a good choice for resource-constrained environments.
|
||||||
|
|
||||||
|
youki functions as a drop-in replacement for runc, meaning it relies on the
|
||||||
|
runc shim to invoke the runtime binary. When you register runtimes acting as
|
||||||
|
runc replacements, you configure the path to the runtime executable, and
|
||||||
|
optionally a set of runtime arguments. For more information, see
|
||||||
|
[Configure runc drop-in replacements](./reference/commandline/dockerd.md#configure-runc-drop-in-replacements).
|
||||||
|
|
||||||
|
To add youki as a container runtime:
|
||||||
|
|
||||||
|
1. Install youki and its dependencies.
|
||||||
|
|
||||||
|
For instructions, refer to the
|
||||||
|
[official setup guide](https://containers.github.io/youki/user/basic_setup.html){: target="\_blank" rel="noopener"}.
|
||||||
|
|
||||||
|
2. Register youki as a runtime for Docker by editing the Docker daemon
|
||||||
|
configuration file, located at `/etc/docker/daemon.json` by default.
|
||||||
|
|
||||||
|
The `path` key should specify the path to wherever you installed youki.
|
||||||
|
|
||||||
|
```console
|
||||||
|
# cat > /etc/docker/daemon.json <<EOF
|
||||||
|
{
|
||||||
|
"runtimes": {
|
||||||
|
"youki": {
|
||||||
|
"path": "/usr/local/bin/youki"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Reload the daemon's configuration.
|
||||||
|
|
||||||
|
```console
|
||||||
|
# systemctl reload docker
|
||||||
|
```
|
||||||
|
|
||||||
|
Now you can run containers that use youki as a runtime.
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ docker run --rm --runtime youki hello-world
|
||||||
|
```
|
||||||
|
|
||||||
|
### Wasmtime
|
||||||
|
|
||||||
|
Wasmtime is a
|
||||||
|
[Bytecode Alliance](https://bytecodealliance.org/){:target="\_blank" rel="noopener"}
|
||||||
|
project, and a Wasm runtime that lets you run Wasm containers.
|
||||||
|
Running Wasm containers with Docker provides two layers of security.
|
||||||
|
You get all the benefits from container isolation,
|
||||||
|
plus the added sandboxing provided by the Wasm runtime environment.
|
||||||
|
|
||||||
|
To add Wasmtime as a container runtime, follow these steps:
|
||||||
|
|
||||||
|
1. Turn on the [containerd image store](../storage/containerd.md)
|
||||||
|
feature in the daemon configuration file.
|
||||||
|
|
||||||
|
> **Note**
|
||||||
|
>
|
||||||
|
> This is an experimental feature.
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"features": {
|
||||||
|
"containerd-snapshotter": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Restart the Docker daemon.
|
||||||
|
|
||||||
|
```console
|
||||||
|
# systemctl restart docker
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Install the Wasmtime containerd shim on `PATH`.
|
||||||
|
|
||||||
|
The following command Dockerfile builds the Wasmtime binary from source
|
||||||
|
and exports it to `./containerd-shim-wasmtime-v1`.
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ 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
|
||||||
|
```
|
||||||
|
|
||||||
|
Put the binary in a directory on `PATH`.
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ mv ./containerd-shim-wasmtime-v1 /usr/local/bin
|
||||||
|
```
|
||||||
|
|
||||||
|
Now you can run containers that use Wasmtime as a runtime.
|
||||||
|
|
||||||
|
```console
|
||||||
|
$ docker run --rm \
|
||||||
|
--runtime io.containerd.wasmtime.v1 \
|
||||||
|
--platform wasi/wasm32 \
|
||||||
|
michaelirwin244/wasm-example
|
||||||
|
```
|
||||||
|
|
||||||
|
## Related information
|
||||||
|
|
||||||
|
- To learn more about the configuration options for container runtimes,
|
||||||
|
see [Configure container runtimes](./reference/commandline/dockerd.md#configure-container-runtimes).
|
||||||
|
- You can configure which runtime that the daemon should use as its default.
|
||||||
|
Refer to [Configure the default container runtime](./reference/commandline/dockerd.md#configure-the-default-container-runtime).
|
Loading…
Reference in New Issue