내 잡다한 노트

Dockerfile 최적화 방안 본문

DevOps/docker

Dockerfile 최적화 방안

peanutwalnut 2024. 11. 30. 17:32

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