컨테이너 아키텍처 및 런타임 설명

발행: (2025년 12월 8일 오전 11:54 GMT+9)
6 min read
원문: Dev.to

Source: Dev.to

핵심 개념: OS‑레벨 가상화

전체 하드웨어 스택을 가상화하고 전체 게스트 OS가 필요한 가상 머신(VM)과 달리, Docker는 OS‑레벨 가상화를 사용합니다. 즉, 컨테이너는 호스트 OS 커널 위에서 직접 실행되어 빠르고 가볍게 동작합니다.

격리를 위해 사용되는 핵심 OS 기술

컨테이너는 Linux 커널에 내장된 두 가지 기본 기능(Windows/macOS에서도 유사하게 구현/가상화)을 활용해 격리를 구현합니다.

네임스페이스(Namespace)

컨테이너가 보는 운영 체제 환경을 격리합니다. 각 컨테이너는 다음과 같은 자원의 독립된 슬라이스를 가집니다.

  • PID Namespace – 컨테이너는 자신의 프로세스만 볼 수 있습니다.
  • Net Namespace – 컨테이너는 자체 네트워크 인터페이스, 포트, 라우팅 테이블을 가집니다.
  • Mount Namespace – 컨테이너는 이미지 레이어를 기반으로 한 자체 루트 파일시스템을 가집니다.

컨트롤 그룹(cgroups)

컨테이너가 사용할 수 있는 자원의 양을 제한합니다. 리소스 컨트롤러 역할을 하여 다음을 제한할 수 있습니다.

  • CPU – 프로세서 사용 시간 비율을 제한합니다.
  • Memory – RAM 사용량에 하드 제한을 설정합니다.
  • Block I/O – 디스크 입출력을 제어합니다.

요약: 네임스페이스는 컨테이너가 보는 것을 격리하고, cgroups는 컨테이너가 사용하는 것을 제한합니다.


엔진: Docker Daemon vs. Container Runtime

docker run 같은 명령을 실행하면 여러 소프트웨어가 함께 작동합니다.

A. Docker Daemon (dockerd)

Docker Daemon은 백그라운드에서 실행되는 서버 구성 요소입니다. 무거운 작업을 담당하며, 주요 역할은 다음과 같습니다.

  • 이미지 빌드.
  • 레지스트리(예: Docker Hub)에서 이미지 풀·푸시.
  • 스토리지(볼륨)와 네트워킹 관리.
  • CLI에서 받은 명령을 적절한 런타임에 전달.

B. Container Runtime

Container Runtime은 컨테이너 프로세스를 실행·관리하는 저수준 구성 요소입니다. 커널의 네임스페이스와 cgroups와 직접 상호작용합니다.

고수준 런타임(예: containerd)

컨테이너 전체 수명 주기를 관리합니다: 이미지 전송, 루트 파일시스템 마운트, 네트워킹 설정, 로깅 등. Docker Daemon은 containerd를 사용해 컨테이너를 관리합니다.

저수준 런타임(예: runc)

실제로 컨테이너 프로세스를 생성하고 실행하는 실행 파일입니다. 커널 기능(네임스페이스와 cgroups)과 직접 인터페이스해 격리를 구현합니다. runc는 OCI Runtime Specification의 레퍼런스 구현입니다.

명령 흐름

  1. docker run …을 입력합니다.
  2. Docker CLI가 명령을 Docker Daemon(dockerd)에 보냅니다.
  3. Docker Daemon이 이미지를 준비하고 요청을 고수준 런타임(containerd)에 전달합니다.
  4. containerd가 컨테이너 구성을 추출해 저수준 런타임(runc)에 넘깁니다.
  5. runc가 네임스페이스와 cgroups를 사용해 호스트 OS 커널 위에 격리된 컨테이너 프로세스를 생성·실행합니다.

OCI: Open Container Initiative

OCI는 컨테이너 기술의 핵심 구성 요소에 대한 표준 사양을 제공합니다.

  • Image Specification – 컨테이너 이미지가 어떤 구조와 레이어, 매니페스트를 가져야 하는지 정의합니다.
  • Runtime Specificationrunc와 같은 컨테이너 런타임이 어떻게 구성·실행되어야 하는지 정의합니다.

이 표준 덕분에 한 도구(Docker)로 만든 이미지를 다른 호환 도구(Podman 또는 Kubernetes의 Kubelet)에서도 실행할 수 있어 이식성이 높아지고 공급업체 종속을 방지합니다.


다음 주제는?

이러한 저수준 개념을 이해하는 것이 중요합니다. 이제 컨테이너가 어떻게 동작하고 어떤 소프트웨어가 이를 구동하는지 알게 되었습니다. 다음 포스트에서는 Docker에서 사용되는 파일시스템을 살펴보겠습니다.

감사합니다.

Back to Blog

관련 글

더 보기 »

마인드의 눈 패브릭

Phase 1 — C++ Sovereign Kernel Skeleton Daemon 첫 번째 목표 – 실행 중인 C++ 데몬을 배포하여 다음을 수행할 수 있게 함: - 이벤트 수신 - capability graph의 엔드포인트와 엣지 유지

개발자를 위한 AWS: 가이드

왜 AWS가 클라우드를 여전히 장악하는가? Azure와 GCP 같은 큰 경쟁자들이 빠르게 성장하고 있음에도 불구하고, AWS가 우위를 점하는 이유는 다음과 같다: - 가장 완전한 생태계인 Compute, Storage, Database...