docker client (docker cli, docker desktop)
docker engine
이미지와 컨테이너 관리/빌드/실행/배포 등 도커와 관련된 모든 작업을 담당하며 도커 데몬, api, 클라이언트(cli)를 포함하는 전체 도커 플랫폼을 구성하는 컴포넌트
항상 백그라운드 프로세스로 동작하며 도커 api를 통해 작업을 수행한다
컨테이너를 실행하기 위해 이미지가 필요하면 레지스트리로부터 다운받으며 로컬에 이미 존재한다면 도커 이미지 캐시에서 이미지를 꺼내와 사용한다
도커 엔진의 설정을 통해 외부 컴퓨터에서 도커 api를 호출하거나 제한할 수 있다
docker daemon (dockerd)
컨테이너 및 이미지 관리 네트워킹 볼륨 설정 등 전체 도커 동작을 책임지는 도커 엔진의 핵심 백그라운드 서비스
클라이언트(docker cli, docker desktop)로부터 rest api를 통해 명령을 받아 컨테이너 런타임에게 처리를 위임하고 받은 결과를 응답을 다시 클라이언트에게 rest api로 응답한다
도커 데몬은 내부에서 컨테이너 런타임으로 containerd를 사용한다
명령 처리 구조: docker cli -> docker daemon -> containerd -> runc
dockerd 실행 -> docker daemon 실행
docker run 명령 -> docker cli가 docker daemon과 통신
containerd
컨테이너를 생성/실행/관리/중지하는 백그라운드 서비스로 컨테이너 런타임을 제공하는 컨테이너 런타임 데몬(container runtime daemon)이다
OCI(Open Conatiner Initiative) 표준을 준수하며 도커 없이도 쿠버네티스와 같은 플랫폼에서 독립적으로 실행할 수 있다
초기에는 도커의 일부였지만 도커를 경량화하고 핵심 기능을 분리하기 위해 도커 엔진의 런타임 기능이 containerd로 분리되었다
현재는 CNCF(Cloud Native Computing Foundation) 프로젝트로 관리되며 도커 외에도 다양한 플랫폼에서 사용할 수 있는 독립적인 런타임으로 발전했다
도커 물론 컨테이너 관리를 위해 사용하고 있으며 도커 엔진은 containerd 위에 더 높은 수준의 api와 cli를 제공한다
containerd 구성 요소
컨테이너 서비스
컨테이너 생성/시작/중지/삭제와 같은 라이프사이클 작업 수행
이미지 서비스
OCI 이미지 형식을 지원하며 이미지를 push/pull하는 기능을 제공한다
스토리지 서비스
컨테이너 파일 시스템과 관련된 스냅샷을 관리한다
CRI(Container Runtime Interface) 플러그인
쿠버네티스와의 통합을 위한 인터페이스를 제공한다
shim
런타임과 컨테이너 프로세스 사이의 연결을 관리하는 작은 프로그램
런타임 의존성을 줄이고 컨테이너 크래시와 데몬 크래시를 분리한다
docker client (docker cli, docker desktop)
사용자는 도커 클라이언트(docker cli, docker desktop)를 통해 도커 데몬과 rest api로 통신한다
docker
명령어로 요청을 전송하면 데몬이 처리한 후 그 결과를 rest api 응답으로 도커 클라이언트에게 반환한다
container
도커 컨테이너는 도커 이미지를 통해 생성된 호스트 및 다른 컨테이너로부터 독립된 실행 환경이다
호스트 os 커널과 리소스를 공유하지만 자신만의 파일 시스템, 디스크 드라이브, 네트워크 인터페이스를 구축한 가상 컨테이너 환경을 구축한다
컨테이너 환경은 호스트 os에 따라 결정된다 (윈도우 os - 윈도우, 맥/리눅스 - 리눅스)
network
도커 컨테이너는 독립된 실행 환경이므로 자신만의 네트워크 환경을 구축할 수 있다
브릿지, 호스트, 오버레이 등의 네트워크 드라이버를 사용하여 컨테이너 간, 컨테이너와 외부 네트워크 통신 등 컨테이너의 네트워크를 구성한다
기본적으로 외부 네트워크 접근으로부터 격리되어 있다
volume
컨테이너는 데이터를 영속화하지 않기 때문에 실행 중 생성된 데이터는 모두 휘발된다
컨테이너간 데이터를 공유하거나 영속화하기 위해 도커 볼륨을 사용한다
image
도커 이미지는 컨테이너를 실행하기 위한 모든 파일과 메타데이터를 포함한 즉시 실행 가능한(읽기 전용) 템플릿이다
이미지는 여러 레이어로 구성되며, 각각의 레이어는 파일 시스템 스냅샷을 포함한다
이미지는 docker hub와 같은 공개 레지스트리나 사설 레지스트리에서 관리되며, 이를 통해 이미지를 공유, 배포, 다운로드할 수 있다
dockerfile
도커 이미지를 빌드하기 위한 설정 파일이다
베이스 이미지, 애플리케이션 파일, 의존성, 실행 명령어, 환경 변수 등이 포함된다
docker registry
도커 이미지를 저장하고 배포하는 시스템이다
공유 범위에 따라 공개/사설 레지스트리로 나뉜다
공개 레지스트리: docker hub
docker compose
여러 컨테이너를 정의하고 다룰 수 있게 해주는 컨테이너 관리 도구
docker-compose.yml
파일을 통해 여러 컨테이너를 정의하고 하나의 명령어로 이들을 함께 시작하거나 중지하는 등의 관리를 수행할 수 있다
docker swarm
도커의 네이티브 오케스트레이션 도구로 여러 도커 호스트에서 컨테이너를 클러스터링하고 관리한다
스웜 모드를 사용하면 여러 도커 데몬을 클러스터로 구성하고, 이 클러스터 내에서 서비스(컨테이너)를 배포하고 관리할 수 있다