본문 바로가기

Server Infra/Kubernetes

Docker Image Size 줄이기 다양한 팁들

728x90

소개


Docker 이미지는 Docker 컨테이너를 빌드하는 데 사용되는 필수 구성 요소입니다. 밀접하게 관련되어 있지만 Docker 이미지와 컨테이너 사이 에는 큰 차이점 이 있습니다 .

도커 이미지는 컨테이너의 기본입니다. 이러한 이미지는 특정 Docker 이미지를 생성하기 위해 자동으로 실행되는 지침 목록인 Dockerfiles 를 작성하여 생성됩니다.

Docker 이미지를 빌드할 때 밝게 유지해야 합니다. 큰 이미지를 피하면 컨테이너 구축 및 배포 속도가 빨라집니다. 따라서 이미지 크기를 최소화하는 것이 중요합니다.

더 작은 이미지 기반 사용(Alpine)

Docker 이미지를 생성하려면 필요에 따라 구성 요소를 설치하고 추가할 수 있는 기반이 필요합니다. 기존 상위 이미지를 다운로드하여 자체 이미지의 기반으로 사용하거나 처음부터 빌드할 수 있습니다.

이미지의 기반으로 운영 체제의 변형을 설치합니다. OS 기반은 최종 Docker 이미지의 크기에 큰 영향을 줄 수 있으므로 올바른 이미지를 결정하는 것이 중요한 역할을 합니다.

Linux는 가볍고 최소한의 POSIX 환경인 Alpine을 갖춘 유용한 대안을 만들었습니다. 이 Linux 배포 이미지 기반은 musl libc 및 BusyBox를 기반으로 구축된 5MB에 불과 합니다.

다른 OS 이미지에 비해 알파인은 크기가 훨씬 작습니다. 가장 많이 다운로드된 OS 이미지인 Ubuntu는 188MB인 반면 Alpine은 5MB에 불과합니다.

.dockerignore 파일 사용

이미지에 필요하지 않은 특정 파일을 제외하면 이미지 크기를 줄이는 데 도움이 됩니다. 그것이 .dockerignore 파일이 들어오는 곳입니다. 이미지를 빌드할 때 해당 이미지의 모양에 대한 사양이 포함된 Dockerfile을 작성합니다. 빌드 컨텍스트를 설명할 때 .dockerignore 파일을 포함하고 Dockerfile과 동일한 폴더에 저장하는 것도 중요합니다. 이 Docker 기능은 docker run으로 시작됩니다. 시스템은 그러한 파일이 있는지 확인하고 해당 예외를 적용하고 규칙을 무시합니다. 그렇게 하면 빌드된 컨텍스트에서 관련 없는 콘텐츠를 제거할 수 있습니다.

Docker의 다단계 빌드 기능 활용

Docker는 17.05 버전에서 다단계 기능을 도입했습니다. 사용자가 Dockerfile을 여러 단계로 나눌 수 있습니다.

각 단계는 FROM지침으로 시작됩니다. 필요한 아티팩트가 다음 단계로 전달되고 최종 이미지 아티팩트에 필요하지 않은 콘텐츠가 남습니다. 프로세스는 아티팩트의 필요한 구성 요소만 전송하므로 모든 명령을 수행한 후 수동으로 정리할 필요가 없습니다. 다단계 기능을 사용하면 전체 이미지 크기에 상당한 영향을 미치는 불필요한 레이어를 추가하지 않아도 됩니다.

Docker 이미지 크기를 줄이기 위해 불필요한 레이어 추가 방지

Docker 이미지는 레이어를 추가할 때마다 더 많은 공간을 차지합니다. 따라서 레이어가 많을수록 이미지에 더 많은 공간이 필요합니다.

Dockerfile의 각 RUN명령은 이미지에 새 계층을 추가합니다. 그렇기 때문에 단일 RUN명령 내에서 파일 조작을 시도해야 합니다. 또한 &&옵션을 사용하여 다른 명령을 하나의 명령으로 결합합니다.

예를 들어, 단일 RUN명령으로 리포지토리를 업데이트하고 여러 패키지를 설치할 수 있습니다. 명확하고 포괄적인 행을 얻으려면 백슬래시( \ )를 사용하여 여러 행에 명령을 입력할 수 있습니다.

패키지를 업데이트하고 설치하는 것 외에도 && rm -rf /var/lib/apt/lists/* 추가 공간을 절약하기 위해 apt 캐시도 정리해야 합니다.

RUN apt-get update && apt-get install -y\\
         [package-one] \\
         [package-two]
   && rm -rf /var/lib/apt/lists/*

업데이트와 불필요한 패키지 및 종속성에 주의하세요.

공간을 절약하고 Docker 이미지를 작게 유지하는 또 다른 방법은 구축 중인 플랫폼의 최신 버전을 실행하고 있는지 확인하는 것입니다.

최신 버전을 사용하면 수많은 rpm 패키지를 다운로드하고 많은 공간을 차지하는 광범위한 업데이트를 피할 수 있습니다.

 

참고: 업데이트해야 하는 경우 rpm 캐시를 정리하도록 dnf clean all 옵션을 추가해야 합니다.(RUN dnf -y update && dnf clean all)

패키지 설치에는 종종 소프트웨어가 의존하는 종속성 다운로드도 포함됩니다. 그러나 때때로 다운로드는 필요하지 않지만 권장되는 패키지도 저장합니다. 이러한 원치 않는 패키지는 많은 디스크 공간을 추가하고 소모할 수 있습니다. 주요 종속 항목만 다운로드하려면 --no-install-recommends 설치 명령에 옵션을 추가합니다.

예를 들어:

RUN apt-get install --no-install-recommends [package-one]

보너스 팁: 캐싱

이 팁은 Docker 이미지의 전체 크기에 영향을 미치지 않지만 더 빠른 Docker 빌드에는 도움이 됩니다.

Docker는 Dockerfile의 기존 레이어를 로컬로 캐싱하고 이를 사용하여 이미지를 더 빠르게 다시 빌드함으로써 이미지 빌드 속도를 높입니다. 예를 들어, 세 개의 레이어로 구성된 간단한 Dockerfile이 있다고 상상해 보십시오. 해당 파일에서 이미지를 빌드하면 시스템이 자동으로 이 세 개의 레이어를 캐시합니다. 다음에 이미지를 빌드하면 로컬 캐시에서 로드됩니다.

이미지를 수정하고 레이어 중 하나를 변경하기로 결정하면 수정된 레이어 이후에는 캐시가 사용되지 않습니다.

효율성을 높이고 캐싱 기능을 활용하는 방식으로 지침을 주문하는 것이 좋습니다. 변경될 가능성이 있는 명령어는 Dockerfile에 가능한 한 낮게 배치합니다.

 

728x90