본문 바로가기
Docker

Docker Engine

by hotdog7778 2023. 11. 29.

 

https://gngsn.tistory.com/128

 

 

 

1. 도커 클라이언트 (Docker Client)

도커 클라이언트는 사용자의 명령어를 도커 데몬에게 전달하고,

도커 데몬은 해당 명령을 처리하여 컨테이너 관리 및 다양한 도커 작업을 수행 한다.

 

명령 : Docker CLI 사용

변환 : Docker API로 변환

통신 : 

 - 로컬 환경에서는 Unix Socket을 통해 dockerd 와 통신

 - Docker CLI <--(Unix Socket)--> dockerd

 - 원격 환경에서는 HTTP 또는 HTTPS 를 사용하여 TLS Socket 으로 API 통신

 - Docker CLI <-(HTTP/HTTPS)--> dockerd (with TLS)

 

즉, Docker Client는 개발자들이 Docker를 사용하는 Docker CLI나 Docker Compose 를 써서
$ docker run 과 같은 명령어를 dockerd에게 REST API 형태로 전달

 

2. 도커 데몬 (Docker Deamon = dockerd)

dockerd의 역할로는 이미지 관리, 이미지 빌드, REST API, 인증, 보안, 코어 네트워킹, 오케스트레이션 등이 있다.

 

dockerd가 '새로운 container를 생성하라'는 명령을 수신하면, containerd를 호출하고,
이때, dockerd는 CRUD 스타일 API를 통해 gRPC로 containerd와 통신 한다.
(e.g. client.NewContainer(context, ...) )

 

3. Containerd (container runtimes, high-level container runtimes)

 containerd는 원래 도커(Docker)의 일부분 이었다. 도커는 컨테이너 관리를 위한 여러 컴포넌트를 포함하는데, 그 중 하나가 바로 containerd 이고 초기에는 도커에서 분리되지 않고 내부에서 작동하며 컨테이너를 생성, 실행, 정지하고 제거하는 등의 기본적인 생명주기를 관리했다. 도커가 발전하면서, containerd는 더 독립적인 프로젝트로 바뀌었고, containerd 도커 내부에서 작동하는것이 아닌, 완전히 독립된 컨테이너 런타임으로 사용될 수 있게 되었다.

 즉, 도커에서 분리되며 컨테이너 관리를 위한 프로젝트로써 사용될 수 있도록 진화되어 왔으며 그로 인해 Kubernetes 등 다양한 플랫폼과 도구에서 containerd를 사용할 수 있게 되었다. 그 과정에서 containerd의 기능이 확장되어 왔으며 이미지, 볼륨, 네트워크, 컨테이너의 격리, 보안, 그리고 리소스 제한과 같은 추가적인 기능들도 개발되었다.

 

containerd는 실제로 containers를 생성하지 못하며 runc를 통해 생성 한다.

 

1. Docker 이미지 다운로드 및 구성:
containerd는 도커 이미지를 관리하고, 필요한 경우 이미지를 다운로드합니다. 또한, 컨테이너를 실행하기 위해 필요한 구성을 적용합니다.

 

2. OCI 번들로 변환:
containerd는 도커 이미지와 적절한 구성을 사용하여 OCI 번들(OCI Bundle)로 변환합니다. OCI 번들은 컨테이너를 실행하는데 필요한 모든 파일 및 설정을 포함하는 디렉터리입니다.

 

3. 실제 실행은 runc에 위임:
containerd는 OCI 번들을 생성한 후, 실제 컨테이너의 실행을 runc와 같은 OCI 호환 런타임에 위임합니다. runc는 이 OCI 번들을 기반으로 컨테이너를 생성하고 실행합니다.

 

 

※ High-Level Runtime은 보통 이미지 관리, gRPC/Web API와 같이 컨테이너를 관리하는 것 이상의 높은 수준의 기능을 지원하는 런타임을 의미한다.

 

4. runc (Low-Level Runtime)

 

runc는 사용자에게 커맨드 라인에서 컨테이너를 다룰 수 있는 인터페이스를 제공하면서, 내부적으로는 libcontainer 라이브러리를 사용하여 컨테이너를 실제로 실행하고 관리하는 도구이다.

 

runc(내부의 libcontainer 사용)는 OS 커널에 접속해서 컨테이너를 만드는 데 필요한 모든 구성 요소(네임스페이스, cgroup 등)를 하나로 묶으며, 새로운 container를 생성 한다. (Docker에서 runc는 목적은 단 하나 Container 생성 이다.)

 - runc는 libcontainer용 CLI Wrapper로, 독립된 container runtime 이다.
 - runc는 docker가 container 관련된 기능들을 쉽게 사용할 수 있도록 해주는 가볍고 이식가능한 툴

 

다시 말해, container 동작 환경이 갖추어진 가볍고 이식 가능한 툴입니다.

※ libcontainer : Docker사가 multi-platform 서비스를 만들기 위해 go 언어로 작성된 패키지.
※ OCI : Open Container Initiative

 - OCI는 kernel의 container 관련 기술을 다루는 interface를 표준화시킨 기준이다.

 - runc는 OCI container-runtime-spec의 구현체
 - runc가 동작하는 계층을 OCI Layer라고 부른다.

 

5. shim

새로 시작되는 컨테이너 프로세스의 상위 프로세스가 되어 컨테이너의 생명주기를 관리한다. 

 

runc가 새로운 container를 생성하고, docker-containerd-shim과 같은 shim이 실행된다.

runc가 먼저 생성되는 컨테이너 프로세스의 상위 프로세스가 되며, 컨테이너의 할당된 부모 runc 프로세스가 종료되면, 연결된 containerd-shim 프로세스가 컨테이너의 부모프로세스가 된다.

https://gngsn.tistory.com/128

 

 

shim이 컨테이너의 상위 프로세서로서 수행하는 주요 역할
 - daemon이 재시작될 때, 파이프가 닫히는 등의 이유 때문에 container가 종료되지 않도록 STDIN과 STDOUT 스트림을 열린 상태로 유지
 - daemon에게 container의 종료 상태를 보고

이러한 역할수행은 containerd와 gRPC를 사용한 통신으로 이루어지고, shim은 containerd에게 컨테이너의 파일 디스크립터와 종료 상태를 관리하는 데 필요한 최소한의 코드를 메모리에 남긴다.

'Docker' 카테고리의 다른 글

Docker 없이 Container 만들기  (2) 2023.12.06
Docker, Container 개요  (0) 2023.11.29