본문 바로가기

쿠버네티스

[쿠버네티스] 컨테이너의 대명사 '도커', 아키텍처로 이해하는 빌드와 배포의 메커니즘

Docker Container

Docker는 컨테이너 기반의 가상화 플랫폼으로, 애플리케이션을 격리된 공간에서 효율적으로 실행할 수 있도록 해줍니다. 실제로 Docker는 수많은 컨테이너 플랫폼 중 하나일 뿐이지만, ‘컨테이너’라는 개념이 대중화되는 데 가장 큰 역할을 한 대표적인 기술이기도 하며, 오늘날 가장 먼저 떠오르는 플랫폼입니다.

 

실제로 쿠버네티스의 빌드 및 배포 과정에서는 Docker가 사실상 표준처럼 사용되고 있으며, 컨테이너의 격리 기술에 대한 이해가 선행된다면 쿠버네티스의 구조와 동작 원리를 보다 쉽게 이해할 수 있습니다.

 

 

 

Docker의 구조를 보도록 하겠습니다.

 

 

ㅁ Docker Client

 

사용자가 명령어를 입력하는 인터페이스입니다.
예: docker container run ...

CLI 도구 또는 Docker Compose 등이 여기에 해당합니다

이 명령어는 Docker 데몬(dockerd)에게 API 요청을 보냅니다.
(HTTP/HTTPS over Unix Socket or TCP)

 


ㅁ Docker Daemon (dockerd)

 

Docker의 핵심 백그라운드 서비스입니다.

주요 기능으로는


- API 처리 (Docker 명령어 해석)

- 컨테이너/이미지 관리
- 네트워크 설정
- 스토리지 관리
- SwarmKit, BuildKit, Docker Content Trust 등 포함됩니다.

사용자의 명령을 받아서 containerd에게 gRPC로 요청을 보냅니다.
(예: client.NewContainer(...))

 

 

containerd (High-Level Runtime)

 

도커 내부에서 컨테이너 실행을 담당하는 컴포넌트입니다. 사실상 도커 없이도 독립적으로 컨테이너 실행이 가능한 런타임입니다.

 

주요 기능으로는
- 이미지 풀링
- 컨테이너 생성/삭제
- 네트워크 연결
- 볼륨 마운트

dockerd ↔ containerd는 gRPC 기반으로 통신합니다.

 

shim

 

containerd가 runc를 호출할 때 중간에서 컨테이너의 실행을 분리해주는 역할을 합니다. 각 컨테이너마다 별도의 shim 프로세스가 존재 하며 runc의 생명주기를 관리하면서도 containerd를 차단하지 않도록 도와주며 컨테이너의 표준 출력/입력, 상태 추적 등을 shim이 담당합니다.

 

 

ㅁ runc (Low-Level Runtime)

 

가장 하위 계층의 런타임으로서, 실제로 리눅스 커널의 cgroup, namespace 기능을 이용해 컨테이너를 생성하고 실행합니다.OCI(Open Container Initiative)에서 정의한 표준 사양을 따르기 떄문에 containerd 또는 CRI-O에서도 runc를 사용할 수 있습니다.

 

위 처럼 도커의 구조가 생각보다 간단하지 않습니다. 쿠버네티스 운영에 있어 더욱더 복잡한 개념들과 인프라들이 공존하기 때문에도커는 머리속에서 그려질 정도로 보는것이 좋습니다.