Published on

도커 이미지 사이즈 90% 줄이는 멀티스테이지 빌드 기술

Authors

도커(Docker)는 현대 소프트웨어 개발에서 필수적인 도구가 되었습니다. 그러나 도커 이미지를 사용하면서 이미지 사이즈가 커지는 문제는 많은 개발자들에게 고민거리가 됩니다. 큰 이미지 파일은 배포 속도를 느리게 하고, 클라우드 스토리지 비용을 증가시키며, 네트워크 대역폭을 낭비하는 원인이 됩니다. 이러한 문제를 해결하기 위해 멀티스테이지 빌드를 활용한 이미지 최적화 기법을 소개합니다.

멀티스테이지 빌드란?

멀티스테이지 빌드는 도커파일에서 여러 개의 FROM 명령을 사용하여 여러 단계에서 이미지를 빌드하는 방법입니다. 각 단계는 독립적으로 작동하며, 필요하지 않은 파일과 종속성을 제거하여 최종 이미지의 크기를 줄일 수 있습니다.

멀티스테이지 빌드의 장점

  1. 최종 이미지 크기 감소: 필요하지 않은 파일과 종속성을 제거하여 이미지 크기를 최소화할 수 있습니다.

  2. 빌드 시간 단축: 각 단계에서 필요한 작업만 수행하므로 빌드 시간이 단축됩니다.

  3. 코드 모듈화: 각 단계가 독립적으로 구성되어, 복잡한 빌드를 단순화할 수 있습니다.

멀티스테이지 빌드 활용 예시

아래는 Node.js 애플리케이션을 도커로 배포하는 과정에서 멀티스테이지 빌드를 활용하는 예시입니다.

# 1단계: 빌드 스테이지
FROM node:14 AS build
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

# 2단계: 프로덕션 스테이지
FROM nginx:alpine
COPY --from=build /app/dist /usr/share/nginx/html

EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

위의 도커파일은 두 단계로 나누어져 있습니다. 첫 번째 단계에서는 Node.js 애플리케이션을 빌드하고, 두 번째 단계에서는 빌드 결과물만을 Nginx 이미지로 복사하여 최종 이미지를 생성합니다. 이 과정에서 Node.js 관련 파일과 종속성은 최종 이미지에 포함되지 않으므로 이미지 크기가 줄어들게 됩니다.

최적화를 위한 추가 팁

  1. 불필요한 파일 제거: .dockerignore 파일을 사용하여 빌드 과정에서 필요하지 않은 파일을 제외할 수 있습니다. 예를 들어, 테스트 파일이나 문서 등을 제외할 수 있습니다.

    node_modules
    *.log
    tests/
    
    # ... 기타 필요 없는 파일 및 디렉토리
    
  2. 중복 제거: 여러 단계에서 공통적으로 사용되는 파일이나 라이브러리는 별도의 단계에서 먼저 설치하고, 필요한 경우에만 복사하도록 설정합니다.

  3. 최신 베이스 이미지 사용: 가능한 한 최신의 경량화된 베이스 이미지를 사용하는 것이 좋습니다. 예를 들어, alpine 버전을 고려해볼 수 있습니다.

트러블슈팅

멀티스테이지 빌드를 사용하면서 발생할 수 있는 일반적인 문제와 해결 방법은 다음과 같습니다.

  • 빌드 실패: 종종 의존성 문제로 인해 빌드가 실패할 수 있습니다. 이 경우 RUN 명령어를 통해 설치한 패키지의 버전을 명시적으로 지정해 보세요.

  • 파일 누락: 최종 이미지에서 필요로 하는 파일이 누락되는 경우, 각 단계에서 복사하는 경로를 다시 확인해야 합니다. COPY --from=build 구문에서 경로를 올바르게 지정하는 것이 중요합니다.

  • 환경 변수 설정: 각 단계마다 필요한 환경 변수를 설정해야 합니다. 특히 빌드 단계와 프로덕션 단계에서 각각 다른 환경 변수가 필요할 수 있습니다.

결론

도커 컨테이너의 용량 최적화는 소프트웨어 배포 효율성을 높이는 데 필수적입니다. 멀티스테이지 빌드를 활용하면 이미지 크기를 대폭 줄일 수 있으며, 이는 클라우드 컴퓨팅 비용 절감에 기여할 수 있습니다. 최적화된 이미지를 통해 보다 빠르고 안정적인 배포 환경을 구축하시기 바랍니다. 추가적으로 클라우드 컴퓨팅 비용 절감 7가지 비법 - 똑똑하게 클라우드 쓰기에서 더 많은 정보를 확인해 보세요.