도커의 구조를 간략하게 알아보자
DevOps

도커의 구조를 간략하게 알아보자

다섯줄 요약

  1. 도커의 구조는 크게 클라이언트/서버 두가지로 나뉜다.
  2. 사용자가 docker version과 같은 도커 명령어를 입력하는 것은 도커 클라이언트를 이용하는 것이다.
  3. 입력한 도커 명령어는 소켓을 이용해 도커 데몬(도커 서버)에게 명령어를 전달한다.
  4. 도커 데몬은 명령어를 파싱해 해당하는 작업을 수행하고, 도커 클라이언트에게 결과를 반환한다.
  5. 도커 클라이언트는 전달받은 결과를 사용자에게 출력한다.


도커는 클라이언트로서의 도커와 서버로서의 도커로 나뉜다. 실제 컨테이너를 생성하고 실행하며 이미지를 관리하는 주체는 도커 서버이고, 이는 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를 사용할 수 있도록 하는 엔드유저용 도구로서의 역할을 수행한다. 이렇게 명령어에 해당하는 작업의 수행을 마치면 다시 도커 클라이언트에게 응답하고, 도커 클라이언트는 사용자에게 결과를 출력한다.