본문 바로가기

Server Infra/Kubernetes

Container를 경량화 하기 위한 툴

728x90

Container화 하는 경우 경량화를 하기 위하여 multi-stage build 를 사용하여 필요한 녀석만 알파인 또는 스크레치에 옮기는 작업을 아마 다들 할것이다. 자바의 경우는 특히 jlink나 jdept를 사용하여 필요한 라이브러리만 묶은 custome jre를 만들어서 경량화 할 수 있다.
https://aws.amazon.com/ko/blogs/tech/amazon-corretto-base-container-diet/

 

Amazon Corretto OpenJDK를 사용한 Java 기반 애플리케이션 컨테이너 경량화 | Amazon Web Services

서론 컨테이너로 배포되는 애플리케이션은 컨테이너 이미지의 크기가 작을수록 빠르게 실행하고 확장할 수 있으며 이미지 보관 및 전송에 드는 비용이 절감됩니다. 특히 서버리스 컴퓨팅 엔진

aws.amazon.com

 

근데 이제 Multi-stage build는 일반적이라 layer별 모니터링하고 인사이트를 얻을 수 있는 툴을 소개해 보고자 한다.

dive cli

https://github.com/wagoodman/dive

 

GitHub - wagoodman/dive: A tool for exploring each layer in a docker image

A tool for exploring each layer in a docker image. Contribute to wagoodman/dive development by creating an account on GitHub.

github.com

위 툴은 사용하면 각 레이어 별로 어떤 파일이 변경되었고 수정되었고 추가되었는지 확인이 가능하다. 특히 컨테이너 빌드후 패키지가 정상적으로 들어갔는지 파악하는데 매우 유용하다.

 

설치는 저 위 github README 처럼 간단하게 brew로 진행하면 된다.

brew install dive

 

그러면 간단한 dockerfile을 하나 만들어서 테스트 해보겠다. dive에 대한 소개이니 뭐 용량 줄이는 테크닉보다는 그냥 툴 사용 방법 정도만 정리해보자

No Multi-stage

FROM python:3.11-alpine AS builder

WORKDIR /app

RUN python -m venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"
COPY . .
RUN pip install --no-cache-dir -r requirements.txt

CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"]

 

빌드 결과

docker build -t sample-langserve -f ./Dockerfile_single .
[+] Building 63.0s (11/11) FINISHED                                                                                                                                                                 docker:orbstack
 => [internal] load build definition from Dockerfile_single                                                                                                                                                    0.1s
 => => transferring dockerfile: 375B                                                                                                                                                                           0.0s
 => [internal] load metadata for docker.io/library/python:3.11-alpine                                                                                                                                          2.2s
 => [auth] library/python:pull token for registry-1.docker.io                                                                                                                                                  0.0s
 => [internal] load .dockerignore                                                                                                                                                                              0.0s
 => => transferring context: 3.16kB                                                                                                                                                                            0.0s
 => [1/5] FROM docker.io/library/python:3.11-alpine@sha256:700b4aa84090748aafb348fc042b5970abb0a73c8f1b4fcfe0f4e3c2a4a9fcca                                                                                    0.0s
 => [internal] load build context                                                                                                                                                                              0.1s
 => => transferring context: 9.23kB                                                                                                                                                                            0.0s
 => CACHED [2/5] WORKDIR /app                                                                                                                                                                                  0.0s
 => CACHED [3/5] RUN python -m venv /opt/venv                                                                                                                                                                  0.0s
 => [4/5] COPY . .                                                                                                                                                                                             0.2s
 => [5/5] RUN pip install --no-cache-dir -r requirements.txt                                                                                                                                                  55.8s
 => exporting to image                                                                                                                                                                                         4.5s 
 => => exporting layers                                                                                                                                                                                        4.5s 
 => => writing image sha256:4479381f19f6892c6899b6a854aecf5fe20e7216d91fa69e976ccbfaea6a1ee1                                                                                                                   0.0s 
 => => naming to docker.io/library/sample-langserve                                                                                                                                                            0.0s

  

image 확인

 docker images
REPOSITORY         TAG       IMAGE ID       CREATED          SIZE
sample-langserve   latest    4479381f19f6   40 seconds ago   660MB

 

dive cli 사용

dive sample-langserve

뭔가 엄청 들어갔다. 각 layer 별로 다 나온다...사용법 자체도 별거 없다. dive 하고 container의 image id 또는 name을 입력하면 끝이다.

 

해당 내용을 보면

Dockerfile에 작성하지 않은 이상한 CLI들이 있다. 이건 뭘까 싶은데 요놈들은 python alpine continer에 등록된 녀석들이다. 

https://github.com/docker-library/python/blob/290f525cf67ff5a27410408ca3b7972d46b9203f/3.11/alpine3.20/Dockerfile

 

python/3.11/alpine3.20/Dockerfile at 290f525cf67ff5a27410408ca3b7972d46b9203f · docker-library/python

Docker Official Image packaging for Python. Contribute to docker-library/python development by creating an account on GitHub.

github.com

이렇든 dive를 사용하면 현재 사용중인 base image의 layer 부터 모두 확인 가능하니 컨테이너라이징에 잘 활용해 보도록하자!

728x90