블로그


2013년 도커(Docker)와 컨테이너 기술이 나타난 이후 도커는 업계 표준 기술 중 하나로 자리 잡았고, 소프트웨어 개발에 혁명을 일으켰습니다.


도커는 컨테이너화된 애플리케이션을 빌드, 배포 및 실행하기 위한 통합 플랫폼으로 널리 사용되었는데 초기에는 Monolithic 한 구조였습니다. 하지만 시간이 지나면서 사용자와 개발자가 보다 세분화된 컨트롤과 경량화된 도구를 원하게 되면서 이를 나누는 작업이 시작되었습니다. 이는 컨테이너 오케스트레이션과 런타임을 분리하는 움직임으로 이어지게 되었습니다.


containerd(컨테이너디)는 이러한 요구를 충족하기 위해 2017년 3월에 도커내부에서 분리되어 독립적인 오픈소스 프로젝트로 발전했습니다.




│containerd(컨테이너디)란?!


containerd(컨테이너디)는 컨테이너 오케스트레이션 시스템을 위한 경량화된 고수준 컨테이너 런타임입니다.


containerd의 본격적인 설명에 앞서 간단하게 런타임에 대해 알아보자면, 런타임은 컴퓨터 프로그램 실행을 돕는 소프트웨어로 OS 자체 또는 OS 위에서 실행되면서 특정 프로그래밍 언어가 구동될 수 있는 환경을 의미합니다. 예를 들어 Javascript가 브라우저에서 실행된다면 런타임 환경은 브라우저가 되고, Node.js에서 실행된다면 Node.js가 런타임 환경이 됩니다. 쉽게 말해 런타임은 '구동 환경'이라고 말할 수 있습니다.




다시 containerd로 돌아와서, 컨테이너는 컨테이너 런타임 소프트웨어이며 이는 컨테이너 구동 환경이라고 이해할 수 있습니다. containerd는 컨테이너를 실행하고 노드에서 이미지를 관리하는데 필요한 최소한의 기능을 제공합니다. 참고로 containerd의 'd'가 daemon(주로 백그라운드에서 실행되는 프로세스나 서비스를 뜻함)의 d입니다.


containerd는 Docker에서 만든 컨테이너 런타임입니다. Docker의 핵심 컴포넌트에서 시작해서 CNCF(Cloud Native Computing Foundaion)에 의해 관리되고 있으며, 컨테이너 생명 주기 관리를 포함한 다양한 기능을 제공합니다. 또한 containerd는 쿠버네티스를 기본으로 지원하고 OCI(Open Container Initiative) 표준을 준수합니다.


이는 컨테이너 이미지와 런타임 사양에 대한 업계 표준을 따르는 것인데, 다양한 환경에서의 컨테이너 호환성을 보장하기 때문에 사실상 표준 컨테이너 런타임이라고 할 수 있습니다.




│containerd(컨테이너디)의 아키텍처


일반적으로 쿠버네티스로 구축하는 클러스터에서는 Docker(도커)를 이용하여 컨테이너를 실행합니다. 쿠버네티스가 Docker를 통해 컨테이너를 실행하기 위해서는 표준 인터페이스인 CRI(Container Runtime Interface)가 필요한데요. Docker에서는 CRI를 지원하지 않기 때문에 dockershim을 통해 컨테이너를 실행하게 됩니다.




containerd 1.0의 경우에도 컨테이너를 실행하려면 CRI-containerd라는 데몬이 필요했습니다. CRI-containerd는 Kubelet의 CRI 서비스 요청을 처리하고, containerd 1.0에서는 컨테이너 실행 과정이 Docker에 비해 한 단계 단축되었다고 말할 수 있습니다.




현재 containerd 1.1에서는 CRI-containerd 데몬이 이제 containerd CRI 플러그인으로 리팩토링 되었습니다. CRI 플러그인은 containerd 1.1에 내장되어 있으며 기본적으로 활성화되어 있습니다. CRI-containerd와 달리 CRI 플러그인은 직접 함수 호출을 통해 containerd와 상호작용합니다. containerd 1.1에서는 컨테이너 실행 과정이 또 한 단계 단축되고 더욱 안정적인 환경을 만들고 성능이 최적화되었습니다.




│containerd(컨테이너디)의 핵심 기능


containerd의 핵심 기능은 크게 네 가지로 구분할 수 있습니다.


첫째, 쿠버네티스와 같은 컨테이너 오케스트레이션 시스템과 통합을 위해 컨테이너 런타임 인터페이스(CRI, Container Runtime Interface)를 구현합니다. CRI는 쿠버네티스가 컨테이너를 생성, 실행, 중지 및 삭제하는 데 사용되는 표준 인터페이스입니다. containerd는 CRI를 통해 쿠버네티스와 통신하여 컨테이너를 관리하고 실행합니다.


둘째, 컨테이너의 라이프 사이클이라고 할 수 있는 컨테이너 생성, 실행, 중지, 삭제 등의 기본적인 생명주기를 관리합니다. 컨테이너 생명주기를 관리함으로써 컨테이너를 안정적으로 실행하고 관리할 수 있습니다.


셋째, 컨테이너 이미지 관리 기능입니다. 컨테이너 이미지는 컨테이너 기술의 핵심으로 개발부터 배포, 실행에 이르기까지 모든 단계에서 일관된 환경을 제공하는데요. containerd는 OCI 표준을 준수하는 이미지 포맷을 지원하며 컨테이너 이미지의 저장, 조회, 받기(pull) 및 전송(push) 기능을 수행하여 컨테이너 배포 및 실행에 필요한 이미지를 관리합니다.


넷째, 네트워킹 및 스토리지와 관련된 기능을 지원하여 컨테이너 간의 통신 및 데이터 관리를 가능하게 합니다. 네트워킹 기능으로는 컨테이너 간의 통신을 관리하고 네트워크 리소스를 할당하며, 스토리지 관리 기능으로는 컨테이너의 파일 시스템 및 볼륨을 관리하여 컨테이너가 데이터를 영구적으로 저장하고 관리하는 데 도움을 줄 수 있습니다.




│containerd(컨테이너디)와 Docker(도커)의 관계


containerd와 Docker는 컨테이너 생태계에서 서로 상호 보완적인 관계라고 말할 수 있습니다.


Docker는 개발자에게 편리한 컨테이너 관리 도구를 제공하는 반면, containerd는 컨테이너의 실행과 관리를 담당하는 핵심 기술로서, Docker를 포함한 다양한 플랫폼과 시스템에서 사용됩니다.


containerd는 운영 체제 상에서 컨테이너 작업을 용이하게 하고 Docker 엔진은 containerd 위에 위치하며 추가 기능과 개발자 경험 향상을 제공합니다. 바꿔 말하면 Docker는 containerd를 컨테이너 런타임으로 사용하고, Docker 엔진은 containerd를 통해 컨테이너를 실행하고, 이미지를 다루며, 컨테이너 생명주기를 관리합니다.




Docker의 초기 버전은 컨테이너 관리의 모든 기능을 내장하고 있었지만, 컨테이너 기술의 발전과 함께 컨테이너 런타임이 분리되면서 containerd는 2016년에 Docker에서 분리되어 독립적인 프로젝트가 되었습니다. 이러한 분리는 containerd가 Docker 이외에 다른 컨테이너 오케스트레이션 시스템과도 통합될 수 있는 기반을 마련했습니다.


containerd 프로젝트는 OCI 표준을 준수합니다. 이는 Docker를 포함한 다양한 컨테이너 기술에서 사용하는 이미지 형식과 런타임을 사용할 수 있어, 호환성 측면에서 뛰어나다는 것을 의미합니다. 따라서 Docker가 만든 컨테이너 이미지는 containerd는 물론 다른 OCI 호환 런타임에서 실행될 수 있습니다.








지메일, 유튜브, 구글 검색 등 구글에서 제공하는 모든 서비스가 컨테이너에서 실행되고 있습니다. 그만큼 컨테이너는 최근 IT에서 빼놓을 수 없는 기술이자 클라우드 네이티브로의 전환하는 과정에서도 필수입니다.


컨테이너가 필수 기술이 된 가운데 개발과 운영, 유지 보수 환경을 더욱 원활하고 효율적으로 만들기 위해 컨테이너 이미지를 쉽게 배포하고 관리하는 것도 중요합니다. 이를 위해서는 호환성이 높은 컨테이너 런타임을 사용하는 것이 필요합니다. 최근 컨테이너 생태계가 OCI와 CRI 중심으로 가고 있는 이유이기도 하죠.


앞으로도 컨테이너 생태계에서 containerd는 많이 쓰이고 계속해서 중요한 위치를 차지할 것으로 예상됩니다. 나아가 더욱 강력하고 안정적인 컨테이너 런타임으로의 발전이 기대되는데요, 아직 containerd를 사용해 보지 않았다면 한번 선택을 고려해 보는 건 어떨까요?


오다인 영업그룹 사진
오다인영업그룹

영업그룹에서 사업 수주를 위한 업무를 수행하며 Zenius의 위닝 포인트를 만들어 갑니다.

추천 콘텐츠