티스토리 뷰
개요
Docker, Containerd, CRI-O, Podman 등등 Container와 관련한, 비슷한 듯 헷갈리는 개념들이 많아서 확실히 정리를 해보고자 한다.
특히나 Container Engine 와 Container Runtime, 이 둘을 혼용해서 쓰는 경우가 있어서 더욱 헷갈렸다.
Container Runtime을 큰 의미에서 Container Engine과 같은 의미로 쓰는 경우가 있으며
low-level의 Container Runtime으로 쓰일때는 runc 정도의 개념으로 쓰인다.
지금부터 하나씩 천천히 짚어가보자
Docker
container 를 널리 퍼뜨린 장본인이다. Docker와 container 가 거의 같은 개념으로 생각될 정도다.
그러다 여러 기업들이 뛰어들자 혼돈이 우려되어 표준을 정리하기 시작했다.
Open Container Initiative(OCI)
container와 container image와 관련한 표준 스펙을 정하는 곳이다.
Container Runtime Interface(CRI)
Kubernates와 그 내부에 있는 container runtime 사이의 API를 정의한 것이다.
인터페이스는 약속이라고 생각하면 이해하기 쉽다. 예를 들면 이런것이다.
container image를 실행시키고 싶다면 이런 저런 파라미터를 저쪽으로, 요렇게 보내면 된다.
전체 조망
다음 그림이 OCI spec과 CRI, 그리고 이어서 소개할 많은 것들을 잘 설명해주고 있다.
- OCI spec과 그 스펙에 따라 실제로 구현한 runc가 보인다. container image와 그 실행을 다루고 있으며 runc를 이용해 container process를 생성하고 실행할 수 있다.
- CRI도 두 번째 단계에서 보인다. CRI는 Kubernetes가 container runtime과 소통하기 위한 약속이라고 하였는데, 아래의 containerd와 CRI-O가 그 약속을 준수하여 만든 Container Runtime인 것이다. (low-lovel의 container runtime인 runc와 구분하자.)
출처: Tutorial Works: The relationship between Docker, CRI-O, containerd and runc – in a nutshell
Docker 를 사용한 전형적인 사용 흐름을 살펴보자
- 사용자는 docker cli툴을 이용해 containerd라는 Container Runtime에 명령을 전달한다.
- containerd Runtime은 image를 push/pull 하고, 저장, 네트워킹, container 관리를 해준다.
- 하지만 저수준의 Container Runtime인 runc가 실제 작업을 한다. Go로 만든 libcontainer를 포함하고 있다.
출처: Tutorial Works: The relationship between Docker, CRI-O, containerd and runc – in a nutshell
그러면 Dockershim 은 뭔데?
대충 아래처럼 이해하면 될 듯
Kubernetes: container 쓰고 싶다.
Docker: 그러면 dockershim 을 쓰면 돼. 이걸 Kubernetes안에 넣어두고 docker로 container 실행할때 써요.
Kubernetes: 그런데 CRI 호환되는 녀석이면 좋겠는데... 찜찜해서 dockershim 빼버릴거임
- docker: 그러면 호환되는 containerd 라는 Container Runtime 만들어줌
- Red Hat을 비롯한 회사들: CRI-O라는 Container Runtime 만들어줌
Docker Image는 정확히는 OCI 포맷에 맞게 패키징된 이미지
그래서 OCI image format spec에 맞게 만들어진 이미지는 docker 명령이건, Kubernetes cluster이건, 심지어 podman에서도 사용할 수 있다.
Containerd와 CRI-O
runc가 저수준(low-level) Container Runtime이라면 containerd와 CRI-O는 고수준(high-level) Container
이들을 Container Engine이라고도 한다. CRI를 만족한다. 즉, Kubernetes에서 쓸 수 있다.
runc
저수준에서 실제로 container와 관련한 작업을 하는 녀석이다. container를 생성하고 실행하는 녀석인 것이다. 리눅스의 namespace나 control group과 실제 소통을 한다.
runc는 Golang으로 만든 OCI 호환 Container Runtime중의 하나일 뿐이다. 다른 녀석들로는 crun, kata-runtime, gVisor등이 있다.
잠깐, 마지막으로 podman
CRI-O, containerd, Docker cli와 같은 역할을 하는 녀석인데 몇몇 다른 특성을 가진 녀석이라고만 생각해두자. 좋은 이미지 하나 공유한다.
참고 링크들
'development' 카테고리의 다른 글
프로젝트 킥오프 미팅을 알아보자 (0) | 2023.02.08 |
---|---|
임백준님의 "개발자의 평생공부" 칼럼을 읽고 (0) | 2023.02.02 |
27년차 실리콘벨리 개발자 한기용님 인터뷰 정리 (0) | 2022.08.14 |
QCY-HT01을 Windows 10 PC에 연결하기 (0) | 2022.01.17 |
마인크래프트 Pocket Edition Server on Oracle Cloud (2) | 2021.12.27 |
- Total
- Today
- Yesterday
- intellij
- agile
- 독서
- bun
- ChatGPT
- 영화
- folklore
- OpenAI
- Bug
- 잡학툰
- 클린 애자일
- Gin
- 인텔리제이
- 노션
- 독서후기
- 2023
- 티스토리챌린지
- golang
- github
- 체호프
- solid
- 엉클 밥
- strange
- clean agile
- 제이펍
- go
- API
- 오블완
- notion
- websocket
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |