Profile picture

[Docker] 도커 레이어(Layer) 관리

JaehyoJJAng2023년 04월 05일

▶︎ 레이어 관리 전략

image
먼저 도커 파일의 레이어 구조에 대해서 간략하게 알아보자.

이미지 빌드 시 레이어는 도커 파일의 지시어 한 줄당 새로운 레이어 하나가 추가된다.

새로운 레이어가 추가되지 않는 지시어도 있지만, 일반적으로는 새로운 레이어가 만들어진다.

사진에서 보이는 도커 파일은 프론트엔드 애플리케이션의 도커 파일이다.

레이어가 추가되지 않는 CMD 지시어를 제외하고, 베이스 이미지인 node:14 이미지에 4개의 레이어가 추가된 것을 볼 수 있을 것이다.

베이스 이미지 역할을 하는 노드 이미지는 레이어가 총 14개이다.
image
도커 파일을 사용한 빌드를 통해서 기존의 14개의 레이어에 새로운 4개의 레이어를 더해서

결과물은 총 18개의 레이어로 빌드가 될 것이다.

레이어의 갯수가 늘어나는 것은 이미지의 크기를 약간 증가시킬 수 있으며,

레이어가 늘어나면 늘어날수록 빌드의 속도가 느려질 수 있고, 이미지 관리가 복잡해지는 단점이 존재한다.

그래서 레이어는 꼭 필요한 레이어만 추가해야 한다.

레이어 개수를 관리하는 대표적인 케이스가 run 지시어를 사용하는 것인데

예를 들어, 아래와 같이 컨테이너에 여러 패키지를 설치한다고 가정해보자. image
이 케이스의 경우에는 RUN 지시어를 5번 수행해 5개의 레이어가 생성되는 케이스이다.

이 경우에는 빌드되는 새로운 이미지에 5개의 레이어를 추가하게 되는 셈인거다.


그런데 리눅스에서는 end-end(&&)를 사용하여 여러 개의 명령을 한 번에 실행할 수 있다.

FROM ubuntu:latest
RUN apt-get update && \
    apt-get install -y curl && \
    apt-get install -y xz-utils && \
    apt-get install -y git && \
    apt-get clean

위처럼 사용하면 RUN 지시어를 한 번만 사용하면서도 결과적으로는 같은 상태의 이미지를 만들 수 있는 것이다.


두 가지 방식을 모두 사용해서 이미지를 빌드한 결과를 살펴보자.
image
RUN 지시어를 각각 사용해서 실행한 이미지는 레이어가 5개 추가가 되었고


모든 명령어를 하나의 RUN 지시어에 모아서 실행한 이미지는 레이어가 1개만 추가된 것을 볼 수 있다.
image


‣ 가능한 작게

image
이미지의 크기는 가능한 작은 것이 좋다.

보통 현업에서는 이미지를 빌드하고 푸시하고 배포하는 과정은 모두 다른 기기에서 이루어진다.

새로운 버전으로 빌드한 이미지를 레지스트리에 푸시하고, 각각의 환경에서 이미지를 레지스트리로부터 다운로드 받아 컨테이너를 업그레이드 한다.

이 과정에서 이미지는 네트워크를 통해서 업로드되고 다운로드 되기 때문에 이미지의 크기가 작으면 작을 수록

배포 속도와 네트워크 사용량에 더 유리하다고 볼 수 있다.


• 기능 모듈화

애플리케이션 소스의 불필요한 기능들을 줄이고 하나의 큰 모듈을 여러 모듈로 분리해서 애플리케이션의 크기를 줄여볼 수 있다.

애플리케이션의 크기가 줄어들면 이 애플리케이션을 포함하는 이미지의 크기도 함께 줄어든다.


• alpine 이미지

두번째 방법은 베이스 이미지를 작은 이미지로 선택하는 것이다.
image

보통은 알파인 OS를 기반으로 제작된 이미지를 베이스 이미지로 많이 채택한다.

극단적으로 사이즈를 줄이려면 모든 이미지의 가장 뿌리가 되는 이미지인 스크래치 이미지를 사용해볼 수도 있다.

여기서 스크래치 이미지란 이미지를 빌드하기 위한 가장 최소한의 파일만 포함한 이미지를 의미한다.

우분투 이미지는 apt-get install로 패키지를 설치하는 반면,

알파인 이미지는 apk add 명령을 사용하여 패키지를 설치할 수 있다.

위 이미지의 아래 부분을 보면

ubuntu 이미지의 경우 185MB인 반면, alpine 이미지는 21MB밖에 되지 않는다.


Loading script...