소개
이 랩에서는 docker container rm 명령어를 사용하여 Docker 컨테이너를 효과적으로 관리하는 방법을 배우게 됩니다. 기본적인 컨테이너 생성 및 제거를 실습하고, 실행 중인 컨테이너를 강제로 제거하는 방법, 익명 볼륨 (anonymous volumes) 과 함께 컨테이너를 제거하는 옵션을 살펴보고, 마지막으로 중지된 모든 컨테이너를 효율적으로 제거하는 방법을 배우게 됩니다.
실습을 통해 필수적인 Docker 컨테이너 라이프사이클 관리에 대한 실질적인 경험을 쌓아 Docker 환경을 정리하고 리소스를 효과적으로 관리할 수 있게 됩니다.
컨테이너 생성 및 제거
이 단계에서는 Docker 컨테이너를 생성하고 제거하는 방법을 배우게 됩니다. 컨테이너는 이미지의 실행 가능한 인스턴스입니다. Docker API 또는 CLI 를 사용하여 컨테이너를 생성, 시작, 중지, 이동 또는 삭제할 수 있습니다.
먼저, 컨테이너를 생성하는 데 사용할 수 있는 간단한 이미지를 가져와 보겠습니다. "Hello from Docker!"를 출력하고 종료되는 매우 작은 이미지인 hello-world 이미지를 사용합니다.
docker pull hello-world
이미지가 가져와 다운로드되고 있음을 나타내는 출력을 볼 수 있습니다.
Using default tag: latest
latest: Pulling from library/hello-world
...
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest
이제 이미지가 있으므로 이를 기반으로 컨테이너를 생성하고 실행할 수 있습니다. docker run 명령어를 사용합니다.
docker run hello-world
이 명령어는 hello-world 이미지에서 새 컨테이너를 생성하고, 이미지에 지정된 명령 ( "Hello from Docker!"를 출력하는 것) 을 실행한 다음 컨테이너가 종료됩니다. 터미널에서 "Hello from Docker!" 메시지를 볼 수 있습니다.
Hello from Docker!
This message shows that your installation appears to be working correctly.
...
컨테이너가 실행을 완료하면 중지됩니다. docker ps -a 명령어를 사용하여 중지된 컨테이너를 포함한 모든 컨테이너를 볼 수 있습니다.
docker ps -a
"Exited" 상태의 hello-world 컨테이너를 보여주는 다음과 유사한 출력을 볼 수 있습니다.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
<container_id> hello-world "/hello" About a minute ago Exited (0) About a minute ago <container_name>
이제 중지된 컨테이너를 제거해 보겠습니다. 컨테이너 ID 또는 이름을 사용하여 docker rm 명령어를 사용할 수 있습니다. docker ps -a의 출력에서 컨테이너 ID 또는 이름을 얻을 수 있습니다. <container_id>를 컨테이너의 실제 ID 로 바꿉니다.
docker rm <container_id>
컨테이너가 제거되었음을 나타내는 컨테이너 ID 가 출력되는 것을 볼 수 있습니다.
<container_id>
컨테이너가 제거되었는지 확인하려면 docker ps -a를 다시 실행할 수 있습니다. hello-world 컨테이너가 더 이상 나열되지 않아야 합니다.
docker ps -a
출력에는 방금 제거한 hello-world 컨테이너가 포함되지 않아야 합니다.
실행 중인 컨테이너 강제 제거
이전 단계에서는 중지된 컨테이너를 제거했습니다. 그러나 docker rm을 사용하여 실행 중인 컨테이너를 직접 제거할 수 없습니다. 이 단계에서는 실행 중인 컨테이너를 강제로 제거하는 방법을 배우게 됩니다.
먼저, 계속 실행될 컨테이너를 생성해 보겠습니다. ubuntu 이미지를 사용하고 sleep infinity와 같이 컨테이너를 활성 상태로 유지하는 명령을 실행합니다. ubuntu 이미지가 없으면 먼저 가져오세요.
docker pull ubuntu
이제 ubuntu 이미지에서 분리 모드 (-d) 로 컨테이너를 실행하여 백그라운드에서 실행되도록 합니다.
docker run -d ubuntu sleep infinity
컨테이너 ID 인 긴 문자열을 볼 수 있습니다.
<container_id>
이제 docker ps를 사용하여 컨테이너가 실행 중인지 확인해 보겠습니다.
docker ps
"Up" 상태의 ubuntu 컨테이너가 나열되는 것을 볼 수 있습니다.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
<container_id> ubuntu "sleep infinity" About a minute ago Up About a minute ago <container_name>
이제 컨테이너 ID 를 사용하여 docker rm 명령어를 사용하여 이 실행 중인 컨테이너를 제거해 보십시오. <container_id>를 실행 중인 컨테이너의 실제 ID 로 바꿉니다.
docker rm <container_id>
실행 중인 컨테이너를 제거할 수 없다는 오류 메시지가 표시될 가능성이 높습니다.
Error response from daemon: You cannot remove a running container <container_id>. Stop the container before attempting removal or use -f
오류 메시지에서 제안하는 것처럼, 먼저 컨테이너를 중지하거나 -f (force, 강제) 플래그를 사용해야 합니다. 컨테이너 내부의 프로세스가 중지 신호에 빠르게 응답하지 않으면 컨테이너를 중지하는 데 시간이 걸릴 수 있습니다. 강제 제거는 실행 중인 컨테이너를 제거하는 더 빠른 방법이지만, 가능하면 컨테이너를 정상적으로 중지하는 것이 일반적으로 권장됩니다.
-f 플래그를 사용하여 실행 중인 컨테이너를 강제로 제거해 보겠습니다. <container_id>를 실행 중인 컨테이너의 실제 ID 로 바꿉니다.
docker rm -f <container_id>
컨테이너 ID 가 출력되는 것을 볼 수 있으며, 이는 컨테이너가 강제로 제거되었음을 나타냅니다.
<container_id>
컨테이너가 제거되었는지 확인하려면 docker ps를 다시 실행합니다. ubuntu 컨테이너가 더 이상 나열되지 않아야 합니다.
docker ps
출력에는 방금 제거한 ubuntu 컨테이너가 포함되지 않아야 합니다.
컨테이너 및 익명 볼륨 제거
이 단계에서는 컨테이너와 관련된 익명 볼륨을 제거하는 방법을 배우게 됩니다. 컨테이너를 생성할 때 Docker 는 데이터를 저장하기 위해 볼륨을 생성할 수 있습니다. 익명 볼륨은 생성 시 명시적으로 이름이 지정되지 않은 볼륨입니다. 일반적으로 이미지의 Dockerfile 에 VOLUME 지시어가 있는 경우 생성됩니다.
익명 볼륨을 생성하는 컨테이너를 실행해 보겠습니다. 다시 ubuntu 이미지를 사용하고 콜론 앞에 이름 없이 -v 플래그를 사용하여 볼륨 마운트 지점을 지정합니다.
docker run -d -v /data ubuntu sleep infinity
이 명령어는 컨테이너와 컨테이너 내부의 /data에 마운트된 익명 볼륨을 생성합니다. 컨테이너 ID 가 출력되는 것을 볼 수 있습니다.
<container_id>
이제 컨테이너를 검사하여 생성된 볼륨을 확인해 보겠습니다. <container_id>를 실행 중인 컨테이너의 실제 ID 로 바꿉니다.
docker inspect <container_id>
docker inspect의 출력은 큰 JSON 객체입니다. "Mounts" 섹션을 찾습니다. /data에 마운트된 볼륨에 대한 항목이 표시되고, "Name" 필드는 길고 무작위로 생성된 문자열이 되어 익명 볼륨임을 나타냅니다.
...
"Mounts": [
{
"Type": "volume",
"Source": "<volume_name>",
"Target": "/data",
"Consistency": "consistent",
"BindOptions": null,
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
...
docker volume ls를 사용하여 모든 볼륨을 나열할 수도 있습니다. 익명 볼륨이 나열되는 것을 볼 수 있습니다.
docker volume ls
출력에는 무작위로 생성된 이름과 함께 익명 볼륨이 포함됩니다.
DRIVER VOLUME NAME
local <volume_name>
기본적으로 컨테이너를 제거하면 해당 익명 볼륨은 제거되지 않습니다. 먼저 컨테이너를 중지해 보겠습니다. <container_id>를 실행 중인 컨테이너의 실제 ID 로 바꿉니다.
docker stop <container_id>
컨테이너 ID 가 출력되는 것을 볼 수 있습니다.
<container_id>
이제 볼륨을 제거하지 않고 중지된 컨테이너를 제거합니다. <container_id>를 중지된 컨테이너의 실제 ID 로 바꿉니다.
docker rm <container_id>
컨테이너 ID 가 출력되는 것을 볼 수 있습니다.
<container_id>
docker volume ls를 사용하여 볼륨을 다시 확인합니다. 익명 볼륨은 여전히 존재해야 합니다.
docker volume ls
출력에는 여전히 익명 볼륨이 포함됩니다.
이제 익명 볼륨이 있는 다른 컨테이너를 생성한 다음 컨테이너와 해당 볼륨을 함께 제거해 보겠습니다.
docker run -d -v /data ubuntu sleep infinity
새 컨테이너 ID 를 가져옵니다.
<new_container_id>
새 컨테이너를 중지합니다. <new_container_id>를 실제 ID 로 바꿉니다.
docker stop <new_container_id>
컨테이너 ID 가 출력되는 것을 볼 수 있습니다.
<new_container_id>
이제 -v 플래그와 함께 docker rm을 사용하여 중지된 컨테이너와 해당 익명 볼륨을 제거합니다. <new_container_id>를 실제 ID 로 바꿉니다.
docker rm -v <new_container_id>
컨테이너 ID 가 출력되는 것을 볼 수 있습니다.
<new_container_id>
docker volume ls를 사용하여 볼륨을 다시 확인합니다. 방금 제거한 컨테이너와 관련된 익명 볼륨은 이제 사라져야 합니다. 처음 생성한 익명 볼륨은 여전히 있어야 합니다.
docker volume ls
출력에는 처음 생성한 익명 볼륨만 표시되어야 합니다.
정지된 모든 컨테이너 삭제
이 단계에서는 중지된 모든 컨테이너를 한 번에 제거하는 방법을 배우게 됩니다. Docker 로 작업하면서 많은 중지된 컨테이너가 누적될 수 있으며, 이는 디스크 공간을 차지할 수 있습니다. Docker 는 이러한 중지된 컨테이너를 정리하는 편리한 명령을 제공합니다.
먼저, 몇 개의 중지된 컨테이너를 생성해 보겠습니다. ubuntu 이미지를 사용하고 즉시 종료되는 명령을 실행할 수 있습니다.
docker run ubuntu echo "This container will stop immediately"
"This container will stop immediately" 출력을 볼 수 있으며 컨테이너가 종료됩니다.
명령을 다시 실행하여 다른 중지된 컨테이너를 생성합니다.
docker run ubuntu echo "Another stopped container"
"Another stopped container" 출력을 볼 수 있으며 이 컨테이너도 종료됩니다.
이제 docker ps -a를 사용하여 중지된 컨테이너를 포함한 모든 컨테이너를 나열해 보겠습니다.
docker ps -a
방금 생성한 두 개의 컨테이너가 "Exited" 상태로 나열되는 것을 볼 수 있습니다. 이전 단계에서 제거하지 않은 다른 중지된 컨테이너도 볼 수 있습니다.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
<container_id_1> ubuntu "echo 'This containe…" About a minute ago Exited (0) About a minute ago <container_name_1>
<container_id_2> ubuntu "echo 'Another stopp…" About a minute ago Exited (0) About a minute ago <container_name_2>
...
중지된 모든 컨테이너를 제거하려면 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
제거된 컨테이너 ID 목록을 볼 수 있습니다.
Deleted Containers:
<container_id_1>
<container_id_2>
...
Total reclaimed space: ...
중지된 모든 컨테이너가 제거되었는지 확인하려면 docker ps -a를 다시 실행합니다.
docker ps -a
출력에는 실행 중인 컨테이너 (있는 경우) 만 표시되고 중지된 컨테이너는 표시되지 않아야 합니다.
요약
이 랩에서는 docker rm 명령을 사용하여 Docker 컨테이너를 관리하는 기본적인 프로세스를 배웠습니다. 먼저 간단한 hello-world 컨테이너를 생성하고 실행하여 생성부터 종료까지의 수명 주기를 관찰했습니다. 그런 다음 ID 또는 이름을 사용하여 이 중지된 컨테이너를 제거하는 연습을 했습니다.
이를 바탕으로 더 고급 제거 시나리오를 탐색했습니다. -f 플래그를 사용하여 실행 중인 컨테이너를 강제로 제거하는 방법을 배우고 이 작업의 의미를 이해했습니다. 또한 -v 플래그를 사용하여 컨테이너와 관련된 익명 볼륨을 함께 제거하는 방법을 발견하여 깔끔한 제거를 보장했습니다. 마지막으로, Docker 환경을 정리하는 데 유용한 명령인 중지된 모든 컨테이너를 동시에 제거하는 효율적인 기술을 익혔습니다.



