docker builder prune 명령어를 사용하여 빌드 캐시 제거 방법

DockerBeginner
지금 연습하기

소개

이 랩에서는 docker builder prune 명령어를 사용하여 Docker 빌드 캐시를 효과적으로 관리하는 방법을 배우게 됩니다. 먼저 간단한 Docker 이미지를 빌드하여 빌드 캐시가 생성되고 활용되어 후속 빌드의 속도를 높이는 방식을 이해하는 것으로 시작합니다.

이미지 빌드 후에는 빌드 캐시를 정리하는 다양한 방법을 살펴보겠습니다. 여기에는 댕글링 (dangling) 빌드 캐시 정리, 사용하지 않는 모든 빌드 캐시 제거, 필터를 사용하여 선택적으로 캐시 정리 등이 포함됩니다. 마지막으로, 저장 공간을 보존하면서 빌드 캐시를 정리하는 방법을 배우게 되며, 빌드 캐시 관리 기술에 대한 포괄적인 이해를 제공합니다.

빌드 캐시 생성을 위한 이미지 빌드

이 단계에서는 빌드 캐시가 어떻게 생성되는지 이해하기 위해 간단한 Docker 이미지를 빌드합니다. Docker 는 후속 빌드의 속도를 높이기 위해 빌드 캐시를 사용합니다. Dockerfile 의 각 명령어는 레이어를 생성하며, 마지막 빌드 이후 해당 명령어가 변경되지 않은 경우 Docker 는 캐시에서 기존 레이어를 재사용할 수 있습니다.

먼저, 아직 해당 디렉토리에 있지 않다면 ~/project 디렉토리로 이동합니다.

cd ~/project

이제 간단한 Dockerfile 을 생성해 보겠습니다. 이름을 Dockerfile.cache로 지정합니다.

nano Dockerfile.cache

다음 내용을 Dockerfile.cache 파일에 추가합니다.

FROM ubuntu:latest
RUN apt-get update && apt-get install -y --no-install-recommends curl
COPY . /app
WORKDIR /app
CMD ["curl", "https://www.example.com"]

파일을 저장하고 nano 편집기를 종료합니다 ( Ctrl + X를 누른 다음 Y를 누르고 Enter를 누릅니다).

이 Dockerfile 은 다음 작업을 수행합니다.

  • FROM ubuntu:latest: 최신 Ubuntu 기본 이미지로 시작합니다.
  • RUN apt-get update && apt-get install -y --no-install-recommends curl: 패키지 목록을 업데이트하고 curl 패키지를 설치합니다. 이는 일반적인 작업이며, 기본 이미지와 이 명령어가 변경되지 않으면 후속 빌드에서 캐시될 가능성이 높습니다.
  • COPY . /app: 현재 디렉토리의 내용을 이미지의 /app 디렉토리로 복사합니다.
  • WORKDIR /app: 작업 디렉토리를 /app으로 설정합니다.
  • CMD ["curl", "https://www.example.com"]: 이 이미지에서 컨테이너가 시작될 때 실행할 명령어를 지정합니다.

빌드하기 전에, ubuntu:latest 이미지가 로컬에 있는지 확인해 보겠습니다. 그렇지 않은 경우 Docker 는 빌드 중에 자동으로 이미지를 가져오지만, 먼저 명시적으로 가져오면 빌드 출력이 더 명확해질 수 있습니다.

docker pull ubuntu:latest

이제 Dockerfile.cache 파일을 사용하여 이미지를 빌드해 보겠습니다. 이미지를 myimage:cachetest로 태그합니다.

docker build -t myimage:cachetest -f Dockerfile.cache .

빌드 프로세스의 단계를 나타내는 출력을 볼 수 있습니다. Docker 는 Dockerfile 의 각 명령어를 실행합니다. 이것이 이 Dockerfile 로 처음 빌드하는 것이므로 Docker 는 이 Dockerfile 에 정의된 레이어에 대해 빌드 캐시를 사용하지 않습니다.

빌드가 완료된 후, 이미지를 나열하여 새로 생성된 myimage:cachetest를 확인할 수 있습니다.

docker images

목록에서 cachetest 태그가 있는 myimage를 볼 수 있습니다. 이 빌드 프로세스는 Dockerfile.cache에 정의된 각 레이어에 대한 빌드 캐시를 생성했습니다. 다음 단계에서는 이 빌드 캐시를 관리하는 방법을 살펴보겠습니다.

댕글링 (Dangling) 빌드 캐시 정리

이 단계에서는 댕글링 빌드 캐시를 정리하는 방법을 배우게 됩니다. 댕글링 빌드 캐시는 더 이상 명명된 이미지와 연결되지 않은 빌드 캐시 레이어를 의미합니다. 이는 이미지를 다시 빌드하고 이전 레이어가 새 레이어로 대체될 때 발생할 수 있습니다. 댕글링 캐시를 정리하면 디스크 공간을 확보하는 데 도움이 될 수 있습니다.

먼저, Dockerfile.cache를 약간 수정하여 댕글링 캐시를 생성해 보겠습니다. RUN 명령어를 변경합니다.

아직 해당 디렉토리에 있지 않다면 ~/project 디렉토리로 이동합니다.

cd ~/project

편집을 위해 Dockerfile.cache 파일을 엽니다.

nano Dockerfile.cache

RUN 명령어를 다음으로 변경합니다.

RUN apt-get update && apt-get install -y --no-install-recommends curl

다음으로:

RUN apt-get update && apt-get install -y --no-install-recommends wget

파일을 저장하고 nano 편집기를 종료합니다 ( Ctrl + X를 누른 다음 Y를 누르고 Enter를 누릅니다).

이제 동일한 태그로 이미지를 다시 빌드해 보겠습니다.

docker build -t myimage:cachetest -f Dockerfile.cache .

출력을 관찰합니다. Docker 는 캐시에서 FROM 레이어를 재사용할 가능성이 높지만, RUN 명령어가 변경되었으므로 해당 단계를 다시 실행하여 새 레이어를 생성합니다. 이전 RUN 명령어에 의해 생성된 이전 레이어는 더 이상 myimage:cachetest 이미지의 일부가 아니므로 이제 댕글링 빌드 캐시입니다.

빌드 캐시를 확인하려면 docker builder prune --dry-run 명령어를 사용할 수 있습니다. 하지만 더 고급 도구나 buildkit 출력에 대한 이해 없이는 댕글링 캐시를 특별히 구별하기가 항상 쉽지는 않습니다. 효과를 확인하는 더 간단한 방법은 댕글링 캐시를 정리하고 회수된 공간을 확인하는 것입니다.

댕글링 빌드 캐시만 정리하려면 --filter dangling=true 옵션과 함께 docker builder prune 명령어를 사용합니다.

docker builder prune --filter dangling=true

작업을 확인하라는 메시지가 표시됩니다. y를 입력하고 Enter를 누릅니다.

WARNING! This will remove all dangling build cache.
Are you sure you want to continue? [y/N] y

출력은 회수된 공간의 양을 표시합니다. 이 공간은 더 이상 활성 이미지 레이어에서 사용되지 않는 댕글링 빌드 캐시 레이어에 의해 점유되었습니다.

댕글링 빌드 캐시를 정리하면 더 이상 활성 이미지 레이어에서 사용되지 않는 디스크 공간을 회수할 수 있습니다.

사용하지 않는 모든 빌드 캐시 정리

이 단계에서는 사용하지 않는 모든 빌드 캐시를 정리하는 방법을 배우게 됩니다. 댕글링 캐시를 정리하면 이미지와 연결되지 않은 레이어가 제거되는 반면, 사용하지 않는 모든 캐시를 정리하면 현재 실행 중인 컨테이너에서 사용되지 않거나 로컬 이미지에서 참조되지 않는 모든 빌드 캐시가 제거됩니다. 이는 디스크 공간을 확보하는 보다 적극적인 방법입니다.

먼저, 다른 Dockerfile 을 사용하여 다른 이미지를 생성하여 더 많은 빌드 캐시를 추가해 보겠습니다.

아직 해당 디렉토리에 있지 않다면 ~/project 디렉토리로 이동합니다.

cd ~/project

Dockerfile.another라는 새 Dockerfile 을 생성합니다.

nano Dockerfile.another

다음 내용을 Dockerfile.another에 추가합니다.

FROM alpine:latest
RUN apk update && apk add --no-cache git
COPY . /app2
WORKDIR /app2
CMD ["git", "--version"]

파일을 저장하고 nano 편집기를 종료합니다 ( Ctrl + X를 누른 다음 Y를 누르고 Enter를 누릅니다).

이 Dockerfile 은 alpine 기본 이미지를 사용하고 git을 설치합니다.

이제 이 새 Dockerfile 을 사용하여 이미지를 빌드합니다. 이를 anotherimage:latest로 태그합니다.

docker build -t anotherimage:latest -f Dockerfile.another .

이 빌드는 이 Dockerfile 에 특정한 새 빌드 캐시 레이어를 생성합니다.

사용하지 않는 모든 빌드 캐시를 정리하려면 필터 없이 docker builder prune 명령어를 사용합니다.

docker builder prune -a

-a 플래그는 "all"을 의미하며, 댕글링 캐시뿐만 아니라 사용하지 않는 모든 빌드 캐시를 제거하려는 것을 나타냅니다.

작업을 확인하라는 메시지가 표시됩니다. y를 입력하고 Enter를 누릅니다.

WARNING! This will remove all unused build cache.
Are you sure you want to continue? [y/N] y

출력은 회수된 공간의 양을 표시합니다. 이 명령어는 현재 로컬 이미지 또는 실행 중인 컨테이너에서 참조되지 않는 모든 빌드 캐시 레이어를 제거합니다. 이는 특히 많은 빌드 및 이미지 업데이트 후 상당한 양의 디스크 공간을 확보할 수 있습니다.

사용하지 않는 모든 캐시를 정리하면 로컬에 여전히 있는 이미지의 후속 빌드가 제거된 캐시 레이어에 의존하는 경우 더 오래 걸릴 수 있다는 점을 명심하십시오.

필터를 사용하여 빌드 캐시 정리

이 단계에서는 필터를 사용하여 빌드 캐시를 정리하는 방법을 살펴봅니다. 필터를 사용하면 특정 기준에 따라 빌드 캐시를 선택적으로 제거할 수 있으므로 제거할 항목에 대해 더 세분화된 제어가 가능합니다.

이전 단계에서 dangling=true 필터를 이미 보았습니다. 또 다른 유용한 필터는 until로, 특정 타임스탬프 이전에 생성된 빌드 캐시를 제거할 수 있습니다.

먼저, 최근 빌드 캐시가 있는지 확인하기 위해 myimage:cachetest 이미지를 다시 빌드해 보겠습니다.

아직 해당 디렉토리에 있지 않다면 ~/project 디렉토리로 이동합니다.

cd ~/project

이미지를 다시 빌드합니다.

docker build -t myimage:cachetest -f Dockerfile.cache .

이제 특정 시간보다 오래된 빌드 캐시를 제거하려는 시나리오를 시뮬레이션해 보겠습니다. 시연을 위해 몇 분 전보다 오래된 캐시를 제거하는 필터를 사용합니다.

특정 시간보다 오래된 빌드 캐시를 정리하려면 --filter until=<timestamp> 옵션을 사용할 수 있습니다. 타임스탬프는 5m (5 분) 또는 2h (2 시간) 와 같은 기간을 포함하여 다양한 형식일 수 있습니다.

5 분보다 오래된 빌드 캐시를 정리해 보겠습니다.

docker builder prune --filter until=5m

작업을 확인하라는 메시지가 표시됩니다. y를 입력하고 Enter를 누릅니다.

WARNING! This will remove all build cache created before 5 minutes ago.
Are you sure you want to continue? [y/N] y

출력은 5 분보다 오래된 빌드 캐시에서 회수된 공간의 양을 표시합니다. 방금 이미지를 빌드했다면 5 분보다 오래된 캐시가 많지 않을 수 있지만, 시간이 지남에 따라 많은 빌드가 있는 실제 시나리오에서는 이 필터가 오래된 캐시를 정리하는 데 매우 유용할 수 있습니다.

필터를 결합할 수도 있습니다. 예를 들어, 특정 시간보다 오래된 댕글링 캐시를 정리하려면 다음을 사용할 수 있습니다.

docker builder prune --filter dangling=true --filter until=24h

이렇게 하면 24 시간보다 오래된 댕글링 빌드 캐시만 제거됩니다.

필터를 사용하면 빌드 캐시를 유연하게 관리하고 디스크 공간을 보다 전략적으로 확보할 수 있습니다.

저장 공간을 유지하면서 빌드 캐시 정리

이 단계에서는 특정 양의 스토리지를 유지하면서 빌드 캐시를 정리하는 방법을 배우게 됩니다. 이는 디스크 공간을 확보하면서도 향후 빌드의 속도를 높이기 위해 최근 빌드 캐시를 일부 유지하려는 경우에 유용합니다.

docker builder prune 명령어에는 빌드 캐시에 대해 유지할 최대 스토리지 양을 지정할 수 있는 --keep-storage 옵션이 있습니다. 크기를 바이트 단위로 지정하거나 k, m, 또는 g와 같은 단위를 사용할 수 있습니다.

먼저, 정리할 빌드 캐시가 있는지 확인해 보겠습니다. 이전 단계에서 이미지를 빌드하여 캐시를 생성했습니다.

아직 해당 디렉토리에 있지 않다면 ~/project 디렉토리로 이동합니다.

cd ~/project

특정 양의 스토리지를 유지하면서 빌드 캐시를 정리하려면 --keep-storage 옵션 뒤에 원하는 크기를 지정합니다. 예를 들어, 최대 1GB 의 빌드 캐시를 유지하려면 다음과 같이 합니다.

docker builder prune --keep-storage 1g

작업을 확인하라는 메시지가 표시됩니다. y를 입력하고 Enter를 누릅니다.

WARNING! This will remove all build cache exceeding 1GB.
Are you sure you want to continue? [y/N] y

출력은 회수된 공간의 양을 표시합니다. Docker 는 총 빌드 캐시 크기가 지정된 --keep-storage 제한 미만이 될 때까지 가장 오래된 빌드 캐시 레이어를 제거합니다.

사용 가능한 디스크 공간과 더 빠른 빌드를 위해 유지하려는 캐시 양에 따라 --keep-storage의 값을 조정할 수 있습니다. 예를 들어, 최대 500MB 를 유지하려면 다음과 같이 합니다.

docker builder prune --keep-storage 500m

다시, y를 입력하고 Enter를 눌러 작업을 확인합니다.

이 방법은 디스크 공간을 확보하고 성능을 위해 일부 빌드 캐시를 유지하는 것 사이의 균형을 제공합니다. 빌드 캐시가 과도한 디스크 공간을 소비하지 않도록 정기적으로 정리하는 것이 좋습니다.

요약

이 랩에서는 docker builder prune 명령을 사용하여 Docker 빌드 캐시를 관리하는 방법을 배웠습니다. 먼저, Dockerfile을 사용하여 간단한 Docker 이미지를 빌드하여 빌드 캐시가 생성되고 Docker 에서 후속 빌드의 속도를 높이기 위해 어떻게 활용되는지 이해했습니다. Dockerfile의 각 명령어는 레이어를 생성하며, Docker 는 명령어가 변경되지 않은 경우 캐시에서 기존 레이어를 재사용합니다.

그런 다음 빌드 캐시를 정리하는 다양한 방법을 살펴보았습니다. 더 이상 빌드와 연결되지 않은 캐시 항목을 의미하는 댕글링 (dangling) 빌드 캐시를 정리하는 방법을 배웠습니다. 또한 현재 어떤 이미지에서도 사용되지 않는 모든 캐시 항목을 효과적으로 정리하는, 사용하지 않는 모든 빌드 캐시를 정리하는 방법도 다루었습니다. 또한, 특정 기준에 따라 빌드 캐시를 선택적으로 제거하기 위해 prune 명령과 함께 필터를 사용하는 방법을 시연했습니다. 마지막으로, 특정 캐시 항목과 관련된 스토리지를 유지하면서 빌드 캐시를 정리하는 옵션을 살펴보았습니다. 이는 특정 시나리오에서 유용할 수 있습니다.