Profile picture

[Docker] 도커 아키텍처(Architecture)

JaehyoJJAng2022년 03월 25일

▶︎ 도커

image
도커는 2013년에 최초로 공개된 오픈소스 소프트웨어이고, 컨테이너 가상화 기술을 위한 도구이다.

도커를 사용하면 컨테이너 가상화 기술을 클라이언트가 손쉽게 활용할 수 있다.


image
도커와 같은 컨테이너 가상화 도구를 컨테이너 플랫폼이라고도 부르는데

이 컨테이너 플랫폼은 자체적으로 가지고 있는 컨테이너 엔진(Container Engine)과 컨테이너 런타임(Container Runtime)으로 구성되어 있다.

컨테이너 엔진은 말 그대로 사용자의 요청을 받아서 컨테이너를 관리해주는 역할을 하고,

컨테이너 런타임은 직접 커널과 통신하면서 실제로 격리된 공간을 만드는 역할을 수행한다.

도커는 runc라는 컨테이너 런타임을 사용하고 이 컨테이너 런타임은 OCI라는 곳에서 규정한 컨테이너 런타임 인터페이스, CRI 표준을 구현했기 때문에 무조건 runc를 사용해야 하는 것은 아니다.

하지만 runc는 도커가 지원하는 기본 컨테이너 런타임이다.

이 컨테이너 플랫폼에는 'Podman', 'Containerd`와 같은 다른 소프트웨어들도 존재한다.

컨테이너 가상화를 사용할 때 어떤 컨테이너 플랫폼을 사용할지

또는

어떤 컨테이너 런타임을 사용할지는 자유롭게 선택이 가능하다.


‣ 도커의 동작 원리

image
도커는 클라이언트 서버 모델로 실행된다.

도커에도 사용자의 명령을 전달해주는 클라이언트와 실제로 컨테이너를 관리해주는 도커 데몬(Docker Daemon)이라는 서버가 존재한다.

클라이언트는 사용자의 명령을 도커 데몬에게 전달한다.

도커 데몬은 컨테이너를 관리하는 기능을 제공해주고 도커 D라고도 부른다.

보통 데몬이라고 이름이 붙은 소프트웨어는 서버에서 지속적으로 실행이 되는 소프트웨어를 의미하며,

이 도커 데몬 또한 호스트 OS에서 지속적으로 실행되면서 클라이언트의 요청에 따라서 컨테이너를 관리한다.

그리고 이 도커 데몬은 클라이언트가 이런 기능을 사용할 수 있도록 정규화된 API를 제공하고 있다.
👉 https://docs.docker.com/engine/api/v1.44/#section/Versioning


위 도커 API 공식 문서로 들어와보자.
image

이 링크에서 제공해주는 정보는 Docker 엔진이 제공하는 API에 대한 공식 문서이다.

도커 엔진한테 어떤 요청을 보낼 때는 이 API 양식에 맞게 보내야 한다.

먼저 컨테이너의 목록을 조회하는 API를 살펴보자.
image
이 리스트 컨테이너 API 양식에 맞춰 요청을 보내면 컨테이너의 리스트를 얻을 수 있을 것이다.

보기만 해도 이 양식에 맞춰서 요청을 보내거나 요청에 대한 응답 또한 사용자가 읽기 어려운 형태로 들어오니

사용자가 API를 직접 사용하기에는 조금 번거롭기는 하다.


image
그래서 도커에는 Command Line 도구인 Docker CLI가 클라이언트 툴로 제공된다.

이 CLI는 클라이언트가 명령어를 입력하면 이 명령어를 서버의 API 양식에 맞게 만들어 대신 전달해준다.

즉, 사용자는 Docker CLI를 통해 도커 데몬의 API와 직접적으로 통신을 할 수 있게 되는 것이다.


image
예를 들어서, CLI에서 컨테이너 목록을 조회하기 위해 아래 명령어를 입력한다고 해보자.

$ docker ps

사용자는 위 명령어 딱 한 줄만 입력해주면 된다.

그러면 Docker CLI는 API 양식에 맞게 만들어서 Docker 데몬에게 전달한다.
image


그리고 도커 데몬은 들어온 요청(docker ps)를 분석해서 커널을 통해 컨테이너 리스트를 불러온 다음에 JSON 형태로 응답을 만들어 클라이언트에게 전송한다.
image


CLI는 이 전달받은 응답을 사용자가 보기 편한 테이블 형태로 만들어 화면에 출력해준다.
image


‣ 정리

image
도커는 클라이언트 서버 모델로 실행이 되고

클라이언트는 CLI, 서버는 도커 데몬으로 구성된다.

사용자는 CLI를 통해서 간단한 명령어를 사용하여 컨테이너를 관리할 수 있게 된다.

사용자가 실행한 명령어를 CLI는 API 양식에 맞게 요청을 만들어 Docker Daemon으로 전달하고

Docker Daemon은 컨테이너 런타임을 통해 컨테이너를 조작하여 응답 결과를 CLI로 다시 전달하게 된다.


Loading script...