내 잡다한 노트
Dockerfile 최적화 방안 본문
Dockerfile 최적화는 이미지 크기를 줄이고, 빌드 속도를 개선하며, 실행 성능과 보안을 강화하는 데 중점을 둡니다. 잘 최적화된 Dockerfile은 효율적인 CI/CD 파이프라인과 배포 환경을 구축하는 데 필수적입니다.
1. 이미지 크기 줄이기
2. 빌드 속도 개선
3. 실행 성능
4. 보안
이걸 중점으로 최적화를 하도록 하자.
1. 이미지 크기 최적화
(1) 경량 베이스 이미지 사용
- 항상 필요한 최소한의 구성 요소만 포함된 경량 베이스 이미지를 사용합니다.
- 예:
- ubuntu 대신 debian:slim 또는 alpine 사용.
- Python 프로젝트의 경우 python:3.9-slim 사용.
(2) 멀티스테이지 빌드
- 빌드 단계와 실행 단계를 분리하여 최종 이미지에서 불필요한 빌드 도구를 제외.
- 멀티스테이지 빌드 예시:
Dockerfile
# 1단계: 빌드 환경
FROM golang:1.19 as builder
WORKDIR /app
COPY . .
RUN go build -o myapp .
# 2단계: 실행 환경
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/myapp .
CMD ["./myapp"]
- 결과: 최종 이미지는 실행 파일만 포함하며 크기가 작아짐.
2. 레이어 최적화
(1) 명령어를 결합하여 레이어 줄이기
- Dockerfile의 각 명령(RUN, COPY, ADD)은 새로운 레이어를 생성합니다.
- 명령을 결합하면 레이어 수와 이미지 크기를 줄일 수 있습니다.
비효율적:
RUN apt-get update RUN apt-get install -y python3 RUN apt-get clean
효율적:
RUN apt-get update && apt-get install -y python3 && apt-get clean
(2) 불필요한 파일 삭제
- 빌드 도중 생성된 캐시나 임시 파일을 제거하여 최종 이미지를 깨끗하게 유지.
예시:
RUN apt-get update && apt-get install -y python3 \ && apt-get clean \ && rm -rf /var/lib/apt/lists/*
3. 캐싱 활용
(1) 명령어 순서 최적화
- Docker는 각 명령을 레이어로 캐싱합니다. 변경 빈도가 낮은 명령어를 위쪽에 두면 캐시를 재사용할 수 있습니다.
비효율적:
COPY . /app RUN apt-get update && apt-get install -y python3
효율적:
RUN apt-get update && apt-get install -y python3 COPY . /app
- 파일 변경(COPY)로 인해 캐시가 무효화되는 것을 방지.
4. 보안 최적화
(1) 루트 사용자 사용 지양
- 컨테이너는 기본적으로 루트 사용자로 실행되므로, 보안 강화를 위해 일반 사용자로 실행.
예시:
RUN addgroup -S appgroup && adduser -S appuser -G appgroup USER appuser
(2) 이미지 스캔
- 이미지 빌드 후 취약점을 스캔하여 보안을 강화.
- 도구:
- Docker 자체 스캔: docker scan <image>
- 오픈소스 도구: Trivy, Clair.
5. 불필요한 명령과 파일 제거
(1) ADD 대신 COPY 사용
- ADD는 URL 또는 압축 파일 해제를 지원하지만, 필요 없는 기능을 포함해 복잡성을 증가시킬 수 있습니다.
- 복사만 필요할 경우 COPY를 사용.
예시:
COPY app.py /app/
(2) 불필요한 파일 .dockerignore로 제외
- .dockerignore 파일을 사용하여 빌드 컨텍스트에 불필요한 파일이 포함되지 않도록 설정.
- 예:
.git node_modules *.log
6. 성능 최적화
(1) 병렬 작업 활용
- 패키지 설치 시 병렬 작업을 활용하여 속도를 높입니다.
- 예: apt-get, pip 등에 -j 옵션 추가.
예시:
RUN apt-get install -y --no-install-recommends build-essential \ && make -j$(nproc)
make -j$(nproc):
- 병렬 작업 수를 현재 시스템의 CPU 코어 수($(nproc))로 설정.
- 컴파일 작업을 CPU 코어에 분산하여 속도를 높임.
(2) 이미지 레이어 압축
- 불필요한 레이어를 줄이고 작은 이미지를 생성.
- 예: BuildKit 활용.
DOCKER_BUILDKIT=1 docker build .
'DevOps > docker' 카테고리의 다른 글
도커 컨테이너와 VM의 차이 (0) | 2024.12.05 |
---|---|
Dockerfile 멀티 스테이지 빌드 (1) | 2024.11.30 |
도커파일에서 UID를 작성하는 이유 (0) | 2024.11.26 |
DooD ( Docker out of Docker ) (0) | 2024.11.19 |
도커파일 지시어 정리 (0) | 2024.10.18 |