도커 내부 아키텍처 이해

도커는 OCI(Open Container Initiative) 표준을 기반으로 구축되었습니다. 도커 엔진은 containerd, runc, OCI 이미지 스펙, OCI 런타임 스펙 등 핵심 컴포넌트로 구성되어 있습니다.

  • containerd: 컨테이너 라이프사이클 관리 (Create, Start, Stop 등)
  • runc: OCI 규격의 컨테이너 런타임
  • OCI 이미지 스펙: 이미지 포맷과 레이어 정의
  • OCI 런타임 스펙: 실행 환경 기준 정의

Union File System과 Copy-on-Write

도커 이미지는 레이어 방식의 Union FS(File System)로 구성됩니다. 각 명령 단계마다 새 레이어가 추가되는데, Copy-on-Write 방식으로 기존 레이어를 복사하지 않고 새 레이어에 변경 사항만 기록하여 공간 효율성을 높입니다.

예를 들어 다음 Dockerfile에서

FROM python:3.9-slim

WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["python", "app.py"]

베이스 이미지 + pip install 레이어 + 소스 코드 레이어 등 여러 레이어로 구성되며, 새 레이어는 이전 레이어의 변경 사항만 기록합니다.

도커 이미지 최적화 기법

1) 다중 단계 빌드 (Multi-stage Build)

# 1단계: 빌드 환경
FROM python:3.9-slim AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
RUN pip install --editable .

# 2단계: 프로덕션 환경 (1단계 산출물 복사)
FROM python:3.9-slim
WORKDIR /app
COPY --from=builder /app /app
CMD ["python", "app.py"]

1단계에서 소스 코드를 빌드하고, 2단계에서 실행 파일만 복사하여 이미지 크기를 최적화할 수 있습니다.

2) .dockerignore

__pycache__
*.pyc
*.pyo
.git
venv

.dockerignore 파일로 불필요한 파일/디렉터리를 제외시켜 전송할 컨텍스트 크기를 줄일 수 있습니다.

3) Docker 레이어 캐싱 활용

도커는 기존 레이어가 동일하면 캐싱하여 재사용합니다. 따라서 자주 변경되지 않는 명령은 맨 앞에 배치하는 것이 좋습니다.

FROM python:3.9-slim

WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt  # 캐싱 가능

COPY . .  
RUN pip install --editable .  # 코드 변경시에만 재실행

4) 도커 이미지 평가 및 최적화

$ docker image ls
REPOSITORY   TAG         IMAGE ID       CREATED          SIZE
myapp        latest      34af9b30cb8b   37 minutes ago   265MB
<missing>    <none>      9905cd9684a9   39 minutes ago   264MB
<missing>    <none>      d20aa0976b6b   39 minutes ago   223MB
...

도커 이미지는 중간 단계의 레이어도 이미지로 기록됩니다. docker image prune 등의 명령으로 레이어 정리가 필요합니다. 또한 dive 등의 툴로 이미지 구조를 평가하고 최적화할 수 있습니다.

이렇게 도커의 내부 구조와 아키텍처, 최적화 기법 등 전문적인 내용을 다루었습니다. 파이썬 예제를 포함하여 작성했으니 도움이 되었으면 합니다.

댓글남기기