컨테이너 기술의 발전과 함께, Docker 이후로 많은 컨테이너 런타임이 생겨나게 되었다. 당시에는 컨테이너 런타임에 대한 표준 인터페이스가 존재하지 않아 런타임별 서로 다른 인터페이스를 갖는 경우가 빈번했다. 이로 인해 많은 혼란과 불편함이 발생하였다. 이를 해결하기 위해, 2015년 6월 IBM, Docker, CoreOS, Google, MS 주요 회사들이 컨테이너 런타임에 대한 표준을 만들기 위해 OCI(Open Container Initiative
)를 구성하였다. OCI는 컨테이너 런타임에 대한 표준을 제시하였고, 현재 대부분의 컨테이너 런타임은 이를 따르고 있다.
공식문서에 따르면, runc는 OCI 런타임 표준을 준수하는 컨테이너를 생성 및 실행하기 위한 CLI 툴이다.
컨테이너 기술의 핵심은 namespace
격리와 cgroup
제어로 호스트와 격리된 환경에서 프로세스를 실행하는 것이다. 그러나, namespace와 cgroups는 리눅스 커널에 내장된 기능이다. 따라서, Docker는 서로 다른 커널의 인터페이스, 버전에 맞춰 컨테이너를 실행할 수 있어야 했다.
과거, Docker는 LXC
등의 외부 드라이버에 의존하여 namespace
분리와 cgroups
관리 등의 시스템 제어를 하였다. 그러나, 이후 libcontainer라는 별도의 구현체를 개발하여 사용하였다. runc
는 이러한 libcontainer
의 client wrapper
로 Go 언어로 개발되었으며, 현재 Docker에서 저수준 컨테이너 런타임으로 사용되고 있다.
runC: The little engine that could (run Docker containers) - Black Belt Track
흔들리는 도커(Docker)의 위상 - OCI와 CRI 중심으로 재편되는 컨테이너 생태계
도커 컨테이너 까보기(3) – Docker Process, Binary