docker image prune 명령어를 사용하여 사용하지 않는 이미지 제거 방법

DockerBeginner
지금 연습하기

소개

이 랩에서는 docker image prune 명령어를 사용하여 사용하지 않는 Docker 이미지를 제거함으로써 디스크 공간을 효과적으로 관리하는 방법을 배우게 됩니다. 먼저 이 명령어의 목적과 대상이 되는 다양한 유형의 사용하지 않는 이미지, 특히 댕글링 이미지 (dangling images) 와 모든 사용하지 않는 이미지에 대해 이해하는 것으로 시작합니다.

실습을 통해 댕글링 이미지를 제거하는 연습을 하고, 이를 확장하여 모든 사용하지 않는 이미지를 제거하는 방법을 배우게 됩니다. 또한, 생성 시간 및 레이블 (labels) 과 같은 기준에 따라 이미지를 선택적으로 제거하기 위해 docker image prune과 함께 필터링 옵션을 사용하는 방법을 탐구하여 이미지 정리 프로세스를 세밀하게 제어할 수 있도록 합니다.

docker image prune 의 목적 이해

이 단계에서는 docker image prune 명령어의 목적을 이해합니다. Docker 를 사용하다 보면 시스템에 사용하지 않는 이미지가 불가피하게 누적됩니다. 이러한 이미지는 상당한 디스크 공간을 차지할 수 있습니다. docker image prune 명령어는 이러한 사용하지 않는 이미지를 제거하여 디스크 공간을 확보하는 데 사용됩니다.

docker image prune이 대상으로 하는 사용하지 않는 이미지에는 두 가지 주요 유형이 있습니다.

  1. 댕글링 이미지 (Dangling images): 이는 태그가 없고, 컨테이너에 의해 참조되지 않는 이미지입니다. 본질적으로 더 이상 필요하지 않은 중간 레이어입니다.
  2. 모든 사용하지 않는 이미지 (All unused images): 이는 댕글링 이미지뿐만 아니라 태그가 있더라도 컨테이너에 의해 참조되지 않는 이미지를 포함합니다.

docker image prune이 어떻게 작동하는지 확인하기 위해 몇 가지 댕글링 이미지를 생성하는 것으로 시작해 보겠습니다. ubuntu 이미지의 여러 버전을 풀 (pull) 한 다음, 그 중 하나를 기반으로 새 이미지를 빌드합니다. 이 프로세스는 종종 댕글링 이미지를 남깁니다.

먼저, ubuntu:latestubuntu:18.04 이미지를 풀합니다.

docker pull ubuntu:latest
docker pull ubuntu:18.04

이미지가 풀되고 있음을 나타내는 출력을 볼 수 있습니다.

이제 ubuntu:latest를 기반으로 간단한 이미지를 빌드해 보겠습니다. ~/project 디렉토리에 다음 내용으로 Dockerfile이라는 파일을 생성합니다.

FROM ubuntu:latest
RUN echo "Hello, Docker!" >/app/hello.txt

이 Dockerfile 은 단순히 ubuntu:latest 이미지에서 시작하여 /app 디렉토리에 hello.txt라는 파일을 추가합니다.

이제 docker build 명령어를 사용하여 이미지를 빌드합니다. 이 이미지에 태그를 지정하지 않으므로 댕글링 이미지가 생성됩니다.

docker build -t my-ubuntu-app ~/project

빌드 프로세스를 나타내는 출력을 볼 수 있습니다. 빌드가 완료된 후, 중간 이미지를 포함하여 모든 이미지를 나열하여 댕글링 이미지가 있는지 확인해 보겠습니다.

docker images -a

REPOSITORYTAG 열에서 <none>이 있는 이미지를 찾습니다. 이것이 댕글링 이미지입니다.

docker image prune 명령어는 기본적으로 이러한 댕글링 이미지를 제거하도록 설계되었습니다. 다음 단계에서는 이 명령어를 사용하여 방금 생성한 댕글링 이미지를 정리합니다.

docker image prune 을 사용하여 댕글링 이미지 제거

이전 단계에서는 특정 태그 없이 이미지를 빌드하여 몇 가지 댕글링 이미지를 생성했습니다. 이 단계에서는 docker image prune 명령어를 사용하여 이러한 댕글링 이미지를 제거합니다.

기본적으로 docker image prune은 댕글링 이미지만 제거합니다. 이는 현재 실행 중인 컨테이너와 연결되어 있지 않더라도, 여전히 필요할 수 있는 이미지를 실수로 제거하지 않고 사용하지 않는 이미지 레이어를 정리하는 가장 안전한 방법입니다.

댕글링 이미지를 제거하려면, 단순히 docker image prune 명령어를 실행합니다.

docker image prune

이 명령어를 실행하면 Docker 는 제거할 댕글링 이미지 목록을 표시하고 확인을 요청합니다.

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

y를 입력하고 Enter 키를 눌러 제거를 진행합니다.

명령어가 완료되면, 확보된 총 공간의 양을 보고합니다.

이제, 댕글링 이미지가 제거되었는지 확인하기 위해, 중간 이미지를 포함하여 모든 이미지를 다시 나열해 보겠습니다.

docker images -a

docker image prune을 실행하기 전에 REPOSITORYTAG 열에 <none>이 있던 이미지가 더 이상 표시되지 않아야 합니다. ubuntu:latest, ubuntu:18.04, 및 my-ubuntu-app 이미지는 댕글링 이미지가 아니므로 여전히 존재해야 합니다.

이는 댕글링 이미지를 제거하기 위한 docker image prune의 기본적인 사용법을 보여줍니다. Docker 호스트의 디스크 공간을 확보하기 위해 주기적으로 수행하는 것이 좋습니다.

docker image prune -a 를 사용하여 사용하지 않는 모든 이미지 제거

이전 단계에서는 docker image prune을 사용하여 댕글링 이미지를 제거하는 방법을 배웠습니다. 댕글링 이미지를 제거하는 것은 유용하지만, 현재 컨테이너에서 사용되지 않지만 댕글링 상태가 아닌 (즉, 태그가 있는) 다른 이미지가 시스템에 있을 수 있습니다. 이러한 이미지도 제거하려면 docker image prune과 함께 -a (또는 --all) 플래그를 사용할 수 있습니다.

docker image prune -a 명령어는 댕글링 이미지뿐만 아니라 모든 사용하지 않는 이미지를 제거합니다. 이는 더 적극적인 정리 방법이며, 현재 실행 중인 컨테이너와 연결되지 않은 모든 이미지를 제거하므로 주의해서 사용해야 합니다.

이것이 어떻게 작동하는지 살펴보겠습니다. 먼저, 현재 가지고 있는 이미지를 나열해 보겠습니다.

docker images

ubuntu:latest, ubuntu:18.04, 및 my-ubuntu-app를 볼 수 있습니다. 이러한 이미지는 현재 실행 중인 컨테이너에서 사용되지 않지만, 태그가 있기 때문에 댕글링 상태가 아닙니다.

이제 docker image prune -a 명령어를 실행합니다.

docker image prune -a

이전 단계와 마찬가지로, Docker 는 제거할 이미지 목록을 표시하고 확인을 요청합니다.

WARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N]

y를 입력하고 Enter 키를 눌러 진행합니다.

명령어가 완료되면, 확보된 총 공간의 양을 보고합니다.

이제, 어떤 이미지가 남아 있는지 확인하기 위해 이미지를 다시 나열합니다.

docker images

실행 중인 컨테이너와 연결되지 않은 모든 이미지가 제거되었음을 확인할 수 있습니다. 실행 중인 컨테이너가 있는 경우, 해당 컨테이너에서 사용되는 이미지는 제거되지 않습니다.

docker image prune -a를 사용하는 것은 상당한 양의 디스크 공간을 확보하는 강력한 방법이지만, 현재 사용하지 않는 모든 이미지를 제거한다는 점을 기억해야 합니다.

생성 시간을 기준으로 prune 할 이미지 필터링

docker image prune은 모든 사용하지 않는 이미지를 제거하는 것 외에도, 다양한 기준에 따라 정리할 이미지를 필터링할 수 있습니다. 유용한 필터 중 하나는 이미지의 생성 시간을 기반으로 합니다. 이를 통해 특정 시점 이전에 생성된 이미지를 제거할 수 있습니다.

--filter 플래그는 필터를 적용하는 데 사용됩니다. 생성 시간으로 필터링하려면 until 필터를 사용합니다. until 필터는 타임스탬프 또는 기간을 값으로 사용합니다. 지정된 시간 이후에 생성된 이미지는 유지되고, 지정된 시간 이전 또는 해당 시점에 생성된 이미지는 정리 대상으로 간주됩니다.

먼저, 서로 다른 생성 시간을 가진 몇 개의 이미지를 가져와 보겠습니다. alpine:latestcentos:latest를 가져오겠습니다.

docker pull alpine:latest
docker pull centos:latest

이제 이미지를 나열하고 생성 시간을 확인해 보겠습니다.

docker images

각 이미지의 CREATED 열을 확인하십시오.

시간별 필터링을 시연하려면 기준점이 필요합니다. 5 분 이상 전에 생성된 이미지를 제거하려는 경우를 가정해 보겠습니다. 5m과 같은 기간으로 until 필터를 지정할 수 있습니다.

docker image prune -a --filter "until=5m"

이 명령어는 5 분 이상 전에 생성된 모든 사용하지 않는 이미지를 제거하는 것을 고려합니다. Docker 는 다시 진행하기 전에 확인을 요청합니다.

WARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N]

y를 입력하고 Enter 키를 눌러 확인합니다.

정리 후, 이미지를 다시 나열합니다.

docker images

이미지를 가져오고 정리 명령어를 실행한 시간에 따라 일부 이미지가 제거되었을 수 있습니다. 지난 5 분 이내에 생성된 이미지는 유지되어야 합니다.

다양한 형식으로 특정 타임스탬프를 지정할 수도 있습니다. 예를 들어, 특정 날짜 및 시간 이전에 생성된 이미지를 제거하려면 "2023-10-27T10:00:00"과 같은 형식을 사용할 수 있습니다.

생성 시간별 필터링은 정리 작업을 자동화하고, 시스템에 비교적 최근의 이미지만 유지하는 데 유용합니다.

레이블을 기반으로 prune 할 이미지 필터링

이 마지막 단계에서는 docker image prune에 대한 또 다른 강력한 필터링 옵션인 레이블을 기반으로 필터링하는 방법을 살펴보겠습니다. 레이블은 이미지와 같은 Docker 객체에 연결하여 메타데이터를 추가할 수 있는 키 - 값 쌍입니다. 그런 다음 이러한 레이블을 사용하여 Docker 리소스를 필터링하고 관리할 수 있습니다.

label 키가 있는 --filter 플래그를 사용하면 레이블을 기반으로 정리 프로세스에 포함하거나 제외할 이미지를 지정할 수 있습니다.

먼저, 서로 다른 레이블을 가진 몇 개의 이미지를 만들어 보겠습니다. 간단한 Dockerfile 을 사용하고 서로 다른 레이블로 두 개의 이미지를 빌드합니다.

~/project 디렉토리에 다음 내용으로 Dockerfile.labeled라는 파일을 만듭니다.

FROM alpine:latest
LABEL environment="development"
LABEL version="1.0"
RUN echo "This is a labeled image" >/app/info.txt

이제 이 Dockerfile 에서 두 개의 이미지를 빌드하고 --label 플래그를 사용하여 빌드 프로세스 중에 서로 다른 레이블을 적용합니다.

docker build -t my-labeled-app:dev --label project=myapp --label stage=dev ~/project -f Dockerfile.labeled
docker build -t my-labeled-app:prod --label project=myapp --label stage=prod ~/project -f Dockerfile.labeled

이제 동일한 Dockerfile 을 기반으로 하지만 서로 다른 stage 레이블을 가진 두 개의 이미지, my-labeled-app:devmy-labeled-app:prod를 빌드했습니다.

이미지를 나열하고 레이블을 검사해 보겠습니다.

docker images --filter reference="my-labeled-app*" --format "{{.Repository}}:{{.Tag}} {{.Labels}}"

이미지와 관련 레이블을 보여주는 출력을 볼 수 있습니다.

이제 docker image prune을 사용하여 레이블을 기반으로 이미지를 제거해 보겠습니다. stage=dev 레이블이 있는 모든 사용하지 않는 이미지를 제거하려는 경우를 가정해 보겠습니다. --filter 플래그를 label=stage=dev와 함께 사용할 수 있습니다. 또한 댕글링 이미지뿐만 아니라 모든 사용하지 않는 이미지를 고려하기 위해 -a 플래그도 사용합니다.

docker image prune -a --filter "label=stage=dev"

Docker 는 필터와 일치하고 제거될 이미지를 표시합니다. y를 입력하여 확인합니다.

정리 후, 이미지를 다시 나열합니다.

docker images --filter reference="my-labeled-app*" --format "{{.Repository}}:{{.Tag}} {{.Labels}}"

my-labeled-app:dev 이미지가 제거되었고, my-labeled-app:prod는 필터와 일치하지 않으므로 남아 있는 것을 볼 수 있습니다.

label!=key=value 구문을 사용하여 특정 레이블 또는 레이블 값을 가지지 않은 이미지를 제거할 수도 있습니다. 예를 들어, stage=prod 레이블을 가지지 않은 모든 사용하지 않는 이미지를 제거하려면 다음과 같이 합니다.

docker image prune -a --filter "label!=stage=prod"

이 명령어는 my-labeled-app:dev (아직 존재하는 경우) 와 stage=prod 레이블이 없는 다른 사용하지 않는 이미지를 제거합니다.

레이블별 필터링은 자체적으로 정의된 메타데이터를 기반으로 이미지를 관리하고 정리하는 유연한 방법을 제공합니다.

요약

이 랩에서는 사용하지 않는 Docker 이미지를 제거하여 디스크 공간을 관리하기 위해 docker image prune 명령어를 사용하는 방법을 배웠습니다. 먼저, 명령어의 목적과 대상이 되는 사용하지 않는 이미지 유형 (댕글링 이미지 (태그가 없고 참조되지 않은 이미지) 및 모든 사용하지 않는 이미지 (태그가 있지만 참조되지 않은 이미지 포함)) 을 이해했습니다. 그런 다음 기본 docker image prune 명령어를 사용하여 댕글링 이미지를 식별하고 제거하는 연습을 했습니다.

-a 플래그를 사용하여 모든 사용하지 않는 이미지를 제거하는 방법을 배우면서 docker image prune의 기능을 더 탐구했습니다. 마지막으로, 생성 시간 및 레이블과 같은 기준에 따라 이미지를 선택적으로 정리하는 필터링 옵션을 사용하여 이미지 정리에 대한 더 세분화된 제어를 제공하는 방법을 배웠습니다.