본문 바로가기

IT

[Docker] Docker Image 사이즈 줄이기

현업에서 컨테이너 환경에서 애플리케이션을 배포하고 관리하기 위해 도커(Docker) 를 사용하고 있다.

애플리케이션과 환경을 Dockefile 에 정의하여 도커 이미지로 만들고, Dockefile 을 빌드하여 도커 이미지를 생성한다.

Dockerfile 로 간단한 도커 이미지를 만들때에는 인지하지 못했지만(진작 고려했어야하는 문제이긴하다...) 도커 이미지 사이즈가 커지면서 컨테이너 배포와 빌드 속도가 느려지는 문제가 발생했다.

 

그래서 도커 이미지 사이즈를 줄이는 방법을 정리해서 점검해보는 방식을 사용하려고 한다. 

 

 

사이즈가 작은 베이스 이미지 사용하기

  • 도커 이미지의 베이스 이미지부터 사이즈가 작은 베이스 이미지를 사용하기
  • Ubuntu 크기는 188MB, Alpine 크기는 5MB (약 37배 차이)
  • Alpine 은 minimal POSIX(portable operating system interface 이식가능 운영체제 시스템) 환경을 제공함

 

vim/curl 과 같은 디버깅툴 설치하지 않기

  • 디버깅을 하기 위해서는 dev Dockerfile 과 prod Dockerfile 을 분리하고 dev Dockerfile 에 디버깅툴 설치 권장함

 

.dockerignore 파일 사용하기

  • 이미지에 관련없는 파일을 제거함

 

Multi-Stage feature 사용하기

  • FROM 명령 으로 각 stage 를 정의하고 각 stage 에서는 다른 stage 에서 빌드된 아티팩트를 카피해서 사용가능함
  • stage 의 빌드된 아티팩트는 남아있지만 최종 stage에서 저장하지 않기 때문에 용량이 줄어듬
FROM golang:1.7.3
WORKDIR /go/src/github.com/alexellis/href-counter/
RUN go get -d -v golang.org/x/net/html  
COPY app.go .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .

FROM alpine:latest  
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=0 /go/src/github.com/alexellis/href-counter/app .
CMD ["./app"]

 

  • 위의 Dockerfile 에서 Go SDK 와 나머지 아티팩트는 남아있지만 이것이 최종 stage 에 저장되진 않음

 

불필요한 레이어 추가 피하기

  • 도커 이미지에서는 레이어가 추가될때마다 더 많은 공간을 필요하게 됨
  • Dockerfile 에서 RUN 명령마다 새로운 레이어가 추가되므로 되도록 RUN 명령어 한줄로 처리를 권장함

 

업데이트와 불필요한 패키지, 의존성파일 주의하기

  • lastest 버전을 사용하면 무수한 rpm 패키지를 다운받아서 많은 공간을 차지하는 것을 피할 수 있음
  • --no-install-recommends 옵션을 사용하면 메인 디펜던시만 설치됨 (ex. apt-get install -y —no-install-recommends)
  • rm -rf /var/lib/apt/lists/* 명령어를 추가하면 설치된 패키지를 삭제할 수 있음 
RUN apt-get update \
    && apt-get install -y —no-install-recommends && rm -rf /var/lib/apt/lists/*

 

fromlatest.io 사용해서 점검해보기

  • 이미지 사이즈를 줄일 수 있는 방법을 제시해줌

https://www.fromlatest.io 점검예시

 

Docker 의 고수가 되는 그날까지... 무한대로 공부하자

 

참고 자료

https://docs.docker.com/develop/develop-images/multistage-build/

https://hackernoon.com/tips-to-reduce-docker-image-sizes-876095da3b34