본문 바로가기
개발 언어/Docker, VM

Docker 이미지 최적화 가이드: 95% 이상 크기 줄이기 (단계별)

by 주호파파 2025. 5. 11.
728x90
반응형

 

 
Docker 이미지는 컨테이너 기반 애플리케이션을 배포하는 데 필수적인 요소입니다. 하지만 최적화되지 않은 Docker 이미지는 크기가 커서 빌드 시간과 배포 속도를 늦추고 저장 공간을 낭비하며 보안 취약점을 증가시킬 수 있습니다. 이 글에서는 Docker 이미지 크기를 95% 이상 줄이는 단계별 방법을 소개하며, 이미지 최적화의 중요성과 실질적인 이점을 자세히 설명합니다.
 

 

왜 Docker 이미지 최적화가 중요할까요?
 
  • 배포 속도 향상: 작은 이미지는 더 빠르게 다운로드되고 배포되므로, 서비스 출시 시간을 단축하고 업데이트 과정을 효율적으로 관리할 수 있습니다.
  • 자원 효율성 증대: 작은 이미지는 저장 공간을 절약하고 CPU, 메모리 등 서버 자원 사용량을 줄여 운영 비용을 절감합니다.
  • 보안 강화: 불필요한 라이브러리 및 도구를 제거하여 공격 표면을 줄이고 보안 취약점을 최소화합니다.
  • CI/CD 파이프라인 효율성 증대: 빌드 시간 단축, 테스트 속도 향상으로 CI/CD 파이프라인 전체 효율성을 높입니다.
  • 네트워크 대역폭 절약: 이미지 pull 및 push 시 트래픽 감소로 네트워크 비용을 절감합니다.
단계별 Docker 이미지 최적화 가이드

 

다음은 Docker 이미지 크기를 줄이는 데 효과적인 몇 가지 방법입니다. 각 단계를 자세히 살펴보고, 여러분의 애플리케이션에 맞는 최적화 전략을 선택하십시오.
 
1. 멀티 스테이지 빌드 (Multi-Stage Builds) 활용
멀티 스테이지 빌드는 Dockerfile 내에서 여러 개의 FROM 명령어를 사용하여 각 스테이지마다 다른 이미지를 기반으로 빌드하는 방식입니다. 필요한 빌드 도구와 라이브러리는 빌드 스테이지에서만 사용하고, 최종 이미지에는 실행에 필요한 최소한의 파일만 포함하도록 하여 이미지 크기를 대폭 줄일 수 있습니다.

 

# 빌드 스테이지: Node.js 환경에서 애플리케이션 빌드
FROM node:16 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

# 런타임 스테이지: Nginx 웹 서버로 애플리케이션 실행
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
설명:
  • builder 스테이지에서는 Node.js 환경에서 앱을 빌드하고, dist 폴더에 빌드 결과물을 저장합니다.
  • nginx:alpine 스테이지는 Alpine Linux 기반의 작은 Nginx 이미지입니다.
  • COPY --from=builder 명령어를 사용하여 빌드 스테이지의 결과물만 복사하여 최종 이미지에 포함합니다.
2. 베이스 이미지 (Base Image) 선택 신중하게 하기
베이스 이미지는 Docker 이미지의 기반이 되는 이미지입니다. Alpine Linux와 같이 가볍고 최소한의 운영체제를 사용하는 이미지를 선택하면 Docker 이미지 크기를 크게 줄일 수 있습니다.
 
  • Alpine Linux: musl libc 기반으로 구축된 매우 가벼운 Linux 배포판입니다.
  • Distroless: 필요한 런타임 종속성만 포함하고 패키지 관리자, 셸 등을 제거하여 보안을 강화한 이미지입니다.
  • Slim 이미지: 공식 이미지에서 불필요한 부분을 제거하여 크기를 줄인 이미지입니다 (예: python:3.9-slim).
3. 불필요한 파일 제거
Dockerfile에서 불필요한 파일이나 디렉토리를 생성하지 않도록 주의하고, 빌드 과정에서 생성된 임시 파일은 삭제합니다.
FROM ubuntu:latest
RUN apt-get update && apt-get install -y --no-install-recommends some-package
RUN rm -rf /var/lib/apt/lists/* 

# 패키지 목록 삭제
 
설명:
  • rm -rf /var/lib/apt/lists/* 명령어를 사용하여 apt-get update 실행 후 생성된 패키지 목록을 삭제합니다.
4. 레이어 캐싱 (Layer Caching) 활용
 
Docker는 Dockerfile의 각 명령어를 레이어로 저장하고, 변경되지 않은 레이어는 캐싱합니다. Dockerfile을 작성할 때, 자주 변경되는 코드는 뒤쪽에 배치하여 레이어 캐싱 효율을 높입니다.
# 변경 빈도가 낮은 명령어 먼저 배치
COPY package*.json ./
RUN npm install



# 변경 빈도가 높은 소스 코드 복사
COPY ..
5. .dockerignore 파일 활용
 
.dockerignore 파일을 사용하여 Docker 컨텍스트에서 제외할 파일 및 디렉터리를 지정합니다. 빌드에 필요 없는 파일 (e.g., .git, node_modules)을 제외하면 이미지 크기를 줄이고 빌드 속도를 향상시킬 수 있습니다.
.git
node_modules
logs
 
6. 패키지 관리자 옵션 활용
 
패키지 관리자 (e.g., apt-get, yum, apk)를 사용할 때, 불필요한 의존성을 설치하지 않도록 옵션을 활용합니다.
 
  • apt-get: --no-install-recommends 옵션은 권장 패키지 설치를 방지합니다.
  • apk: --no-cache 옵션은 다운로드한 패키지 캐시를 저장하지 않습니다.
7. 이미지 압축 (Image Compression)
 
Docker 이미지를 registry에 push하기 전에 docker save 명령어를 사용하여 tar 파일로 저장하고, gzip 등으로 압축하여 저장 공간을 절약할 수 있습니다. 압축된 이미지는 docker load 명령어로 다시 불러올 수 있습니다.
 
예제: 95% 이상 이미지 크기 줄이기
 
다음은 위에서 설명한 최적화 기법들을 적용하여 Docker 이미지 크기를 95% 이상 줄이는 간단한 예제입니다.
Node.js 기반의 Hello World 애플리케이션을 Docker 이미지로 만드는 과정을 보여줍니다.
 
초기 Dockerfile (최적화 전):
FROM node:16
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
CMD ["npm", "start"]

 

결과: 이미지 크기: ~900MB
 
최적화된 Dockerfile:
# 빌드 스테이지
FROM node:16 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

# 런타임 스테이지
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

 

결과: 이미지 크기: ~50MB (95% 이상 감소)

 

결론
Docker 이미지 최적화는 컨테이너 기반 애플리케이션의 성능, 효율성, 보안을 향상시키는 데 매우 중요합니다.
이 가이드에서 제시된 단계별 방법들을 적용하여 Docker 이미지 크기를 줄이고, 더욱 빠르고 안전하며 효율적인 컨테이너 환경을 구축하십시오.
각 방법의 장단점을 이해하고, 여러분의 애플리케이션 특성에 맞는 최적화 전략을 선택하는 것이 중요합니다. 꾸준한 이미지 최적화를 통해 유지보수 효율성을 높이고, 서비스 품질을 향상시키세요.

 

728x90
반응형