728x90
728x90
우리가 docker run 명령어를 통해 컨테이너를 실행할 때는 다음과 같은 과정을 거쳐 컨테이너가 실행되게 됩니다.
Docker CLI -> Docker Engine -> containerd -> runc -> 호스트 OS 커널
각 단계를 하나하나 자세히 알아보겠습니다.
Docker CLI 와 Docker Engine
- 도커 CLI (Docker Command Line interface)
- 터미널에 입력하는 docker run, docker pull 등의 명령어는 Docker API를 호출하는 클라이언트
- 웹으로 비유하자면 브라우저 역할
- 도커 API
- 도커 엔진이 제공하는 REST 기반 API
- 기본적으로 로컬에서만 호출하도록 설정되어 있지만, 엔진 설정을 바꾸면 네트워크로도 접근 가능
- Docker CLI가 보낸 요청을 받아서 도커 엔진에 전달하고, 응답을 주고받는 중간 지점
- 도커 엔진에 요청을 보내는 유일한 공식 경로
- 도커 엔진에게 요청을 보내기 위해서는 도커 API를 거쳐야 함
- 웹으로 비유하자면 웹 서버 엔드포인트
- 도커 엔진
- 백그라운드에서 동작하면서 컨테이너와 이미지를 관리하고 요청받은 작업을 수행
- 이미지 다운로드 및 캐싱
새로운 이미지를 받을 때, 도커 엔진은 로컬에 저장된 이미지가 있는지(캐시)를 먼저 체크하고, 이미 내려받은 이미지가 있다면 그걸 재사용하고, 없으면 원격 레지스트리(기본적으로 Docker Hub)에서 이미지를 가져옴. - 컨테이너 관리
컨테이너 생성·실행·중지·삭제, 가상 네트워크 설정 등을 담당 - 항시 동작
리눅스라면 데몬(daemon), 윈도라면 윈도 서비스(Windows Service) 형태로 늘 켜져 있음
- 이미지 다운로드 및 캐싱
- 직접 컨테이너를 실행하지 않음.
- 하위 계층(containerd)를 통해서 관리
- 웹으로 비유하자면 웹 서버 내부의 핵심 로직
- 백그라운드에서 동작하면서 컨테이너와 이미지를 관리하고 요청받은 작업을 수행
containerd와 runc
- containerd
- CNCF(Cloud Native Computing Foundation)에서 관리하는 오픈소스 프로젝트
- 컨테이너의 라이프사이클(생성, 실행, 중단, 삭제 등)을 실제로 다루며, 매우 가볍고 안정적으로 동작하도록 만들어짐.
- runc
- containerd가 호출하는 실행 도구(런타임)입니다.
- OCI(Open Container Initiative) 표준 런타임으로, 리눅스 커널의 네임스페이스(namespaces), cgroups(CPU/메모리 제한) 같은 기능을 이용해 프로세스를 격리합니다.
- 호스트 OS에 필요한 namespace, cgorups 등을 설정
* OCI는 컨테이너를 실행하기 위한 '런타임'이 누구나 같은 방식으로 동작하도록 만들기 위해 마련한 공개 표준
* 즉, 도커 컨테이너에서 사용하는 runc도 표준을 지켰기에 다른 여러 컨테이너 플랫폼들과도 호환이 됨 (이미지나 런타임에 대한 호환성이 보장)
도커 엔진이 ‘컨테이너 생성’이라는 요청을 받으면 → containerd에 일을 맡기고 → runc가 리눅스 커널 자원을 적절히 나눠서 격리된 프로세스를 실행하게 되고 이 격리된 프로세스가 컨테이너가 되는 것 입니다.
728x90
300x250
'Docker' 카테고리의 다른 글
[Docker] 호스트 환경 변수 vs 컨테이너 환경 변수 (0) | 2025.03.23 |
---|---|
Docker에서 MongoDB 데이터 로컬 JSON 파일로 가져오기 (0) | 2025.02.21 |