6.1 이미지 최적화 소개
Docker 이미지는 컴팩트하긴 하지만, 그래도 공간을 차지해. 그래서 이미지를 줄이는 게 중요한 작업이고, 이건 성능을 향상시키고, 컨테이너의 다운로드와 배포를 빠르게 해주며, 저장 비용도 줄이는데 도움이 돼. Dockerfile을 개선하면 이미지를 최적화할 수 있어. Dockerfile은 여러 가지로 구성할 수 있거든. 이번 강의에서는 최적화되고 가벼운 Docker 이미지를 만들기 위한 몇 가지 전략과 모범 사례를 살펴볼 거야.
왜 Docker 이미지 크기를 줄이는 게 중요할까?
- 배포 속도: 더 작은 이미지는 Docker registry에서 더 빠르게 다운로드되고 컨테이너로 배포돼. 이건 자동화된 CI/CD 시스템에서는 특히 중요하지.
- 리소스 효율적 사용: 가벼운 이미지는 디스크 공간을 덜 차지하고, 전송 시 네트워크 리소스를 절약하며 컴퓨팅 성능을 더 효율적으로 사용할 수 있게 해줘.
- 보안: 더 작은 이미지는 일반적으로 불필요한 구성 요소를 덜 포함하고 있어서, 잠재적인 취약점의 위험을 줄여줘.
- 업데이트 단순화: 가벼운 이미지를 업데이트하는 게 더 빠르고 리소스를 덜 요구하기 때문에 유지 보수 과정이 더 빨라져.
6.2 Docker 이미지 크기 줄이는 전략
1. 최소한의 베이스 이미지 사용
베이스 이미지 선택은 최종 Docker 이미지 크기에 직접적인 영향을 줘. alpine
같은 최소한의 베이스 이미지를 사용하면 이미지 크기를 크게 줄일 수 있어.
예시:
ubuntu
이미지를 alpine
으로 교체하기:
# FROM ubuntu:20.04
FROM alpine:3.12
alpine
은 5MB 정도만 차지하는 가벼운 Linux 배포판인데, 반대로 ubuntu
이미지는 수백 MB를 차지할 수 있어.
2. 레이어 수 줄이기
Dockerfile의 각 명령어는 이미지에 새로운 레이어를 추가해. 여러 명령어를 하나의 RUN
명령어로 합치면 레이어 수를 줄일 수 있고, 전체 이미지 크기를 감소시킬 수 있어.
예시:
최적화 전:
RUN apt-get update
RUN apt-get install -y curl
RUN apt-get install -y git
RUN rm -rf /var/lib/apt/lists/*
최적화 후:
RUN apt-get update && apt-get install -y curl git && rm -rf /var/lib/apt/lists/*
패키지 매니저 캐시 삭제 (rm -rf /var/lib/apt/lists/*)
는 설치 중 생성된 임시 파일을 삭제해 이미지 크기를 더 줄여줘.
3. 임시 파일 삭제
패키지 설치 후에 임시 파일과 불필요한 데이터를 삭제하면 이미지를 깨끗하고 가볍게 유지할 수 있어.
예시:
RUN apt-get update && apt-get install -y curl git && \
apt-get clean && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
4. .dockerignore
사용
.dockerignore
파일은 빌드 컨텍스트에서 불필요한 파일과 디렉터리를 제외해줘. 이걸 사용하면 이미지 크기를 줄이고 빌드 프로세스를 더 빠르게 만들 수 있어.
.dockerignore
예시:
node_modules
dist
*.log
Dockerfile*
.dockerignore
5. 다단계 빌드 (multi-stage builds)
사용
다단계 빌드를 사용하면, 여러 중간 이미지를 사용해서 필요한 파일과 의존성만 포함한 최종 경량 이미지를 만들 수 있어.
예시:
# 빌드 단계
FROM node:14 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# 최종 단계
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
이 예시에서 첫 번째 단계는 앱을 빌드하고, 최종 단계는 빌드 결과만을 사용해. 이 방식으로 최종 이미지 크기를 줄일 수 있어.
6. 패키지 설치 최적화
필요한 패키지만 설치하고, 패키지 매니저의 최소 설치 옵션을 사용하면 이미지 크기를 줄일 수 있어.
예시:
apt-get
에서 --no-install-recommends
옵션 사용:
RUN apt-get update && apt-get install -y --no-install-recommends curl git && \
rm -rf /var/lib/apt/lists/*
7. 데이터 압축 및 최소화
데이터를 압축하고 최소화하는 도구를 사용하면 이미지 크기를 줄일 수 있어.
예시:
텍스트 파일과 로그 파일 압축:
RUN gzip /path/to/large/file.log
8. 사용하지 않는 라이브러리와 의존성 제거
필요한 패키지를 설치한 후 사용하지 않는 라이브러리와 의존성을 제거하면 이미지를 더 가볍게 유지할 수 있어.
예시:
Python 애플리케이션의 경우:
RUN pip install --no-cache-dir -r requirements.txt
6.3 최적화된 Dockerfile 예제
예제 1: Node.js를 위한 최적화된 Dockerfile
FROM node:14-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
이 예제는 multi-stage build를 사용하고 있어. 먼저 어플리케이션이 중간 단계에서 빌드되고, 빌드 결과물만 Nginx를 기반으로 한 최종 이미지에 복사돼.
예제 2: Python을 위한 최적화된 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"]
이 예제에서는 경량화된 base image python:3.9-slim
을 사용해. 의존성 설치를 별도의 스텝으로 분리해서, requirements.txt
파일이 변경되지 않으면 Docker 캐시를 사용할 수 있어.
GO TO FULL VERSION