본문 바로가기

4.개발 및 운영 환경

[docker] docker image 다이어트하기

들어가기

docker image를 생성하면 생각보다 매우크다. 보통 몇백 MB 정도의 크기를 갖는다. 일반적으로 배포하는 프로그램 크기는 100 MB은 넘지 않은 경우가 많다. 그러나 docker image같은 이런 커다란 파일을 배포한다고 하면 전송하는 시간도 무시못하는 수준이 된다. 이런 파일 크기를 1/10 크기로 줄인다면 배포하는 과정에서 시간과 자원이 매우 많이 절약된다.
docker image을 줄이는 방법은 복잡하거나 난이도가 어려운 작업이 아니기 때문이 적용하기 매우쉽다.
여기서 사용한 docker는 docker desktop 3.3.1(64152)이다.

작성자:ospace114@empal.com,http://ospace.tistory.com/

Sample

여기서 사용한 프로그램은 nginx를 기반으로한 홈페이지 배포라고 보면 된다. 샘플 HTML파일은 index.html 파일이다.
용량은 294B로 거의 무시할만한 용량이다.

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <title>Now</title>
</head>
<body>
    <h1></h1>
    <script>
        var h1 = document.querySelector('h1');
        setInterval(function(){ h1.innerHTML = new Date() }, 1000);
    </script>
</body>
</html>

Step1: 기본 image

먼저 가장 기본적은 docker image을 작성해서 크기를 확인해보자.
단순하게 보면 기본 image을 ubuntu를 사용하고 nginx을 설치하고 index.html파일을 추가하는 형태이다.

FROM ubuntu:20.10
RUN apt-get -y update && apt-get install nginx -y

COPY ./index.html /var/www/html

EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

생성된 docker image용량은 166MB 이다.
간혹 apt-get에 의해 임시로 생성된 파일 정리하는 아래 명령을 추가해도 여기에서는 별다른 효과가 없다.

apt-get autoremove && apt-get autoclean && apt-get clean

Step2: ngnix image 사용

다음으로 ngnix image으로 만들어진 docker image을 사용해보자.

FROM nginx

COPY ./index.html /usr/share/nginx/html

EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

생성된 docker image용량은 133MB이다. 첫번째 경우보다 약 80% 크기로 줄어들었다.

Step3: ngnix의 alpine 버전 사용

ngnix image 중에서 alpine이 있다. alpine은 불필요한 프로그램을 제거하고 필수 프로그램만 남겨두는 형태라고 한다. 그렇기 때문에 쉘도 없기때문에 실행 중인 container에 접근할 방법이 없게 된다. 보안적으로도 좋지만 디버깅하는데에는 매우 어려운 환경이 되는 단점도 있다.

FROM nginx:alpine

COPY ./index.html /usr/share/nginx/html

EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

생성된 docker image용량은 22.6MB이다. 첫번재 경우보다 약 14% 크기로 줄어들었다.
매우 많이 줄어들었기에 만족스러운 크기라고 볼 수 있다.

Step4: alpine image 사용

마지막으로 alpine image을 사용한 방법이 있다. alpine은 일반 리눅스 배포와는 다르게 최소한의 프로그램만 설치되어 있기 때문에 개발자가 수작업을 신경써야할 부분이 많다.

FROM alpine

RUN apk add --no-cache nginx

RUN mkdir -p /run/nginx
COPY ./index.html /var/www/html

EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

생성된 docker image용량은 7.03MB이다. 첫번째 경우보다 약 4% 크기로 줄어들었다. 엄청나게 줄어들었다. 즉, 7MB 용량이 대부분 커널과 nginx 프로그램에 해당하는 용량이라고 볼 수 있다.

결론

단순히 기본 이미지 변경으로 용량이 줄어들기 때문에 적절한 목적에 맞는 기본 이미지 선택이 좋다. 물론 alpine을 사용하면 좋지만 일반적인 리눅스 배포판과 다르기 때문에 환경설정과 지원하는 명령이 달리진다. 또한 쉘이 없기 때문에 쉘 스크립트를 활용할 수도 없다는 점도 고려해야한다. 물론 추가로 설치해서 사용할 수 있다. 즉, 초기 image 생성 작업이 힘들어질 수도 있다.
생각보다 어렵지 않아서 적절한 단계 수준에서 선택적으로 적용하면 된다. 여러분의 선택에 도움이되길 바란다. ospace.

참조

[1] https://learnk8s.io/blog/smaller-docker-images
[2] https://velog.io/@ilcm96/docker-multi-stage-build-upx

반응형