본문 바로가기
AI Journey/클라우드

[Docker] 도커의 아키텍처와 동작 원리, 기술 동향 정리

by 보눔비스타 2025. 12. 26.

현대 소프트웨어 개발과 배포의 표준이 된 도커(Docker)는 애플리케이션을 컨테이너라는 표준화된 유닛으로 패키징하여 환경에 구애받지 않고 실행할 수 있게 해주는 플랫폼이다. 도커의 기본 구성 요소와 동작 방식, 그리고 컨테이너 오케스트레이션 도구인 쿠버네티스(Kubernetes)와의 관계를 알아보자.

1. 도커의 기본 아키텍처 (Docker Architecture)

도커는 클라이언트-서버 모델을 기반으로 하며 크게 세 가지 구성 요소로 나뉜다.

  • 도커 클라이언트 (Docker Client): 사용자가 도커와 상호작용하는 기본 창구다. CLI(Command Line Interface)를 통해 docker build, docker pull, docker run 등의 명령어를 입력하면 도커 데몬으로 API 요청을 보낸다.
  • 도커 호스트 (Docker Daemon, dockerd): 도커 엔진의 핵심으로, 백그라운드에서 실행되는 서버 프로세스다. 클라이언트의 요청을 받아 이미지 빌드, 컨테이너 실행, 네트워크 및 볼륨 관리 등 실제 무거운 작업을 수행한다.
  • 도커 레지스트리 (Docker Registry): 도커 이미지를 보관하는 저장소다. 전 세계 사람들이 공유하는 '도커 허브(Docker Hub)'가 대표적이다.

2. 도커의 핵심 객체: 이미지와 컨테이너

도커 이미지 (Docker Image)

도커 이미지는 컨테이너를 생성하기 위한 읽기 전용(Read-only) 템플릿이다. OS, 런타임, 라이브러리, 환경 설정 등 애플리케이션 실행에 필요한 모든 것이 포함되어 있다.

  • 계층 구조: 이미지는 여러 개의 레이어로 구성된다. 보통 Debian이나 Alpine Linux 같은 베이스 이미지(Base Image) 위에 필요한 패키지를 쌓아 올리는 방식이다. (예: Nginx 이미지는 Debian 이미지를 기반으로 생성됨)
  • Dockerfile: 이미지를 만들기 위한 설계도다. Manifest라고도 불리는 이 명세서에 설치 스크립트와 설정을 기록한 뒤 빌드하면 이미지가 생성된다.

도커 컨테이너 (Docker Container)

이미지를 실행한 상태를 말한다. 이미지가 설계도라면 컨테이너는 설계도를 바탕으로 지어진 실물 건물이다.

  • 컨테이너는 격리된 환경에서 프로세스로 실행된다.
  • 휘발성: 컨테이너는 하나의 프로세스이므로 삭제되면 내부 데이터가 모두 사라진다. (데이터 영속성을 위해서는 '볼륨' 기능이 필요하다.)
  • IP 주소: 컨테이너를 정지(stop) 후 재시작(start)할 때, 이전의 IP 주소가 유지되지 않고 새 주소가 할당될 수 있음에 유의해야 한다.

3. 도커 주요 명령어 요약

docker build		Dockerfile을 읽어 새로운 이미지를 생성함
docker pull		레지스트리(예: Docker Hub)에서 이미지를 로컬로 다운로드함
docker run		이미지를 기반으로 컨테이너를 생성하고 실행함
docker ps		현재 실행 중인 컨테이너 목록 확인 (-a 옵션 시 전체 목록)
docker stop		컨테이너를 정상 종료함
docker kill		컨테이너를 강제 종료함
docker rm		컨테이너를 삭제함
docker rmi		이미지를 삭제함

 

4. 도커 이미지 저장소 (Registry vs Repository)

흔히 혼용되지만, 엄밀히 말하면 레지스트리(Registry)는 여러 개의 리포지토리(Repository)를 포함하는 상위 개념이다.

  1. 퍼블릭 레지스트리: 누구나 접근 가능한 공개 저장소. (Docker Hub, Quay.io 등)
  2. 클라우드 레지스트리: CSP(Cloud Service Provider)에서 제공하는 유료/보안 저장소. (AWS ECR, Azure ACR, Google GCR/AR 등)
  3. 프라이빗 레지스트리: 조직 내부 네트워크 내에서 직접 운영하는 저장소. (Harbor, GitLab Registry, 오픈소스 Registry 등)

5. 도커와 쿠버네티스(Kubernetes)의 관계

쿠버네티스는 도커 컨테이너를 효율적으로 관리(오케스트레이션)하는 도구다.

 

컨테이너 실행 흐름 (Kubernetes 환경)

  1. 개발: Dockerfile 작성 후 docker build로 이미지 생성.
  2. 배포 준비: docker push로 이미지를 레지스트리에 등록.
  3. 요청: 사용자가 kubectl 명령어로 매니페스트(YAML) 파일을 통해 오브젝트 생성을 요청.
  4. 실행: 쿠버네티스가 레지스트리에서 이미지를 내려받아 파드(Pod) 단위로 컨테이너를 실행.

IP 관리와 서비스(Service)

쿠버네티스는 Auto Scaling 기능을 통해 파드가 죽으면 새로 생성한다. 이때 파드의 IP는 계속 변하기 때문에, 외부에서 접속할 때는 변하지 않는 고정 IP를 가진 Service 객체를 통해 접속해야 한다.

 

컨테이너 런타임의 변화 (중요 기술 트렌드)

과거에는 쿠버네티스 설치 시 도커가 필수였다. 도커 데몬(dockerd)이 컨테이너 실행 엔진인 containerd와 연동되어 작동했기 때문이다.

  • 탈(脫) 도커 현상: 최근 쿠버네티스는 더 가볍고 빠른 환경을 위해 도커 전체를 설치하는 대신, 컨테이너 실행에 핵심적인 containerdCRI-O와 직접 통신하는 방향으로 진화하고 있다.
  • 결론: 이미지는 여전히 도커 표준(OCI)을 따르지만, 실행 환경에서는 도커 데몬의 비중이 줄어들고 경량화된 런타임이 선호되는 추세다. (예: IBM Cloud 등 주요 클라우드 서비스의 최신 버전들)