LainyZine: 프로그래머 가이드 🐣

docker rm 사용법: Docker 컨테이너를 삭제하는 방법

Docker는 컨테이너를 실행하고 관리할 수 있게 도와주는 도구입니다. Docker 공부를 하거나 여러가지 작업을 하다보면 컨테이너들이 점점 쌓여가기만 합니다. 이번 글에서는 도커 컨테이너들을 하나씩 삭제하거나 한꺼번에 삭제하는 유용한 방법들을 소개합니다.

Docker 컨테이너를 삭제하는 방법

Docke를 사용하면 docker run 명령어를 사용해서 컨테이너를 실행할 수 있습니다. nginx 컨테이너가 몇 개 실행되어있는 상황을 가정해보겠습니다.

$ docker run -d --name nginx1 nginx:latest
$ docker run -d --name nginx2 nginx:latest
$ docker run -d --name nginx3 nginx:latest
$ docker run -d nginx:latest

docker ps 명령어로 현재 실행중인 Docker 컨테이너들의 목록을 확인해봅니다.

# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED              STATUS              PORTS     NAMES
7eaad4047599   nginx:latest   "/docker-entrypoint.…"   4 seconds ago        Up 3 seconds        80/tcp    gracious_wozniak
fa730b536edc   nginx:latest   "/docker-entrypoint.…"   56 seconds ago       Up 55 seconds       80/tcp    nginx3
64526b142e50   nginx:latest   "/docker-entrypoint.…"   About a minute ago   Up About a minute   80/tcp    nginx2
fb7cc1ea2f85   nginx:latest   "/docker-entrypoint.…"   About a minute ago   Up About a minute   80/tcp    nginx1

이렇게 실행된 Docker 컨테이너들은 리눅스 위에서 프로세스로서 동작합니다. 따라서 시스템 상의 CPU와 메모리 자원을 사용합니다. macOS나 Windows 위에서 가상화된 환경에서 실행하더라도 시스템의 자원을 사용하는 것은 다르지 않습니다. 컨테이너 작업을 하다보면 Docker 컨테이너가 하염없이 쌓여만 가는데 필요 없는 프로세스를 kill하는 것처럼, 사용하지 않는 컨테이너도 삭제하는 것이 좋습니다.

docker rm: 컨테이너 삭제 명령어

docker rm 서브 커맨드로 컨테이너를 삭제할 수 있습니다. 컨테이너를 삭제하는 명령어는 docker run보다 훨씬 간단합니다. 기본 사용법은 아래와 같습니다.

# 컨테이너 ID 값으로 삭제
docker rm [CONTAINER_ID]

# 컨테이너 이름으로 삭제
docker rm [CONTAINER_NAME]

예를 들어 앞에서 nginx1 이름을 지정한 컨테이너를 삭제해보겠습니다.

$ docker rm nginx1
Error response from daemon: You cannot remove a running container fb7cc1ea2f858191a669464fd414e74453b5235bb8c5c79b31a7596f3c8696bc. Stop the container before attempting removal or force remove

안타깝게도 Error 메시지와 함께 삭제가 실패했습니다. 메시지를 잘 읽어보면 실패한 원인을 파악할 수 있습니다. nginx1은 실행중인 컨테이너라서 삭제가 불가능합니다. 이 문제를 해결하려면 먼저 컨테이너를 중지하거나, 강제로 삭제를 해야합니다.

먼저 정석대로 컨테이너를 중지하고 삭제를 해보겠습니다.

$ docker stop nginx1
nginx1
$ docker rm nginx1
nginx1

$ docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS     NAMES
7eaad4047599   nginx:latest   "/docker-entrypoint.…"   5 minutes ago   Up 5 minutes   80/tcp    gracious_wozniak
fa730b536edc   nginx:latest   "/docker-entrypoint.…"   6 minutes ago   Up 6 minutes   80/tcp    nginx3
64526b142e50   nginx:latest   "/docker-entrypoint.…"   7 minutes ago   Up 7 minutes   80/tcp    nginx2

더 이상 docker ps 결과에 nginx1 컨테이너가 보이지 않습니다.

컨테이너 ID를 사용해서 컨테이너를 삭제하는 것도 물론 가능합니다. 앞선 예제에서 네 번째 컨테이너를 실행할 때는 의도적으로 컨테이너의 이름을 지정하지 않았습니다. docker ps의 출력 결과에서 이 컨테이너를 자세히 보면 컨테이너 ID가 있고, 이름(gracious_wozniak)도 임의로 부여된 것을 알 수 있습니다.

CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS     NAMES
7eaad4047599   nginx:latest   "/docker-entrypoint.…"   5 minutes ago   Up 5 minutes   80/tcp    gracious_wozniak

무작위로 생성된 이름이나, ID를 사용하면 컨테이너를 삭제할 수 있습니다. 이 때 컨테이너 ID는 다른 컨테이너와 구분될만한 길이면 충분합니다. 16진수 값 전체를 입력하기는 번거롭기 때문에 보통 앞의 4~5자를 잘라서 사용합니다.

$ docker stop 7eaad
7eaad
$ docker rm 7eaad
7eaad

$ docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS     NAMES
fa730b536edc   nginx:latest   "/docker-entrypoint.…"   6 minutes ago   Up 6 minutes   80/tcp    nginx3
64526b142e50   nginx:latest   "/docker-entrypoint.…"   7 minutes ago   Up 7 minutes   80/tcp    nginx2

7eaad4047599 컨테이너가 잘 삭제된 것을 확인할 수 있습니다.

docker rm -f: 실행중인 컨테이너 강제 삭제 명령어

실행중인 컨테이너를 삭제하는 두 번째 방법은 docker rm 서브 커맨드에 -f 옵션을 사용하는 방법입니다. 이번에는 실행중인 nginx2 컨테이너를 명령어 하나로 삭제해보겠습니다.

$ docker rm -f nginx2
nginx2

$ docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS     NAMES
fa730b536edc   nginx:latest   "/docker-entrypoint.…"   8 minutes ago   Up 8 minutes   80/tcp    nginx3

바로 nginx2 컨테이너가 삭제된 것을 확인할 수 있습니다. -f 옵션을 사용하면 컨테이너를 강제로 종료시키고, 삭제해버립니다. 프로덕션 환경에서는 먼저 stop을 명시적으로 실행하고, 컨테이너를 삭제하기 바랍니다. 개발 환경에서는 -f 옵션을 사용해서 컨테이너를 종료해도 문제되는 경우는 많지 않습니다.

docker container rm: 컨테이너를 삭제하는 또 다른 명령어

Docker가 업데이트 되면서 오브젝트 타입 별 서브 커맨드들이 추가되었습니다. 예를 들어 docker rm은 컨테이너만을 삭제하는 명령어지만, Docker에서는 이미지, 컨테이너, 볼륨, 네트워크 등 삭제 가능한 오브젝트 타입이 다수 존재하기 때문에 무엇을 지우는 명령어인지 헷갈릴 수 있습니다. 그래서 컨테이너를 조작한다는 의미가 강조된 container 서브 커맨드 아래에 rm 커맨드가 추가되었습니다.

사용법은 docker rm과 같습니다.

# 컨테이너 ID 값으로 삭제
docker container rm [CONTAINER_ID]

# 컨테이너 이름으로 삭제
docker container rm [CONTAINER_NAME]

docker rm과 마찬가지로 강제 삭제 옵션은 -f를 사용합니다. 마지막 남은 nginx3 컨테이너를 삭제해보겠습니다.

$ docker contanier rm -f nginx3
nginx

$ docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

이제 남아있는 컨테이너가 없습니다. 혹시 중지된채로 남아있는 컨테이너가 있는지 docker ps -a 명령어로 확인해봅니다.

로컬 시스템의 모든 Docker 컨테이너를 삭제하는 방법

docker rm이나 docker container rm은 여러개의 인자를 받을 수 있어서, 여러개의 컨테이너를 한꺼번에 삭제할 수 있습니다. 예를 들어 nginx1, nginx2, nginx3 컨테이너를 삭제하려면 다음과 같이 실행합니다.

$ docker rm -f nginx1 nginx2 nginx3

그렇다면 작업중에 생긴 수십개의 컨테이너를 모두 삭제하려면 어떻게 해야할까요? 먼저 간단한 셸 스크립트로 Docker 컨테이너를 대량으로 실행해봅니다.

$ for i in {1..50}; do docker run -d --name "nginx$i" nginx:latest; done
f47bc16e867052f4c6fd823a09a48f04be292340629ecdddab2d4457fbe06230
612f7207087d315c98c4d84fa788f5fc1de79d9e9f22a0e6ff989a34fe02d67c
621ea75a119de7b4ceb91830e96b100204a8a33e56a58082cb86f6bdee312e2e
.....

이렇게 실행하면 nginx1부터 nginx50까지 50개의 컨테이너가 생성됩니다. wc 명령어로 docker ps 실행 시 출력되는 내용의 줄수를 세어봅니다.

$ docker ps | wc -l
      51

맨 위에 헤더를 한 줄 빼면, 딱 50개의 컨테이너가 실행중인 것을 알 수 있습니다. 이 컨테이너들 필요없긴한데, 일일히 ID나 이름 복사하면서 삭제하고 있으면 힘듭니다. 😅

이럴 때를 위해 준비했습니다. 이거 하나면 한 방에 모든 컨테이너가 삭제됩니다. (주의: 삭제된 컨테이너는 복구가 불가능합니다!)

docker rm -f $(docker ps -aq)

실제로 잘 동작하는지 실행해봅니다.

$ docker ps | wc -l
      51

$ docker rm -f $(docker ps -aq)
9f2d969a22d3
9f9208649267
9903b61468f6
.....

$ docker ps | wc -l
      1

모든 컨테이너가 삭제되었습니다.

의도한대로 잘 동작은 하는데, 이 명령어는 어떤 원리로 동작하는 걸까요?

이걸 이해하려면 셸 스크립팅에 대한 약간의 지식이 필요합니다. 이 명령어는 크게 docker rm -fdocker ps -aq 두 개 명령어로 이루어져있습니다. docker rm -f는 이 글에서 이미 소개했습니다. docker ps -a 명령어도 많이 사용해보셨을 겁니다.

그럼 남는 건 docker ps 명령어의 -q 옵션입니다. -q 옵션을 사용하면 도커 컨테이너 목록을 출력할 때 한 줄에 컨테이너 ID만 하나씩 출력해줍니다.

$ docker ps -a -q
9f2d969a22d3
9f9208649267
9903b61468f6
.....

$() 문법은 괄호 사이에 오는 명령어를 실행한 다음 출력 결과로 내용을 치환해줍니다. 앞에서 docker rm은 여러 개의 인자를 받을 수 있다고 설명했습니다. docker ps -aq를 실행하면 한 줄에 하나씩 출력하지만, docker rm에서는 여러개의 컨테이너를 입력받을 때 줄바꿈과 빈 칸(스페이스)를 같은 의미로 해석합니다.

결론입니다. docker rm -f $(docker ps -aq)는 실제로는 아래와 같이 실행 됩니다.

$ docker rm -f 9f2d969a22d3 9f9208649267 9903b61468f6 .....

이렇게 많은 컨테이너 ID들을 docker rm -f 명령어에 한 번에 넘겨줍니다. 그럼 한 번에 모든 컨테이너가 삭제됩니다.

알고 보면 간단하죠? 처음 보면 마법 같아 보이지만 셸에서 $() 기법은 자주 활용되므로 익혀두면 편리합니다.

docker container prune: 중지된 모든 컨테이너를 일괄 삭제하기

docker rm -f $(docker ps -aq) 명령어로 모든 컨테이너를 일괄 삭제할 수 있습니다만, Docker에서는 중지된 컨테이너만 일괄 삭제하는 명령어도 제공하고 있습니다.

docker container prune 명령어를 실행하면 중지되어있는 모든 컨테이너를 한 번에 삭제해줍니다. 여기서 prune은 필요없는 부분을 버린다는 의미를 가지고 있습니다. Docker의 가비지 컬렉팅 기능이라고도 할 수 있습니다.

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

Total reclaimed space: 51.114MB

이 명령어 한 방으로 중지되어있는 컨테이너들이 모두 삭제되었습니다.

Docker 컨테이너 삭제 방법 요약

이 글에서 다룬 컨테이너 삭제 방법을 총 정리합니다.

docker rm [CONTAINER_ID]
docker rm [CONTAINER_NAME]

docker rm 명령어에 컨테이너 ID나 이름을 지정해 컨테이너를 삭제할 수 있습니다.

docker rm [CONTAINER1] [CONTAINER2] [CONTAINER3] ...

docker rm 명령어로 여러 개의 컨테이너들을 한꺼번에 삭제할 수 있습니다.

docker rm -f [CONTAINER]

-f 옵션을 사용하면 실행중인 컨테이너를 강제로 종료시키고 삭제할 수 있습니다.

docker container rm [CONTAINER]

docker container rm 명령어는 docker rm 명령어와 같습니다. 지정한 컨테이너를 삭제합니다.

docker rm -f $(docker ps -aq)

현재 로컬 시스템에서 실행중이거나 중지된 모든 컨테이너를 삭제하는 명령어입니다.

docker container prune

docker container prune 명령어를 사용하면 중지된 컨테이너들만 한꺼번에 삭제할 수 있습니다.

추천 문서

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