도커 이미지 경량화 방법
도커 이미지를 경량화하는 것은 더 빠른 빌드, 배포, 그리고 실행을 위해 매우 중요함.
불필요한 파일과 의존성을 줄이고, 더 작은 이미지 크기를 유지하면 네트워크 대역폭을 절약하고 보안성을 높일 수 있음.
도커 이미지를 경량화하는 주요 방법은 다음과 같음.
1. 최소 베이스 이미지 사용
Alpine Linux와 같은 경량 베이스 이미지를 사용하는 것이 좋음.
예를 들어, 일반적인 ubuntu 또는 debian 베이스 이미지는 수백 MB 이상이지만, alpine은 약 5MB로 매우 작음.
FROM alpine:latest
이렇게 하면 기본적으로 포함된 패키지들이 적고, 필요한 것들만 추가하는 방식으로 경량화를 할 수 있음.
2. 멀티 스테이지 빌드 활용
멀티 스테이지 빌드는 빌드 환경과 런타임 환경을 분리하여 최종 이미지에는 필요한 파일들만 포함되게 함.
빌드 도구나 중간 파일을 최종 이미지에서 제거할 수 있음.
# 빌드 스테이지
FROM golang:1.17 AS builder
WORKDIR /app
COPY . .
RUN go build -o main .
# 실제 런타임 이미지
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/main .
CMD ["./main"]
여기서 golang 과 같은 큰 빌드 이미지를 사용하더라도 최종 런타임 이미지는 매우 가벼운 alpine 베이스로 생성됨.
3. 불필요한 파일 제거
도커 이미지에 불필요한 파일을 포함시키지 않도록 주의해야 함.
이를 위해서는 Dockerfile에서 .dockerignore 파일을 활용하여 빌드에 불필요한 파일을 제외시킬 수 있음.
# .dockerignore 파일
node_modules
*.log
.git
4. 레이어 최적화
도커 이미지의 각 명령은 레이어를 생성하므로, 불필요한 레이어 생성을 피하고, 레이어 수를 최소화하는 것이 중요함.
명령을 하나로 결합하여 레이어 수를 줄일 수 있음.
# 비효율적인 방법 (여러 레이어 생성)
RUN apt-get update
RUN apt-get install -y curl
# 효율적인 방법 (하나의 레이어)
RUN apt-get update && apt-get install -y curl
5. 캐시 활용 및 --no-install-recommends 옵션 사용
패키지를 설치할 때, 필요하지 않은 의존성까지 설치되지 않도록 --no-install-recommends 옵션을 사용하면 이미지 크기를 줄일 수 있음.
RUN apt-get update && apt-get install -y --no-install-recommends curl
6. 단일 목적 컨테이너
각 컨테이너는 한 가지 일만 처리하도록 설계하는 것이 좋음.
이는 필요한 패키지와 파일만 포함시키게 하여 경량화를 촉진함.
예를 들어, 웹 서버와 데이터베이스를 각각 다른 컨테이너에서 실행하면 각 컨테이너가 더 작은 크기를 유지할 수 있음.
7. 이미지 압축
이미지의 크기를 줄이기 위해 빌드 후에 이미지를 압축할 수 있음.
도커에서 docker image prune 명령을 사용하면 사용하지 않는 중간 이미지를 제거하여 공간을 절약할 수 있음.
docker image prune -f
8. 필요한 파일만 복사
코드 파일을 복사할 때, 전체 폴더를 복사하지 말고 필요한 파일만 선택적으로 복사하는 것도 방법입니다.
# 비효율적인 방법
COPY . /app
# 효율적인 방법
COPY src/ /app/src/
COPY package.json /app/
9. 사용하지 않는 패키지 정리
apt-get 이나 apk 같은 패키지 관리자를 사용할 때, 설치 후에 사용하지 않는 캐시 파일을 정리해야 함.
RUN apt-get update && apt-get install -y curl \
&& rm -rf /var/lib/apt/lists/*
도커 이미지 경량화 정리
위와 같은 방법을 사용하면 도커 이미지의 크기를 최소화하고, 성능과 배포 효율성을 크게 향상시킬 수 있음.
'Data Engineering > Zeppelin' 카테고리의 다른 글
[Zeppelin] 쿠버네티스의 라벨 (0) | 2024.09.11 |
---|---|
[Zeppelin] 쿠버네티스란 (1) | 2024.09.11 |
[Zeppelin] 웹 기반 노트북 인터페이스 (2) | 2024.09.04 |
[Zeppelin] 아파치 제플린의 보안 (0) | 2024.08.26 |
[Zeppelin] 아파치 제플린의 기능 (0) | 2024.08.26 |