오늘은 컨테이너 런타임 중에서도 저수준 컨테이너 런타임에 대해서 알아보도록 하겠습니다.

일반적으로 저수준 런타임은 컨테이너 실행을 위한 low level 작업을 실행합니다. 계속해서 설명한 것처럼 컨테이너는 Linux namespace, cgroups 를 사용해 프로세스를 격리하여 구현됩니다. 네임스페이스는 파일 시스템 또는 각 컨테이너의 네트워킹과 같은 시스템 리소스를 가상화합니다.그리고 cgroup은 각 컨테이너가 사용할 수 있는 CPU 및 메모리와 같은 리소스의 양을 제한합니다. 결국 저수준 런타임은 네임스페이스와 cgroup을 사용하여 컨테이너를 구현하는 역할을 담당합니다.

아래는 가장 간단한 저수준 런타임의 동작 방식입니다.

  • cgroup 생성
  • cgroup 내에서 명령어 실행
  • 네임스페이스 이동을 위한 unshare
  • 명령이 완료된 후 cgroup 정리

먼저 첫 번째는 말 그대로 cgroup을 생성하고 프로세스를 실행하도록 준비합니다. 두 번째는 실제 원하는 명령이나 프로그램을 cgroup 내에서 실행합니다. 세 번째는 현재 프로세스가 동작하는 네임스페이스를 분리하여 독립적인 네임스페이스를 생성합니다. 이러면 cgrop과 해당 프로세스는 다른 네임스페이스를 가지게 되고, 서로 독립적인 환경에서 실행될 수 있습니다. 마지막으로 명령이 완료된 cgroup을 정리합니다.

이제 저수준 컨테이너 런타임의 예시에 대해서 알아보겠습니다.

lmctfy

Google에서 만든 런타임으로 Borg에 사용되고 있습니다. 가장 눈에 띄는 기능은 컨테이너 이름을 통해 cgroup 계층을 사용할 수 있다는 것입니다. 만약 “conatinerA” 라는 루트 컨테이너는 해당 이름으로 경로를 구성하는 “conatinerA/subContainer1”, “conatinerA/subContainer2” 를 생성할 수 있습니다. 이때 각 하위 컨테이너는 상위 컨테이너의 cgroup에 의해 제한되는 자체 cgroup을 가질 수 있습니다. 만약 “containerA”의 cgroup 에서 10이라는 리소스 제한을 걸어두고 각 하위 컨테이너의 cgroup은 6이라는 리소스 제한을 가지고 있다고 가정했을 때, 각 하위 컨테이너는 개별적으로 6, 6 을 사용할 수 있는 것처럼 보이지만 상위 컨테이너의 리소스 제한을 넘어서지 않도록 하위 컨테이너 리소스의 합이 10 이내가 되도록 실행됩니다.

runc

runc 는 현재 가장 널리 사용되는 컨테이너 런타임입니다. 원래 Docker 내부에 함께 개발되었으나 별도의 도구 및 라이브러리로 추출되었습니다.

runc는 OCI 런타임 사양을 구현합니다. 즉 특정 “OCI 번들” 형식에서 컨테이너를 실행합니다. 해당 형식은 config.jason 파일을 가지고 있습니다.

$ runc spec
$ cat config.json
{
        "ociVersion": "1.0.0",
        "process": {
                "terminal": true,
                "user": {
                        "uid": 0,
                        "gid": 0
                },
                "args": [
                        "sh"
                ],
                "env": [
                        "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                        "TERM=xterm"
                ],
                "cwd": "/",
                "capabilities": {
...

해당 명령어를 통해 config.json 파일을 생성하고 열어본다면 위와 같은 스펙을 확인할 수 있습니다.

rkt

rkt는 CoreOS에서 개발한 것으로 runc를 대체할 수 있는 유명한 런타임입니다. rkt도 runc와 같이 다른 하위 수준 런타임이 제공하는 모든 기능을 제공할 뿐만 아니라 상위 수준 런타임의 일반적인 기능도 함께 제공합니다. 때문에 rkt를 저수준 런타임이라고 명확하게 정의할 수는 없습니다.

rkt는 원래 Docker 컨테이너 형식의 대안에 대한 개방형 대체 표준으로 개발된 애플리케이션 컨테이너 (appc) 표준을 사용했습니다. Appc는 컨테이너 형식으로 널리 채택되지 않았으며 appc는 더 이상 적극적으로 개발되지 않게 되었습니다.

업데이트:

댓글남기기