docker container prune 명령어를 사용하여 중지된 컨테이너 제거 방법

DockerBeginner
지금 연습하기

소개

이 랩에서는 docker container prune 명령을 사용하여 중지된 컨테이너를 효과적으로 관리하는 방법을 배우게 됩니다. 실제 시나리오를 시뮬레이션하기 위해 여러 컨테이너를 생성하고 중지하는 것으로 시작합니다. 그런 다음, 모든 컨테이너를 제거하는 방법, 특정 시간 이전에 생성된 컨테이너를 제거하는 방법, 레이블을 기반으로 컨테이너를 선택적으로 제거하는 방법을 포함하여 이러한 중지된 컨테이너를 정리하는 다양한 방법을 살펴봅니다. 이 실습 경험을 통해 Docker 시스템을 깨끗하고 최적화된 상태로 유지하는 기술을 습득할 수 있습니다.

컨테이너 생성 및 중지

이 단계에서는 Docker 컨테이너를 생성하고 중지하는 방법을 배우게 됩니다. Docker 컨테이너는 애플리케이션을 실행하는 데 필요한 모든 것을 포함하는 가볍고, 이식 가능하며, 자급자족하는 단위입니다.

먼저, 컨테이너를 생성하는 데 사용할 Docker 이미지를 가져와 보겠습니다. 최소한의 Ubuntu 운영 체제인 ubuntu 이미지를 사용합니다.

docker pull ubuntu

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

Using default tag: latest
latest: Pulling from library/ubuntu
...
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest

이제 이미지가 있으므로, 이를 사용하여 컨테이너를 생성하고 실행해 보겠습니다. docker run 명령을 사용합니다. -d 플래그는 컨테이너를 detached 모드 (백그라운드) 에서 실행하고, --name 플래그는 컨테이너에 이름을 할당합니다.

docker run -d --name my-ubuntu-container ubuntu sleep infinity

이 명령은 ubuntu 이미지에서 my-ubuntu-container라는 컨테이너를 생성하고, 그 안에서 sleep infinity 명령을 실행합니다. sleep infinity 명령은 컨테이너를 무기한으로 실행 상태로 유지합니다.

컨테이너 ID 인 긴 문자열을 출력으로 볼 수 있습니다.

<container_id>

컨테이너가 실행 중인지 확인하기 위해 docker ps 명령을 사용할 수 있습니다.

docker ps

이 명령은 실행 중인 모든 컨테이너를 나열합니다. my-ubuntu-container가 나열된 것을 볼 수 있습니다.

CONTAINER ID   IMAGE          COMMAND            CREATED         STATUS         PORTS     NAMES
<container_id>   ubuntu         "sleep infinity"   X seconds ago   Up X seconds             my-ubuntu-container

이제 다른 컨테이너를 생성해 보지만, 이번에는 특정 이름을 지정하지 않겠습니다. Docker 가 자동으로 이름을 생성합니다.

docker run -d ubuntu sleep infinity

다시, 컨테이너 ID 를 출력으로 볼 수 있습니다.

<container_id>

두 컨테이너가 실행 중인지 확인하기 위해 다시 docker ps를 실행합니다.

docker ps

이제 두 개의 컨테이너가 나열된 것을 볼 수 있습니다.

CONTAINER ID   IMAGE          COMMAND            CREATED         STATUS         PORTS     NAMES
<container_id>   ubuntu         "sleep infinity"   X seconds ago   Up X seconds             my-ubuntu-container
<container_id>   ubuntu         "sleep infinity"   X seconds ago   Up X seconds             <random_name>

이제 my-ubuntu-container라는 컨테이너를 중지해 보겠습니다. 컨테이너 이름 또는 ID 를 사용하여 docker stop 명령을 사용할 수 있습니다.

docker stop my-ubuntu-container

컨테이너가 중지되었음을 나타내는 컨테이너 이름을 출력으로 볼 수 있습니다.

my-ubuntu-container

다시 docker ps를 실행합니다. docker ps는 실행 중인 컨테이너만 표시하므로 my-ubuntu-container가 더 이상 나열되지 않습니다.

docker ps

중지된 컨테이너를 포함한 모든 컨테이너를 보려면 docker ps -a 명령을 사용합니다.

docker ps -a

이제 두 컨테이너를 모두 볼 수 있으며, my-ubuntu-container의 상태는 Exited입니다.

CONTAINER ID   IMAGE          COMMAND            CREATED         STATUS                      PORTS     NAMES
<container_id>   ubuntu         "sleep infinity"   X minutes ago   Exited (0) X seconds ago              my-ubuntu-container
<container_id>   ubuntu         "sleep infinity"   X minutes ago   Up X minutes                          <random_name>

마지막으로, 두 번째 컨테이너를 컨테이너 ID 를 사용하여 중지해 보겠습니다. ID 는 docker ps -a의 출력에서 얻을 수 있습니다. <container_id>를 두 번째 컨테이너의 실제 ID 로 바꿉니다.

docker stop <container_id>

컨테이너 ID 를 출력으로 볼 수 있습니다.

<container_id>

두 컨테이너가 모두 중지되었는지 확인하기 위해 마지막으로 docker ps -a를 실행합니다.

docker ps -a

이제 두 컨테이너 모두 상태가 Exited여야 합니다.

CONTAINER ID   IMAGE          COMMAND            CREATED         STATUS                      PORTS     NAMES
<container_id>   ubuntu         "sleep infinity"   X minutes ago   Exited (0) X seconds ago              my-ubuntu-container
<container_id>   ubuntu         "sleep infinity"   X minutes ago   Exited (0) X seconds ago              <random_name>

모든 중지된 컨테이너 정리 (Prune)

이전 단계에서 두 개의 컨테이너를 생성하고 중지했습니다. 중지된 컨테이너는 여전히 디스크 공간과 리소스를 소비합니다. 이 단계에서는 docker container prune 명령을 사용하여 중지된 모든 컨테이너를 제거하는 방법을 배우게 됩니다.

먼저, 제거할 컨테이너를 확인하기 위해 중지된 컨테이너를 포함한 모든 컨테이너를 나열해 보겠습니다.

docker ps -a

이전 단계에서 중지한 두 개의 컨테이너를 볼 수 있습니다.

CONTAINER ID   IMAGE          COMMAND            CREATED         STATUS                      PORTS     NAMES
<container_id>   ubuntu         "sleep infinity"   X minutes ago   Exited (0) X minutes ago              my-ubuntu-container
<container_id>   ubuntu         "sleep infinity"   X minutes ago   Exited (0) X minutes ago              <random_name>

이제 중지된 모든 컨테이너를 정리해 보겠습니다. docker container prune 명령은 중지된 모든 컨테이너를 제거합니다.

docker container prune

Docker 는 컨테이너를 제거하기 전에 확인을 요청합니다. y를 입력하고 Enter 키를 눌러 진행합니다.

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

제거된 컨테이너와 회수된 총 공간을 나타내는 출력을 볼 수 있습니다.

Deleted Containers:
<container_id>
<container_id>

Total reclaimed space: XMB

중지된 컨테이너가 제거되었는지 확인하기 위해 다시 모든 컨테이너를 나열합니다.

docker ps -a

이번에는 출력이 없어야 합니다. 즉, 컨테이너 (실행 중 또는 중지됨) 가 남아 있지 않음을 나타냅니다.

CONTAINER ID   IMAGE          COMMAND            CREATED         STATUS         PORTS     NAMES

특정 시간 이전 생성된 중지된 컨테이너 정리 (Prune)

이전 단계에서는 중지된 모든 컨테이너를 정리하는 방법을 배웠습니다. 때로는 특정 시간 이전에 생성된 중지된 컨테이너만 제거하고 싶을 수 있습니다. 이는 최신 컨테이너를 유지하면서 오래된 컨테이너를 정리하는 데 유용할 수 있습니다. 이 단계에서는 until 필터와 함께 --filter 플래그를 사용하여 특정 시간 이전에 생성된 중지된 컨테이너를 정리하는 방법을 배우게 됩니다.

먼저, 정리할 대상을 만들기 위해 몇 개의 컨테이너를 생성하고 중지해 보겠습니다.

docker run -d --name container-old-1 ubuntu sleep infinity
docker run -d --name container-old-2 ubuntu sleep infinity

몇 초 기다린 다음, 다른 컨테이너를 생성합니다. 이것이 우리의 "최신" 컨테이너가 될 것입니다.

sleep 5
docker run -d --name container-new-1 ubuntu sleep infinity

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

docker stop container-old-1 container-old-2 container-new-1

모든 컨테이너를 나열하여 상태와 생성 시간을 확인합니다.

docker ps -a --format "{{.Names}}\t{{.Status}}\t{{.CreatedAt}}"

다음과 유사한 출력을 볼 수 있으며, 생성 시간은 다릅니다.

container-old-1 Exited (0) X seconds ago YYYY-MM-DD HH:MM:SS +0000 UTC
container-old-2 Exited (0) X seconds ago YYYY-MM-DD HH:MM:SS +0000 UTC
container-new-1 Exited (0) X seconds ago YYYY-MM-DD HH:MM:SS +0000 UTC

이제 특정 시간 이전에 생성된 중지된 컨테이너를 정리해 보겠습니다. docker container prune 명령과 함께 until 필터를 사용합니다. until 필터는 타임스탬프 또는 기간을 사용합니다. 이 예에서는 기간을 사용하여 10 초 이상 전에 생성된 컨테이너를 제거하려고 지정합니다.

docker container prune --filter "until=10s"

Docker 는 확인을 요청합니다. y를 입력하고 Enter 키를 누릅니다.

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

오래된 컨테이너가 제거되었음을 나타내는 출력을 볼 수 있습니다. 최신 컨테이너는 삭제된 것으로 나열되지 않아야 합니다.

Deleted Containers:
<container_id_old_1>
<container_id_old_2>

Total reclaimed space: XMB

오래된 컨테이너만 제거되었는지 확인하기 위해 다시 모든 컨테이너를 나열합니다.

docker ps -a --format "{{.Names}}\t{{.Status}}"

container-new-1Exited 상태로 나열되는 것을 볼 수 있습니다.

container-new-1 Exited (0) X seconds ago

특정 레이블을 가진 중지된 컨테이너 정리 (Prune)

이전 단계에서는 모든 중지된 컨테이너와 생성 시간을 기준으로 중지된 컨테이너를 정리하는 방법을 배웠습니다. 이 단계에서는 정리를 위해 컨테이너를 필터링하는 또 다른 유용한 방법인 레이블 사용을 살펴보겠습니다. 레이블은 컨테이너를 포함한 Docker 객체에 연결하여 구성하고 관리할 수 있는 키 - 값 쌍입니다.

먼저, 서로 다른 레이블이 있는 몇 개의 컨테이너를 생성해 보겠습니다.

docker run -d --name container-label-app --label app=frontend ubuntu sleep infinity
docker run -d --name container-label-env --label env=development ubuntu sleep infinity
docker run -d --name container-no-label ubuntu sleep infinity

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

docker stop container-label-app container-label-env container-no-label

모든 컨테이너와 해당 레이블을 나열하여 적용한 레이블을 확인합니다.

docker ps -a --format "{{.Names}}\t{{.Labels}}"

다음과 유사한 출력을 볼 수 있습니다.

container-label-app app=frontend
container-label-env env=development
container-no-label

이제 app=frontend 레이블이 있는 중지된 컨테이너만 정리해 보겠습니다. label 필터와 함께 --filter 플래그를 사용합니다.

docker container prune --filter "label=app=frontend"

Docker 는 확인을 요청합니다. y를 입력하고 Enter 키를 누릅니다.

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

app=frontend 레이블이 있는 컨테이너가 제거되었음을 나타내는 출력을 볼 수 있습니다.

Deleted Containers:
<container_id_app_frontend>

Total reclaimed space: XMB

app=frontend 레이블이 있는 컨테이너만 제거되었는지 확인하기 위해 다시 모든 컨테이너를 나열합니다.

docker ps -a --format "{{.Names}}\t{{.Labels}}"

이제 env=development 레이블이 있는 컨테이너와 레이블이 없는 컨테이너만 볼 수 있습니다.

container-label-env env=development
container-no-label

또한 레이블 필터와 함께 ! 접두사를 사용하여 특정 레이블이 없는 컨테이너를 정리할 수도 있습니다. env=development 레이블이 없는 컨테이너를 정리해 보겠습니다.

docker container prune --filter "label!=env=development"

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

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

env=development 레이블이 없는 컨테이너가 제거되었음을 나타내는 출력을 볼 수 있습니다.

Deleted Containers:
<container_id_no_label>

Total reclaimed space: XMB

마지막으로 모든 컨테이너를 한 번 더 나열하여 env=development 레이블이 있는 컨테이너만 남아 있는지 확인합니다.

docker ps -a --format "{{.Names}}\t{{.Labels}}"

container-label-env만 나열되는 것을 볼 수 있습니다.

container-label-env env=development

요약

이 랩에서는 docker rundocker stop 명령을 사용하여 Docker 컨테이너를 생성하고 중지하는 방법과 docker ps를 사용하여 실행 중인 컨테이너를 나열하는 방법을 배웠습니다. 그런 다음, 중지된 컨테이너를 효율적으로 제거하기 위해 docker container prune 명령을 살펴보았습니다. 특히, 모든 중지된 컨테이너 정리, --filter until 옵션을 사용하여 특정 시간 이전에 생성된 중지된 컨테이너 제거, 그리고 --filter label 옵션을 사용하여 레이블을 기반으로 중지된 컨테이너를 선택적으로 제거하는 방법을 실습했습니다. 이러한 단계는 Docker 환경에서 중지된 컨테이너를 관리하고 정리하는 실용적인 방법을 보여주었습니다.