본문 바로가기

IT 인프라/DevOps

Docker 이미지 용량을 줄이는 Tip

반응형

 

FromLatest.io 사용하기

  • FromLatest에서 Dockerfile Lint를 하고, 이미지를 작게 할 수 있는 다양한 팁을 얻을 수 있다.
  • https://www.fromlatest.io/#/

더 작은 Base 이미지 사용하기

  • alpine 이미지를 사용하면 이미지 용량을 줄일 수 있다.
    DockerHub에서 이미지 태그에 alpine이 명시된 것들을 볼 수 있다. 
  • https://hub.docker.com/_/alpine/

Application De-Coupling 하기

  • 하나의 컨테이너는 단 하나의 어플리케이션 / 용도로만 사용한다. (객체지향 원칙의 SRP와 같이)
  • 한 이미지에 다수의 애플리케이션/컴포넌트가 들어있다면 이를 각각의 컨테이너로 나눈다.
    이를 통해 이미지 사이즈 감소, 더 나은 확장성, 재사용성을 얻을 수 있다.

Layer를 최소화하기

  • RUN, COPY, ADD 명령들은 다 Layer로 만들어져 스택처럼 쌓이게 되고, 이는 Docker 이미지의 크기를 크게 만든다.
    따라서 한 라인에 필요한 명령어를 명시하여 Layer가 겹겹이 쌓이는 것을 줄여야 한다.
  • 각 Layer로 생성된 것들은 다음 빌드 시 속도를 높이기 위해 변경사항이 없다면 재사용된다. (Build Cache)
    따라서 개발 단계에서는 쉽게 구분하기 위해 명령을 쪼개서 사용하다가 Production용 빌드시 최대한 한 줄로 합친다.
    • 단, --no-cache=true 옵션을 사용할 경우 Cache를 사용하지 않는다.
    • Dockerfile에 명시된 명령어가 (부모 이미지 포함) 이전에 만들어진 Layer에서 사용된 명령어와 완벽하게 동일하지 않으면 캐시되지 않는다.
    • ADD, COPY 명령으로 파일이 추가/복사 될 때, 각 파일의 체크섬을 계산하여 이미지의 것과 비교한다.
      이때 파일의 최종 수정일, 최종 접근일은 고려 대상이 아니다.
  • 한 라인에 너무 많은 내용이 있을 경우 \ (backslash)를 사용하여 개행을 함으로써 가독성을 높일 수 있다.
  • multi-build 스테이지를 통해 (아마도 Production 용도로 사용될) 마지막 단계에 생성된 이미지에 어플리케이션 실행에 필요한 파일만 넣음으로써 이미지 용량을 극적으로 줄일 수 있다. (https://docs.docker.com/develop/develop-images/multistage-build/)

불필요한 패키지, 파일 설치하지 않기

  • 패키지 매니저
    • apt 패키지 매니저 사용시 --no-install-recommends 옵션을 넣는다.
    • apt 패키지 매니저로 필요한 패키지를 설치한 후 rm -rf /var/lib/apt/lists/* 명령을 실행한다.
      yum 패키지 매니저를 사용할 땐 yum clean all 명령을 실행한다.
      불필요하게 남겨진 캐시 파일을 삭제함으로써 용량을 줄일 수 있다.
    • 만약 curl, wget 등으로 외부 네트워크에서 필요한 파일을 다운로드 했다면 다운로드 한 파일들(tar, tar.gz 등)과 curl, wget도 함께 삭제한다.
  • 디버그 툴
    • 나중에 쉽게 디버그하기 위해 vim, curl과 같이 어플리케이션에 불필요한 프로그램들을 설치하지 않는다.
    • 최소한의 이미지로 필요한 것들만 설치한다.
  • .dockerignore
    • .gitignore와 같이 불필요한 파일 복사를 막아줌으로써 이미지 용량을 줄일 수 있다.

 

참고

반응형