대체 컨테이너 런타임

대체 컨테이너 런타임 (Alternative container runtimes)

Docker Engine은 컨테이너 생성, 시작, 중지를 포함한 컨테이너 수명주기 관리를 위해 containerd를 사용해요. 기본적으로 containerd는 runc를 컨테이너 런타임으로 사용해요.

출처: 문서

본문

어떤 런타임을 사용할 수 있나요? (What runtimes can I use?)

containerd shim API를 구현하는 어떤 런타임이든 사용할 수 있어요. 그런 런타임에는 containerd shim이 함께 제공되며, 추가 구성 없이 사용할 수 있어요. Use containerd shims 참고.

자체 containerd shim을 구현하는 런타임의 예시는:

runc의 드롭인 교체(drop-in replacement)로 설계된 런타임도 사용할 수 있어요. 그런 런타임은 런타임 바이너리를 호출하기 위해 runc containerd shim에 의존해요. 이런 런타임은 데몬 구성에 수동으로 등록해야 해요.

youki는 runc 드롭인 교체로 기능할 수 있는 런타임의 한 예시예요. 설정을 설명하는 youki 예시를 참고하세요.

containerd shim 사용 (Use containerd shims)

containerd shim을 사용하면 Docker 데몬의 구성을 바꾸지 않고도 대체 런타임을 사용할 수 있어요. containerd shim을 사용하려면 Docker 데몬이 실행되는 시스템의 PATH에 shim 바이너리를 설치해요.

docker run과 함께 shim을 사용하려면 --runtime 플래그의 값으로 런타임의 정규화된 이름을 지정해요:

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

PATH에 설치하지 않고 containerd shim 사용 (Use a containerd shim without installing on PATH)

PATH에 설치하지 않고 shim을 사용할 수 있는데, 이 경우 데몬 구성에 다음과 같이 shim을 등록해야 해요:

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

shim을 사용하려면 할당한 이름을 지정해요:

$ docker run --runtime foo hello-world

shim 구성 (Configure shims)

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"
      }
    }
  }
}
  1. 데몬의 구성을 리로드해요.
# systemctl reload docker
  1. docker run--runtime 플래그로 사용자 지정 런타임을 사용해요.
$ docker run --runtime gvisor hello-world

containerd shim의 구성 옵션에 대한 자세한 내용은 Configure containerd shims를 참고하세요.

예시 (Examples)

다음 예시는 Docker Engine과 함께 대체 컨테이너 런타임을 설정하고 사용하는 방법을 보여줘요.

  • youki
  • Wasmtime

youki

youki는 Rust로 작성된 컨테이너 런타임이에요. youki는 runc보다 빠르고 메모리를 덜 사용한다고 주장하며, 리소스가 제한된 환경에 좋은 선택이에요.

youki는 runc의 드롭인 교체로 기능하며, 런타임 바이너리를 호출할 때 runc shim에 의존한다는 뜻이에요. runc 교체로 동작하는 런타임을 등록할 때는 런타임 실행 파일의 경로와 선택적으로 런타임 인자 집합을 구성해요. 자세한 내용은 Configure runc drop-in replacements를 참고하세요.

youki를 컨테이너 런타임으로 추가하려면:

  1. youki와 그 의존성을 설치해요. 설치 지침은 공식 설정 가이드를 참고하세요.

  2. 기본적으로 /etc/docker/daemon.json에 있는 Docker 데몬 구성 파일을 편집해 youki를 Docker용 런타임으로 등록해요. path 키는 youki를 설치한 위치의 경로를 지정해야 해요.

# cat > /etc/docker/daemon.json <<EOF
{
  "runtimes": {
    "youki": {
      "path": "/usr/local/bin/youki"
    }
  }
}
EOF
  1. 데몬의 구성을 리로드해요.
# systemctl reload docker

이제 youki를 런타임으로 사용하는 컨테이너를 실행할 수 있어요.

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

Wasmtime

사용 가능 여부: Experimental

Wasmtime은 Bytecode Alliance 프로젝트이자, Wasm 컨테이너를 실행할 수 있게 해주는 Wasm 런타임이에요. Docker로 Wasm 컨테이너를 실행하면 두 겹의 보안을 얻을 수 있어요. 컨테이너 격리의 모든 이점과 함께 Wasm 런타임 환경이 제공하는 추가 샌드박싱을 얻을 수 있어요.

Wasmtime을 컨테이너 런타임으로 추가하려면 다음 단계를 따라요:

  1. 데몬 구성 파일에서 containerd image store 기능을 켜요.
{
  "features": {
    "containerd-snapshotter": true
  }
}
  1. Docker 데몬을 재시작해요.
# systemctl restart docker
  1. PATH에 Wasmtime containerd shim을 설치해요. 다음 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

더 알아보기 (Learn more)