HAEJUN RECORDS

Summary

  • Docker는 환경 차이로 배포가 깨지는 문제를 해결하기 위한 도구다.
  • 가상머신(VM)은 OS 전체를 복제해 무겁고, 컨테이너는 커널을 공유해 가볍다.
  • 이미지는 설계도이고 컨테이너는 실행된 실체다.
  • Docker는 Client, Daemon, Image와 Registry 구조로 동작한다.

들어가며

Airflow를 이미 쓰고 있지만 Docker가 정확히 무엇을 하는 도구인지, 컨테이너와 이미지, VM이 어떻게 다른지 모른 채로 쓰고 있다. 이 시리즈는 5편으로 구성된다.

  1. Docker 개념 (이 노트) — 왜 쓰는지, VM과 무엇이 다른지
  2. Docker Desktop과 Engine — 설치한 구성 요소
  3. 이미지와 컨테이너 실습 — 명령어로 직접 다루기
  4. Docker Compose — 여러 컨테이너를 한 번에 관리하기
  5. 실전 예시: Airflow는 이렇게 떠 있다 (docker-in-practice-airflow) — 1~4편 개념을 실제 Airflow 구성에 대입

배경

환경 차이 문제

내 컴퓨터에서는 잘 돌아가던 프로그램이 다른 컴퓨터나 서버에서는 동작하지 않는 경우가 흔하다. 이유는 대개 실행 환경의 차이다.

  • OS 버전이 다르다.
  • 설치된 라이브러리 버전이 다르다.
  • 환경변수와 설정 파일이 다르다.

이 문제를 해결하려면 코드뿐 아니라 실행 환경 자체를 통째로 포장해 옮기는 방법이 필요하다. 그 포장 기술이 Docker다.

가상머신의 한계

환경을 통째로 옮기는 아이디어는 Docker 이전에도 가상머신(VM)으로 구현했다. VM은 호스트 컴퓨터의 하이퍼바이저(Hypervisor) 위에 Guest OS를 포함한 독립된 컴퓨터를 여러 대 띄우는 방식이다.

문제는 이 방식이 OS 전체를 매번 복제한다는 점이다.

  • VM 디스크 이미지 용량이 GB 단위로 크다.
  • Guest OS를 부팅해야 하므로 실행이 느리다.
  • 각 Guest OS가 호스트 자원(CPU, 메모리)을 나눠 쓰므로 낭비가 크다.

Docker

컨테이너

컨테이너(Container)는 OS 전체를 복제하지 않고 호스트 커널을 공유하면서 프로세스를 서로 보이지 않게 격리한다. VM이 컴퓨터를 통째로 복제한다면 컨테이너는 프로세스만 격리하는 방식이다.

VM과 컨테이너의 구조 비교

VM은 Guest OS마다 커널을 새로 띄우지만, 컨테이너는 Host OS의 커널 하나를 여러 컨테이너가 공유한다. 따라서 컨테이너는 다음과 같은 특성을 가진다.

  • 앱과 라이브러리만 담으므로 이미지 용량이 MB 단위로 작다.
  • 부팅이 필요 없어 초 단위로 빠르게 실행한다.
  • 호스트 자원을 필요한 만큼만 프로세스 단위로 사용한다.

컨테이너가 가벼운 이유

VM은 컴퓨터를 통째로 복제하고, 컨테이너는 프로세스만 격리한다. 복제 단위가 다르기 때문에 무게도 다르다.

이미지

이미지와 컨테이너 차이점

Docker에서 이미지(Image)는 앱을 실행하는 데 필요한 코드, 라이브러리, 설정을 담은 설계도다. 컨테이너(Container)는 이미지를 실제로 실행한 상태이며 실행 중인 프로세스다.

비유이미지컨테이너
붕어빵붕어빵 틀(설계도)구워져 나온 붕어빵(실체)
프로그래밍클래스인스턴스
VM과 비교VM의 ISO 파일실행 중인 가상머신

하나의 이미지로 컨테이너를 여러 개 만들 수 있다. 붕어빵 틀 하나로 붕어빵을 여러 개 굽는 것과 같다.

이미지 레이어

이미지는 하나의 통짜 파일이 아니라 여러 겹의 레이어(layer)가 쌓여 만들어진다. Dockerfile을 작성해 이미지를 빌드하면, 그 안의 명령어 한 줄이 레이어 하나를 만든다고 생각할 수 있다.

같은 베이스(예: python:3.11-slim)로 만든 이미지는 베이스 레이어를 공유한다. 이미지를 여러 개 받아도 겹치는 레이어는 디스크에 한 번만 저장된다. 3편에서 Dockerfile을 작성할 때 순서가 중요한 이유도 이 레이어 구조에 있다.

Docker 아키텍처

Docker는 Client, Daemon, Image와 Registry가 서로 통신하는 구조로 동작한다.

Docker Client, Daemon, Registry 아키텍처

  • Client: 사용자가 터미널에 입력하는 docker run, docker build 같은 명령어다.
  • Daemon: Client의 명령을 받아 이미지를 빌드하거나 컨테이너를 띄우는 백그라운드 프로세스다.
  • Registry: 이미지를 저장하고 공유하는 원격 저장소다. 대표적으로 Docker Hub가 있다.

Airflow에서의 적용

지금 실행 중인 Airflow 컨테이너도 이미지를 기반으로 실행되는 프로세스다. 다음 명령으로 확인할 수 있다.

실행 중인 Airflow 컨테이너 확인

docker ps
# CONTAINER ID   IMAGE                  STATUS         NAMES
# a1b2c3d4e5f6   apache/airflow:2.9.0   Up 2 hours     airflow-webserver-1

IMAGE 컬럼의 apache/airflow:2.9.0은 설계도인 이미지다. NAMES 컬럼의 airflow-webserver-1은 그 설계도로 만든 실행 중인 컨테이너다.


마치며

VM과 컨테이너의 차이, 이미지와 컨테이너의 관계, Docker의 기본 아키텍처를 살펴봤다. 다음 편에서는 Docker Desktop을 설치했을 때 이것이 Docker 본체인지라는 흔한 오해를 정리한다.


Reference