Docker Deepdive #1 - 컨테이너 표준: OCI와 CRI
INFRA DEEPDIVE 시리즈 목차
- Infra Deepdive #0 - 스터디를 시작하며
- Docker Deepdive #1 - 컨테이너 표준: OCI와 CRI
- Docker Deepdive #2 - 컨테이너 이미지 레이어
- Docker Deepdive #3 - 도커 네트워크
- Kubernetes Deepdive #1 - 쿠버네티스 컴포넌트 분석 (미작성)
- Kubernetes Deepdive #2 - 쿠버네티스 네트워크 (미작성)
- Kubernetes Deepdive #3 - 쿠버네티스 오퍼레이터 (미작성)
ASK: 가상화 기술이란 무엇인가?
가상 머신이란, 하나의 물리적인 머신에서 독립적으로 일정한 리소스(CPU, Memory, Network, Storage)를 격리하는 기술
가상 머신들은 메모리 관점에서 각 리소스를 동작하기 위한 별도의 커널을 할당받고, 하이퍼바이저가 가상 머신들을 컨텍스트 스위칭하면서 동작시킴
하지만 가상 머신은 커널을 별도로 할당받는다는 점에서 하이퍼바이저의 컨텍스트 스위칭 비용이 문제가 크다는 단점이 있음
ASK: 컨테이너 기술이란 무엇인가?
컨테이너는 리소스를 격리된 상태로 제공할 수 있는 프로세스
컨테이너의 핵심은 프로세스이지만, 리소스를 격리할 수 있다는 점
ASK: 리소스 격리란 무엇인가?
하드웨어 관점에서는 CPU, Memory, Storage를 의미
소프트웨어 관점에서는 File System, Network를 의미
ASK: 컨테이너의 리소스 격리 기술은 무엇인가?
cgroup은 CPU, Memory, Storage 등 하드웨어 리소스를 가상화
namespace는 File System, Network 등 소프트웨어 리소스를 가상화
ASK: 컨테이너의 리소스를 격리하고, 컨테이너를 실행하는 주체는 누구인가?
컨테이너를 생성하고 실행하는 주체를 컨테이너 런타임이라고 함
컨테이너 런타임이 하는 일
- 호스트OS 커널과 통하여 컨테이너를 실행하고, 격리된 공간을 만든다.
- 실행, 일시 중지, 중지, 네임스페이스, cgroup, 네트워크 인터페이스 관리 등 저수준 작업을 처리한다. → 저수준 컨테이너 런타임(Low-Level Container Runtime)이라고 함
- 컨테이너의 수명 주기를 담당한다.
- 도커의 경우 컨테이너 런타임으로 LXC→libcontainer→runC 순으로 사용하는 런타임이 발전됨
- 가장 유명한 컨테이너 런타임으로는 runC가 있음 (사실상 표준)
ASK: 컨테이너를 실행하고, 리소스를 격리하는 저수준 컨테이너 런타임 runC
runC란 OCI 표준 스펙에 맞추어 컨테이너를 생성하고 실행하는 저수준 컨테이너 런타임
Docker 및 기타 컨테이너 플랫폼이 내부적으로 사용하고 있는 컨테이너 런타임 + 사실상 표준
runC로 구현된 계층을 저수준 컨테이너 런타임(Low-Level Container Runtime)이라고 함
runC가 하는 일
- 컨테이너 구성
- namespace 및 cgroup을 설정
- namespace는 컨테이너가 자신의 리소스 집합만 볼 수 있도록 격리를 제공
- cgroup은 컨테이너가 사용할 수 있는 리소스(CPU, Memory, I/O)를 제한하고 모니터링
- 단순성, 이식성, OCI 런타임 사양 준수에 중점
ASK: 컨테이너의 생성, 실행은 runC라는 저수준 컨테이너 런타임이 담당한다. 그렇다면 이미지 관리는 누가 담당할까? 고수준 컨테이너 런타임
이미지↔컨테이너는, 프로그램↔프로세스의 관계와 같다.
우리가 명령어(컨테이너 생성, 삭제, 조회)를 입력하면 명령어는 고수준 컨테이너 런타임에게 명령어를 전달
고수준 컨테이너 런타임은 필요에 따라 저수준 컨테이너 런타임에 명령 전달
고수준 컨테이너 런타임에는 containerd, CRI-O 등이 있음
EXAMPLE: 도커와 컨테이너 런타임의 관계
Docker는 Docker CLI 도구와 Docker Demon으로 나뉘게 됨
- Docker Daemon (.dockerd) → 표준 API를 제공하고 고수준 컨테이너 런타임과 통신하는 백그라운드 프로세스
- Docker CLI (docker-cli) → Docker 데몬과 상호작용하는 도구 (docker 명령어를 제공)
ASK: 컨테이너를 관리하기 위한 도구들의 표준: 고수준 컨테이너 런타임 표준 CRI (Container Runtime Interface)
쿠버네티스가 등장한 이후, 컨테이너 런타임 여러 개를 동시에 사용할 수 있도록 컨테이너 런타임 표준이 제정되었음
쿠버네티스는 고수준 컨테이너 런타임을 관리하는 CRI-O, Docker 등을 제어해야 하는데, 이를 위해 고수준 컨테이너 런타임 표준이 필요해졌음
ASK: 저수준 컨테이너 런타임 표준: OCI (Open Container Initiative)
OCI의 목표: 컨테이너 포맷/런타임 관련 표준 및 오픈 스펙을 제공하여 컨테이너 생태계 호환성 강화
runC는 OCI 호환 런타임, 구현 도구임
OCI 표준 컨테이너가 만족해야하는 5가지 원칙
- 표준 동작: 표준 컨테이너 도구들로 컨테이너 생성, 시작, 정지가 가능해야 함
- 내용 중립성: 표준 컨테이너는 컨테이너가 담고 있는 어플리케이션의 종류에 상관없이 표준 동작들이 동일하게 동작해야 함
- 인프라 중립성: 표준 컨테이너는 OCI 지원 인프라라면 종류에 상관없이 컨테이너 실행이 가능해야 함
- 자동화를 위한 설계: 표준 컨테이너는 컨테이너 내용과 인프라 종류에 상관없이 동일한 표준 동작을 지원하기 때문에 자동화가 용이함
- 산업 수준의 배포: 표준 컨테이너는 기업 규모에 상관없이 산업 수준의 배포가 가능해야 함
EXAMPLE: CRI와 OCI의 이미지
참고자료
- Docker, containerd, CRI-O 및 runC의 차이점 - https://www.tutorialworks.com/difference-docker-containerd-runc-crio-oci/
- 컨테이너 런타임이란 무엇인가? - https://jake-seo-dev.tistory.com/734#��%A-�%–%-C�%-D%B-�%–%–%–�%-F%B-�%–%–�%-E%–�%-D%B-�%-E%–%-F
- Container Runtime - https://insujang.github.io/2019-10-31/container-runtime/
- 컨테이너 표준 규격 OCI, 컨테이너 런타임 CRI 이해하기 - https://m.blog.naver.com/pjt3591oo/222992244712