도커(Docker)의 이해
도커 내부 아키텍처 이해
도커는 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 등의 툴로 이미지 구조를 평가하고 최적화할 수 있습니다.
이렇게 도커의 내부 구조와 아키텍처, 최적화 기법 등 전문적인 내용을 다루었습니다. 파이썬 예제를 포함하여 작성했으니 도움이 되었으면 합니다.
댓글남기기