현재 쿠버네티스 관련하여 사실상 다시 공부하고 있다. 이해하고 넘어가야 좀 속이 시원할 것 같아서 정리해본다.
1. Docker vs containerd
개념
- Docker
- 컨테이너 생태계를 대중화시킨 올인원 플랫폼
- CLI, 빌드 시스템, 이미지 관리, 런타임까지 포함
- containerd
- CNCF 프로젝트로 독립된 컨테이너 런타임
- 실행, 이미지 관리, 스냅샷 관리에 집중
- 쿠버네티스 기본 런타임으로 채택

2. Docker → containerd 전환 배경
1. 초기 구조
- 쿠버네티스는 Docker만 지원
kubelet → dockershim → Docker → containerd → runc
2. 문제점
- 중간 계층(dockershim) 때문에 복잡성/성능 저하
- K8s는 컨테이너 실행만 필요했는데 Docker는 불필요한 기능 과다
3. 해결책
- 2016: CRI(Container Runtime Interface) 도입
- containerd, CRI-O가 CRI를 직접 지원 → kubelet과 바로 통신 가능
4. Dockershim 제거
- 2020: K8s 1.20, Dockershim Deprecation 발표
- 2022: K8s 1.24, Dockershim 완전 제거
5. 정리
- Docker
- 개발자가 쓰기 좋은 풀패키지 도구 (빌드 + 실행 + 이미지 관리 + CLI)
- 로컬 개발 환경, 테스트 환경에서 여전히 많이 사용됨
- containerd
- 컨테이너 엔진 역할만 담당
- 쿠버네티스에서 기본 런타임으로 사용됨
- 불필요한 기능 없이 가볍고 안정적
- CRI
- 쿠버네티스(kubelet)와 런타임을 연결하는 표준 인터페이스
- 덕분에 쿠버네티스는 특정 런타임(Docker)에 종속되지 않고, containerd, CRI-O 같은 다양한 런타임을 쉽게 교체 가능
예시)
- Docker = 자동차 전체 (핸들, 차체, 엔진, 내비게이션 포함)
- containerd = 엔진
- CRI = 자동차 운전 표준 (핸들, 페달 조작법)