본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.
강의 요약
오늘 강의에서는 컨테이너 기술의 핵심인 Docker와 Docker Compose에 대해 학습했다. 애플리케이션을 컨테이너로 패키징하여 일관된 환경에서 실행할 수 있는 Docker의 기본 개념과, 여러 컨테이너를 효율적으로 관리할 수 있는 Docker Compose의 활용법을 다루었다. 도커 관련된 내용을 추가적으로 알아보자.
Docker의 핵심 구성 요소
도커의 핵심 구성 요소에 대해 알아보자.
Docker Image
Docker 이미지는 컨테이너의 기반이 되는 읽기 전용 템플릿이다. 애플리케이션 코드, 라이브러리, 의존성, 설정 파일 등 실행에 필요한 모든 요소를 포함한다.
이미지는 레이어 구조로 구성된다. Dockerfile의 각 명령어가 하나의 레이어를 생성하며, 이 레이어들이 쌓여 완전한 이미지를 형성한다. 이러한 레이어 기반 구조는 다음과 같은 장점을 제공한다.
레이어 재사용을 통한 효율성
- 동일한 베이스 이미지를 사용하는 여러 애플리케이션은 공통 레이어를 공유한다
- 이미지 빌드 시 변경된 레이어만 재생성되어 빌드 속도가 향상된다
- 저장 공간을 절약할 수 있다
이미지 배포와 버전 관리
- Docker Hub나 프라이빗 레지스트리를 통해 이미지를 공유할 수 있다
- 태그를 통해 버전을 관리하며, 롤백이 용이하다
- 환경 간 일관성을 보장하여 "내 컴퓨터에서는 되는데" 문제를 해결한다
하지만 이미지 크기가 커질수록 배포 시간이 증가하므로, 불필요한 파일을 제거하고 multi-stage build를 활용하여 최종 이미지 크기를 최적화해야 한다.
Docker Container
컨테이너는 이미지의 실행 가능한 인스턴스다. 이미지의 읽기 전용 레이어 위에 쓰기 가능한 레이어를 추가하여 생성된다.
격리성과 독립성
- 각 컨테이너는 독립된 파일시스템, 네트워크 스택, 프로세스 공간을 갖는다
- 한 컨테이너의 변경사항이 다른 컨테이너나 호스트 시스템에 영향을 주지 않는다
- 동일한 호스트에서 충돌 없이 여러 애플리케이션을 실행할 수 있다
리소스 효율성
- VM과 달리 호스트 커널을 공유하여 오버헤드가 적다
- 가볍고 빠른 시작 시간을 제공한다
- 단일 호스트에서 다수의 컨테이너를 실행하여 리소스 활용도를 극대화할 수 있다
컨테이너는 ephemeral한 특성을 가지므로, 영구적으로 보존해야 할 데이터는 Volume을 통해 관리해야 한다. 컨테이너 내부의 데이터는 컨테이너 삭제 시 함께 사라진다.
Dockerfile
Dockerfile은 이미지 빌드 과정을 자동화하는 스크립트다. 선언적 문법으로 이미지 생성 단계를 정의한다.
주요 명령어
- FROM: 베이스 이미지 지정
- WORKDIR: 작업 디렉토리 설정
- COPY: 파일을 호스트에서 이미지로 복사
- RUN: 이미지 빌드 중 명령어 실행
- EXPOSE: 컨테이너가 리스닝할 포트 선언
- CMD: 컨테이너 시작 시 실행할 기본 명령어
Multi-stage Build
프로덕션 환경에서는 빌드 도구가 필요 없다. Multi-stage build를 사용하면 빌드 단계와 실행 단계를 분리하여 최종 이미지 크기를 크게 줄일 수 있다.
# Build Stage
FROM python:3.9-slim AS build
WORKDIR /app
COPY requirements.txt .
COPY . .
# Final Stage
FROM python:3.9-slim
WORKDIR /app
COPY --from=build /app /app
RUN pip install --no-cache-dir -r requirements.txt
EXPOSE 5000
CMD ["gunicorn", "--bind", "0.0.0.0:5000", "app:app"]
- 빌드 스테이지에서 생성된 산출물만 최종 이미지로 복사하여, 빌드 의존성을 제외하고 런타임에 필요한 구성 요소만 포함시킨다.
레이어 캐싱 최적화
- 자주 변경되지 않는 명령어를 Dockerfile 상단에 배치한다
- 의존성 설치와 애플리케이션 코드 복사를 분리하여 변경 시 재빌드 범위를 최소화한다
- .dockerignore 파일로 불필요한 파일이 빌드 컨텍스트에 포함되지 않도록 한다
Docker Compose
Docker Compose는 여러 컨테이너로 구성된 애플리케이션을 정의하고 실행하는 도구다. YAML 파일로 서비스를 구성하고, 단일 명령어로 전체 애플리케이션 스택을 관리할 수 있다.
멀티 컨테이너 관리의 필요성
현대적인 애플리케이션은 웹 서버, 데이터베이스, 캐시, 메시지 큐 등 여러 서비스로 구성된다. 각 서비스를 개별적으로 실행하고 연결하는 것은 복잡하고 오류가 발생하기 쉽다.
Docker Compose의 장점
- 서비스 간 의존성과 네트워크를 선언적으로 정의한다
- 개발 환경과 프로덕션 환경 구성을 코드로 관리한다
- docker-compose up 한 번으로 모든 서비스를 시작할 수 있다
- 서비스별로 스케일링이 가능하다
적용 시 고려사항
Docker Compose는 단일 호스트 환경에 적합하다. 프로덕션 환경에서 여러 호스트에 걸친 오케스트레이션이 필요하다면 Kubernetes나 Docker Swarm 같은 도구를 고려해야 한다. 개발 환경에서는 Compose가 간단하고 효과적이지만, 규모가 커지면 더 강력한 오케스트레이션 솔루션이 필요하다.
참고 출처



