docker system prune 명령어를 사용하여 디스크 공간 확보 방법

DockerBeginner
지금 연습하기

소개

이 랩에서는 사용하지 않는 Docker 데이터를 제거하여 디스크 공간을 효과적으로 확보하기 위해 docker system prune 명령어를 사용하는 방법을 배우게 됩니다. 먼저, docker system prune이 기본적으로 제거하는 항목을 이해하는 것으로 시작합니다. 여기에는 종료된 컨테이너, 댕글링 이미지 (dangling images), 댕글링 네트워크 (dangling networks) 가 포함되지만 볼륨 (volumes) 은 포함되지 않습니다.

그 다음, 볼륨을 특별히 제외하면서 사용하지 않는 Docker 데이터를 정리하는 방법을 살펴보고, 익명 볼륨 (anonymous volumes) 을 포함한 모든 사용하지 않는 데이터를 제거하는 방법을 배웁니다. 마지막으로, docker system prune과 함께 필터를 사용하여 제거할 데이터에 대한 더 세분화된 제어를 얻는 방법을 알아보겠습니다.

docker system prune 의 기본 삭제 대상 이해

이 단계에서는 docker system prune 명령어를 살펴보고, 이 명령어가 기본적으로 어떤 유형의 사용하지 않는 Docker 데이터를 제거하는지 이해합니다. 이 명령어는 댕글링 (dangling) 또는 사용하지 않는 객체를 제거하여 디스크 공간을 정리하는 데 유용합니다.

먼저, 사용하지 않는 Docker 객체를 몇 개 생성해 보겠습니다. 간단한 컨테이너를 실행한 다음 중지합니다. 이렇게 하면 종료된 컨테이너와, 이미지가 다른 컨테이너에서 사용되지 않는 경우 댕글링 이미지가 남게 됩니다.

LabEx 환경에서 터미널을 엽니다. 기본 디렉토리는 ~/project입니다.

간단한 hello-world 컨테이너를 실행합니다.

docker run hello-world

Docker 데몬이 hello-world 이미지를 풀 (pull) 하고 컨테이너를 실행했음을 나타내는 출력을 볼 수 있습니다. 컨테이너는 메시지를 출력한 직후 종료됩니다.

이제 종료된 컨테이너를 포함하여 모든 컨테이너를 나열합니다.

docker ps -a

"Exited" 상태로 hello-world 컨테이너가 나열된 것을 볼 수 있습니다.

다음으로, 이미지를 나열해 보겠습니다.

docker images

hello-world 이미지를 볼 수 있습니다.

이제 옵션 없이 docker system prune 명령어를 실행해 보겠습니다. 이 명령어는 댕글링 이미지, 댕글링 컨테이너 및 댕글링 네트워크를 제거합니다. 기본적으로 볼륨은 제거하지 않습니다.

docker system prune -f

확인 프롬프트 없이 강제로 제거하기 위해 -f 플래그를 사용합니다.

명령어를 실행한 후, 제거된 항목을 나타내는 출력을 볼 수 있습니다.

이제 컨테이너를 다시 확인해 보겠습니다.

docker ps -a

종료된 hello-world 컨테이너가 사라져야 합니다.

이미지를 다시 확인합니다.

docker images

hello-world 이미지가 "댕글링"으로 간주되지 않는 경우 (예: 최근에 풀된 경우) 여전히 존재할 수 있습니다. 그러나 다른 댕글링 이미지가 있었다면 제거되었을 것입니다.

여기서 핵심은 docker system prune이 기본적으로 종료된 컨테이너, 댕글링 이미지 및 댕글링 네트워크를 정리한다는 것입니다. 명시적으로 지시하지 않는 한 볼륨을 제거하지 않습니다.

볼륨을 제거하지 않고 사용하지 않는 Docker 데이터 정리

이전 단계에서 docker system prune이 기본적으로 볼륨을 제거하지 않는다는 것을 확인했습니다. 볼륨은 Docker 컨테이너에서 생성되고 사용되는 데이터를 지속하는 데 사용됩니다. 볼륨을 의도치 않게 제거하면 데이터 손실로 이어질 수 있습니다.

이 단계에서는 볼륨을 제거하지 않고 docker system prune이 어떻게 작동하는지 보여줍니다. 볼륨을 생성하고, 이를 사용하는 컨테이너를 실행하고, 컨테이너를 중지한 다음 시스템을 정리합니다. 정리 후에도 볼륨이 유지되는 것을 관찰할 것입니다.

먼저, 명명된 볼륨을 생성해 보겠습니다. 명명된 볼륨은 Docker 에서 명시적으로 생성되고 관리됩니다.

docker volume create myvolume

생성된 볼륨의 이름을 출력으로 볼 수 있습니다.

이제 이 볼륨을 사용하는 간단한 컨테이너를 실행해 보겠습니다. ubuntu 이미지를 사용합니다. 로컬에 없는 경우 Docker 가 풀 (pull) 합니다.

docker run -d --name mycontainer -v myvolume:/app ubuntu sleep 60

이 명령어는 분리 모드 (-d) 로 ubuntu 컨테이너를 실행하고, 이름을 mycontainer로 지정하고, myvolume을 컨테이너 내부의 /app 디렉토리에 마운트하고, sleep 60 명령어를 사용하여 컨테이너를 60 초 동안 실행 상태로 유지합니다.

컨테이너가 실행 중인지 확인합니다.

docker ps

mycontainer가 나열된 것을 볼 수 있습니다.

이제 컨테이너를 중지합니다.

docker stop mycontainer

컨테이너는 중지되지만 종료된 상태로 계속 존재합니다.

컨테이너가 중지되었는지 확인합니다.

docker ps -a

"Exited" 상태의 mycontainer를 볼 수 있습니다.

이제 볼륨을 나열해 보겠습니다.

docker volume ls

myvolume이 나열된 것을 볼 수 있습니다.

이제 docker system prune을 다시 실행합니다. 기억하세요, 기본적으로 볼륨을 제거하지 않습니다.

docker system prune -f

출력을 관찰합니다. 종료된 컨테이너가 제거되었음을 나타내지만, 볼륨 제거에 대해서는 언급하지 않아야 합니다.

컨테이너가 사라졌는지 확인합니다.

docker ps -a

mycontainer가 더 이상 나열되지 않아야 합니다.

마지막으로, 볼륨이 여전히 존재하는지 확인합니다.

docker volume ls

myvolume이 여전히 나열된 것을 볼 수 있습니다. 이는 docker system prune이 기본적으로 볼륨을 보존한다는 것을 확인합니다.

익명 볼륨을 포함한 사용하지 않는 모든 Docker 데이터 정리

이전 단계에서 docker system prune이 기본적으로 볼륨을 제거하지 않는다는 것을 배웠습니다. 그러나 더 이상 컨테이너와 연결되지 않은 볼륨을 포함하여 사용하지 않는 모든 Docker 데이터를 제거하려는 경우가 있습니다. 이는 특히 볼륨 이름을 명시적으로 지정하지 않고 컨테이너 내부에 디렉토리를 마운트할 때 생성되는 익명 볼륨을 정리하는 데 유용합니다.

볼륨을 포함하여 사용하지 않는 모든 Docker 데이터를 제거하려면 docker system prune과 함께 -a 플래그를 사용할 수 있습니다. -a 플래그는 "all"을 의미하며 정리 프로세스에 볼륨을 포함합니다.

컨테이너를 실행하고 볼륨 이름을 지정하지 않고 디렉토리를 마운트하여 익명 볼륨을 생성해 보겠습니다.

docker run -d --name anothercontainer -v /data ubuntu sleep 60

이 명령어는 anothercontainer라는 이름의 ubuntu 컨테이너를 실행하고 익명 볼륨을 컨테이너 내부의 /data 디렉토리에 마운트합니다.

컨테이너가 실행 중인지 확인합니다.

docker ps

anothercontainer가 나열된 것을 볼 수 있습니다.

이제 컨테이너를 중지합니다.

docker stop anothercontainer

컨테이너가 중지되고 종료된 컨테이너가 됩니다.

컨테이너가 중지되었는지 확인합니다.

docker ps -a

"Exited" 상태의 anothercontainer를 볼 수 있습니다.

이제 볼륨을 나열합니다.

docker volume ls

이전 단계에서 생성한 myvolume과 긴 임의로 생성된 이름의 새 볼륨을 볼 수 있습니다. 이것이 익명 볼륨입니다.

이제 -a 플래그를 사용하여 docker system prune을 실행하여 볼륨을 포함한 사용하지 않는 모든 데이터를 제거합니다.

docker system prune -a -f

-a를 사용하여 볼륨을 포함하고, -f를 사용하여 확인 프롬프트 없이 강제로 제거합니다.

출력을 주의 깊게 관찰합니다. 종료된 컨테이너가 제거되었음을 나타내야 하며, 제거된 익명 볼륨도 나열해야 합니다. 이전 단계에서 생성한 명명된 볼륨 myvolume도 더 이상 컨테이너에서 사용되지 않으므로 제거되어야 합니다.

모든 컨테이너가 사라졌는지 확인합니다.

docker ps -a

나열된 컨테이너가 없어야 합니다.

마지막으로, 모든 볼륨이 사라졌는지 확인합니다.

docker volume ls

나열된 볼륨이 없어야 합니다. 이는 docker system prune -a가 명명된 볼륨과 익명 볼륨을 포함하여 사용하지 않는 모든 Docker 데이터를 제거한다는 것을 확인합니다.

필터를 사용하여 Docker 데이터 정리

사용하지 않는 모든 데이터를 제거하는 것 외에도, docker system prune을 사용하면 필터를 사용하여 Docker 객체를 선택적으로 제거할 수 있습니다. 이를 통해 정리할 항목에 대해 더 세분화된 제어가 가능합니다.

필터는 다양한 유형의 객체에 적용할 수 있습니다. docker system prune의 경우, 객체의 사용 기간과 같은 기준에 따라 필터링할 수 있습니다.

필터링을 시연하기 위해 몇 가지 Docker 객체를 더 생성해 보겠습니다. 몇 개의 컨테이너를 실행한 다음 중지합니다.

첫 번째 컨테이너를 실행합니다.

docker run -d --name oldcontainer ubuntu sleep 10

이 컨테이너는 10 초 동안 실행된 후 종료됩니다.

두 번째 컨테이너를 실행합니다.

docker run -d --name newcontainer ubuntu sleep 20

이 컨테이너는 20 초 동안 실행된 후 종료됩니다.

두 컨테이너가 모두 종료될 때까지 기다립니다. docker ps -a로 상태를 확인할 수 있습니다.

docker ps -a

"Exited" 상태의 oldcontainernewcontainer를 모두 볼 수 있습니다.

이제 필터를 사용하여 특정 시간보다 오래된 객체만 제거해 보겠습니다. 기간과 함께 until 필터를 사용할 수 있습니다. 예를 들어, 5 초 이상 된 객체를 제거하려면 until=5s를 사용할 수 있습니다.

15 초 이상 된 객체를 정리해 보겠습니다. 이렇게 하면 oldcontainer가 제거되지만 newcontainer는 유지됩니다 (충분히 기다려서 oldcontainer는 종료되었지만 newcontainer는 아직 종료되지 않았다고 가정).

docker system prune -f --filter "until=15s"

출력을 관찰합니다. oldcontainer가 제거되었지만 newcontainer는 남아 있어야 합니다.

컨테이너를 확인합니다.

docker ps -a

newcontainer가 나열되어 있지만 oldcontainer는 사라져야 합니다.

이제 다시 정리합니다. 이번에는 30 초 이상 된 객체를 제거합니다. 이렇게 하면 newcontainer도 제거됩니다.

docker system prune -f --filter "until=30s"

출력을 관찰합니다. newcontainer가 제거되었음을 나타내야 합니다.

컨테이너를 다시 확인합니다.

docker ps -a

나열된 컨테이너가 없어야 합니다.

필터는 정리 프로세스를 사용자 정의하는 강력한 방법을 제공합니다. 정리하려는 객체의 유형 (컨테이너, 이미지, 볼륨, 네트워크) 에 따라 다른 필터 키를 사용할 수 있습니다. until 필터는 특정 기간 동안 사용되지 않은 객체를 정리하는 데 일반적으로 사용됩니다.

요약

이 랩에서는 사용하지 않는 Docker 데이터를 제거하여 디스크 공간을 확보하기 위해 docker system prune 명령을 사용하는 방법을 배웠습니다. 먼저, 종료된 컨테이너, 댕글링 이미지 (dangling images), 댕글링 네트워크 (dangling networks) 를 제거하는 docker system prune의 기본 동작을 이해했습니다. 종료된 컨테이너를 생성한 다음 제거하여 이를 시연했습니다.

그런 다음, 제거할 데이터를 제어하기 위해 옵션과 함께 docker system prune을 사용하는 방법을 살펴보았습니다. 볼륨을 제거하지 않고 사용하지 않는 데이터를 정리하는 방법과 정리 프로세스에 익명 볼륨을 포함하는 방법을 배웠습니다. 마지막으로, 특정 기준에 따라 Docker 데이터를 선택적으로 정리하기 위해 필터를 사용하는 방법에 대해 간략하게 다루었습니다. 이 랩은 Docker 환경에서 디스크 공간을 효과적으로 관리하기 위해 docker system prune을 사용하는 실질적인 경험을 제공했습니다.