LainyZine: 프로그래머 가이드 🐣

Docker의 prune 사용법: 사용하지 않는 Docker 오브젝트 일괄 삭제

로컬 개발 용으로 Docker를 오랜 시간 사용하게 되면 여러가지 오브젝트들이 시스템에 쌓이게 됩니다. 컨테이너나 이미지는 많으면 수십 수백개까지도 늘어납니다. Docker 컨테이너, 이미지, 볼륨은 사용중이 아니더라도 디스크를 차지하고 있습니다. 네트워크도 많이 만들어지면 관리가 어려워집니다.

오브젝트들을 일일히 삭제하거나 통째로 날려버릴 수도 있습니다만, 사용하지 않는 오브젝트들을 파악해 빠르게 시스템 자원을 확보하는 방법도 있습니다. prune 서브 커맨드가 바로 이런 역할을 하며, Docker 오브젝트의 가비지 컬렉션이라고 할 수 있습니다. 이 글에서는 Docker의 prune 서브 커맨드 사용법을 소개합니다.

docker container prune: 사용하지 않는 컨테이너 일괄 삭제

docker에서 지원하는 prune 명령어는 여러가지 버전이 있습니다만, 먼저 container 버전의 명령어인 docker contanier prune부터 함께 살펴보겠습니다.

오브젝트 별로 prune으로 삭제하는 기준이 있습니다. Docker 컨테이너는 사실상 리눅스 프로세스입니다만, 컨테이너가 중지되더라도 Docker에서는 이를 바로 삭제하지 않습니다. 컨테이너 prune은 중지된 모든 컨테이너를 삭제해줍니다.

$ docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
a4365005d20a190be4a9227f49660e3183fabe968428d4707007a77757dd18a5
86ca9f5c7226dd63cc9120bf0b264fbcc90d7d1201be01cf99bc234d6943fd42
.....

Total reclaimed space: 67.06MB

중지된 컨테이너는 CPU나 메모리 같은 자원을 사용하지는 않습니다만, 모든 Docker 컨테이너는 고유한 디스크 영역(레이어)을 가지고 있기 때문에 컨테이너를 삭제해서 디스크 용량을 확보할 수 있습니다. 단, 중지된 컨테이너에 기록된 내용도 모두 삭제되기 때문에 주의가 필요합니다.

prune 명령어들에서 공통적으로 사용하는 옵션 중에 하나가 -f(--force)입니다. 이 옵션을 사용하면 사용자에게 정말로 삭제할지 물어보지 않고 바로 삭제를 합니다.

Docker 컨테이너 삭제 방법에 대해서는 다음 글에서 더 자세히 소개합니다.

filter 옵션: 특정 기준으로 삭제 대상을 필터링

docker container prune에는 filter 옵션이 있습니다. 이 옵션을 사용하면 특정 기준으로 삭제할 대상이 되는 Container의 대상을 필터링 할 수 있습니다. 현재 지원되는 필터링 키는 labeluntil 두 가지 입니다.

# 중지된 지 1시간 이상 지난 이미지만 삭제
$ docker container prune --filter until=1h

# env 키가 있는 이미지
$ docker container prune --filter label=env

# env 키가 없는 이미지
$ docker container prune --filter label!=env

# env 키의 값이 development인 이미지
$ docker container prune --filter label=env=development

# env 키의 값이 production이 아닌 이미지
$ docker container prune --filter label!=env=production

필터 규칙에 대한 더 자세한 정보는 공식 문서를 참고해주세요.

docker image prune: 사용하지 않는 이미지 삭제

docker image prune 명령어가 삭제하고자 하는 대상은 dangling된 이미지들입니다. 일반적으로 이미지는 이미지를 구분하기 위한 이름을 가지고 있습니다. dangling된 이미지는 해당 이미지를 지칭하는 이름이 없는 상태를 의미합니다. 예를 들어 같은 이름으로 도커 이미지를 여러번 빌드하다보면 새로 만들어진 이미지가 기존 이미지의 이름을 뺐어버려서, 기존 이미지는 dangling된 상태가 됩니다(이를 방지하려면 빌드 때마다 고유한 태그를 붙여서 이미지들을 잘 구분해주어야합니다).

보통 dangling된 이미지를 다시 사용하는 경우는 매우 드뭅니다. docker image prune은 바로 이러한 이미지들을 삭제해줍니다.

$ docker image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
Deleted Images:
deleted: sha256:e2a732492748a6ac8657ff9e9d2380b48cfa2cf505d345a17f5813a20cb70333

Total reclaimed space: 0B

docker image prune의 경우 dangling된 이미지 뿐만 아니라, 현재 컨테이너에서 사용하고 있지 않은 이미지들을 삭제하는 -a 옵션도 제공하고 있습니다. 이 옵션을 사용하면 좀 더 삭제 대상 범위가 넓어집니다.

$ docker image prune -a
WARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N]y
Deleted Images:
.....
deleted: sha256:80580270666742c625aecc56607a806ba343a66a8f5a7fd708e6c4e4c07a3e9b
untagged: nginx:alpine

Total reclaimed space: 2.168GB

Docker 이미지가 디스크를 많이 사용하고 있을 때 사용하면 한 번에 큰 용량을 확보하기에 용이합니다.

컨테이너와 마찬가지로 이미지 prune도 labeluntilfilter 옵션을 지원합니다. 이미지에서 until 필터는 특정 시간에 이전에 생성된 이미지를 대상으로 필터링해줍니다.

Docker 이미지 삭제 방법에 대해서는 다음 글에서 더 자세히 소개합니다.

docker vomule prune: 컨테이너에서 사용하지 않는 모든 볼륨 삭제

docker volume prune 명령어는 컨테이너와 연결되어있지 않은 모든 볼륨 오브젝트를 삭제해줍니다.

docker volume prune
WARNING! This will remove all local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Volumes:
.....
7fe351121082bd082ab681ac1d365637f8b753d8d9392c38a908665203aae3ef
f78869f5a85474c6f9e72191408ff4bca13f2903a9f1dd2fc441bd935efe8bc6

Total reclaimed space: 93.9MB

볼륨은 일반적으로 데이터 저장을 위해서 사용하기 때문에 용량을 확보하는 데 도움이 될 수 있습니다.

docker network prune: 컨테이너에서 사용하지 않는 모든 네트워크 삭제

docker network prune 명령어는 컨테이너와 연결되어있지 않은 모든 네트워크 오브젝트를 삭제해줍니다.

WARNING! This will remove all custom networks not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Networks:
custom_network

Docker 네트워크는 특별히 시스템 자원이나 디스크를 사용하는 것은 아닙니다만, 관리가 어려울 수 있으니 정리해두는 것을 추천합니다.

docker system prune: 사용하지 않는 Docker 오브젝트 전부 삭제

여기까지 컨테이너, 이미지, 볼륨, 네트워크 각각의 Docker 오브젝트에 대한 prune 명령어를 소개했습니다만, 이 모든 한 방에 해주는 docker system prune 명령어도 있습니다. 그냥 한 번에 정리하고 싶다면 이 명령어를 사용하시면 됩니다.

$ docker system prune --volumes

WARNING! This will remove:
        - all stopped containers
        - all networks not used by at least one container
        - all volumes not used by at least one container
        - all dangling images
        - all build cache
Are you sure you want to continue? [y/N] y

docker system prune에도 -a 옵션이 있는데, 이미지 prune의 -a 옵션과 같습니다. 즉, 컨테이너에서 사용하지 않는 이미지들도 같이 삭제해주는 옵셥니다.

추천 문서

LainyZine은 쿠팡 파트너스 활동에 따른 수수료를 제공받습니다.