다섯줄 요약
- 도커의 구조는 크게 클라이언트/서버 두가지로 나뉜다.
- 사용자가 docker version과 같은 도커 명령어를 입력하는 것은 도커 클라이언트를 이용하는 것이다.
- 입력한 도커 명령어는 소켓을 이용해 도커 데몬(도커 서버)에게 명령어를 전달한다.
- 도커 데몬은 명령어를 파싱해 해당하는 작업을 수행하고, 도커 클라이언트에게 결과를 반환한다.
- 도커 클라이언트는 전달받은 결과를 사용자에게 출력한다.
도커는 클라이언트로서의 도커와 서버로서의 도커로 나뉜다. 실제 컨테이너를 생성하고 실행하며 이미지를 관리하는 주체는 도커 서버이고, 이는 dockerd 프로세스로서 동작한다.
- dockerd: docker daemon
도커 데몬은 API 입력을 받아 도커 엔진의 기능을 수행한다. 이 때, 사용자가 이 API를 사용할 수 있도록 CLI를 제공하는 것이 도커 클라이언트이다.
즉, 사용자가 docker로 시작하는 명령어를 입력하면 도커 클라이언트는 입력된 명령어를 도커 데몬에게 API로서 전달한다. 이 때, 도커 클라이언트는 /var/run/docker.sock에 위치한 유닉스 소켓을 통해 도커 데몬의 API를 호출한다. 이때의 소켓은 같은 호스트 내에 있는 도커 데몬에게 명령을 전달할 때 사용한다.
- 같은 호스트가 아닌 -H 옵션을 사용해 tcp로 원격 API를 활용할 때에는 HTTP 요청으로 제어한다.
도커 데몬은 전달받은 명령어를 파싱해 명령어에 해당하는 작업을 수행한다. 이 때, containerd와 통신한다. 컨테이너-디는 실제 여러개의 runC 컨테이너 프로세스 및 이미지를 관리하는 주체이다. 여기서 runC는 컨테이너 프로세스라고 불리우며 컨테이너에 1:1로 매칭되는 런타임 역할을 한다.
즉, 도커 엔진(도커 데몬 프로세스)은 containerd와 통신해 runC를 사용할 수 있도록 하는 엔드유저용 도구로서의 역할을 수행한다. 이렇게 명령어에 해당하는 작업의 수행을 마치면 다시 도커 클라이언트에게 응답하고, 도커 클라이언트는 사용자에게 결과를 출력한다.