docker image rm 명령어를 사용하여 이미지 제거하는 방법

DockerBeginner
지금 연습하기

소개

이 랩에서는 docker image rm 명령어를 사용하여 Docker 이미지를 효과적으로 관리하는 방법을 배우게 됩니다. 먼저, 시스템에 존재하는 이미지를 나열하여 현재 가지고 있는 이미지를 파악하는 것으로 시작합니다.

그 후, 여러 태그가 있는 이미지를 삭제하려는 시도, 태그로 이미지 삭제, 강제 옵션을 사용하여 ID 로 이미지 삭제, 마지막으로 다이제스트 (digest) 로 이미지 삭제 등 이미지 삭제에 대한 다양한 시나리오를 탐구할 것입니다. 이러한 실습을 통해 사용하지 않거나 원치 않는 Docker 이미지를 정리하는 데 필요한 기술을 습득할 수 있습니다.

기존 이미지 목록 확인

이 단계에서는 현재 시스템에서 사용할 수 있는 Docker 이미지를 나열하는 방법을 배우겠습니다. Docker 이미지는 컨테이너의 구성 요소입니다. 컨테이너를 생성하는 데 사용되는 읽기 전용 템플릿입니다.

이미지를 나열하려면 docker images 명령어를 사용할 수 있습니다. 이 명령어는 Docker 가 머신에 다운로드하거나 빌드한 모든 이미지 목록을 보여줍니다.

실행해 봅시다. 터미널을 열고 다음 명령어를 실행합니다.

docker images

다음과 유사한 출력을 볼 수 있습니다 (정확한 이미지와 세부 정보는 Docker 를 사용하여 이전에 수행한 작업에 따라 다를 수 있습니다).

REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
ubuntu        latest    270000000000   2 weeks ago    77.8MB
hello-world   latest    d00000000000   2 months ago   13.3kB

출력은 각 이미지에 대한 몇 가지 정보를 제공합니다.

  • REPOSITORY: 이미지의 이름입니다.
  • TAG: 이미지의 특정 버전입니다. latest는 지정되지 않은 경우 기본 태그입니다.
  • IMAGE ID: 이미지의 고유 식별자입니다.
  • CREATED: 이미지가 생성된 시간입니다.
  • SIZE: 이미지의 크기입니다.

가지고 있는 이미지를 이해하는 것은 이미지를 관리하는 첫 번째 단계입니다. 다음 단계에서는 이미지를 삭제하는 방법을 살펴보겠습니다.

여러 태그가 있는 이미지 제거 시도

이 단계에서는 동일한 이미지 ID 를 가리키는 여러 태그가 있는 Docker 이미지를 삭제하려고 할 때 어떤 일이 발생하는지 살펴보겠습니다. 이는 이미지를 다른 버전 또는 이름으로 태그할 때 흔히 발생하는 시나리오입니다.

먼저, 이미지를 가져와서 추가 태그를 지정해 보겠습니다. 이 예제에서는 hello-world 이미지를 사용합니다. 이미 가지고 있다면 가져오기가 매우 빠를 것입니다.

docker pull hello-world

이제 docker tag 명령어를 사용하여 이 이미지에 다른 태그를 추가해 보겠습니다. 구문은 docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]입니다. hello-world:latest 이미지에 hello-world:mytag라는 새 태그를 지정합니다.

docker tag hello-world:latest hello-world:mytag

이제 이미지를 다시 나열하여 새 태그를 확인해 보겠습니다.

docker images

hello-world에 대한 두 개의 항목을 볼 수 있습니다. 하나는 latest 태그가 있고 다른 하나는 mytag 태그가 있지만 둘 다 동일한 IMAGE ID를 갖습니다.

REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
ubuntu        latest    270000000000   2 weeks ago    77.8MB
hello-world   latest    d00000000000   2 months ago   13.3kB
hello-world   mytag     d00000000000   2 months ago   13.3kB

이제 docker rmi 명령어를 사용하여 태그 중 하나, 예를 들어 hello-world:latest를 사용하여 이미지를 삭제해 보겠습니다.

docker rmi hello-world:latest

Docker 가 실제로 이미지 데이터 자체를 삭제하지 않는다는 것을 알 수 있습니다. 대신, 지정한 특정 태그를 제거합니다. 출력은 "Untagged"라고 표시됩니다.

Untagged: hello-world:latest

이미지를 다시 나열하면 hello-world:latest 항목이 사라졌지만 (동일한 IMAGE ID 를 가진) hello-world:mytag 항목은 여전히 존재합니다.

docker images
REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
ubuntu        latest    270000000000   2 weeks ago    77.8MB
hello-world   mytag     d00000000000   2 months ago   13.3kB

이는 이미지에 여러 태그가 있는 경우 단일 태그를 제거하면 해당 이미지 데이터에 대한 특정 참조만 제거됨을 보여줍니다. 이미지 데이터 자체는 해당 데이터를 가리키는 마지막 태그가 제거되거나 (나중에 다룰) ID 로 명시적으로 제거될 때만 제거됩니다.

태그로 이미지 제거

이전 단계에서 다른 태그 또는 컨테이너가 여전히 이미지를 참조하는 경우 태그를 제거하면 이미지가 단순히 태그 해제된다는 것을 확인했습니다. 이 단계에서는 hello-world 이미지에 대한 마지막 남은 태그를 제거하여 이미지 데이터가 삭제되도록 하겠습니다.

현재 mytag 태그가 있는 hello-world 이미지가 있습니다. 이미지를 나열하여 이를 확인해 보겠습니다.

docker images

hello-world:mytag 항목이 표시되어야 합니다.

REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
ubuntu        latest    270000000000   2 weeks ago    77.8MB
hello-world   mytag     d00000000000   2 months ago   13.3kB

이제 docker rmi 명령어를 사용하여 mytag 태그로 hello-world 이미지를 제거해 보겠습니다.

docker rmi hello-world:mytag

이번에는 mytag가 이 이미지 ID 를 참조하는 유일한 태그였으므로 Docker 는 태그와 기본 이미지 데이터를 모두 제거합니다. 출력은 "Untagged"로 표시된 다음 "Deleted"로 표시됩니다.

Untagged: hello-world:mytag
Deleted: sha256:d000000000000000000000000000000000000000000000000000000000000000
Deleted: sha256:0000000000000000000000000000000000000000000000000000000000000000
... (more Deleted lines)

hello-world 이미지가 사라졌는지 확인하기 위해 이미지를 다시 나열해 보겠습니다.

docker images

hello-world 이미지가 더 이상 목록에 나타나지 않아야 합니다.

REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
ubuntu        latest    270000000000   2 weeks ago    77.8MB

이는 컨테이너에서 사용되지 않고 태그가 하나만 있는 경우 이미지를 제거하는 표준 방법을 보여줍니다.

강제 옵션을 사용하여 ID 로 이미지 제거

이 단계에서는 Docker 이미지를 이미지 ID 를 사용하여 제거하는 방법, 특히 필요한 경우 강제 옵션 (-f 또는 --force) 을 사용하는 방법을 배우겠습니다. ID 로 제거하는 것은 여러 태그가 동일한 이미지를 가리키는 경우 특히 제거하려는 이미지를 정확하게 지정하려는 경우 유용합니다.

먼저, ID 로 제거할 수 있는 이미지를 가져와 보겠습니다. ubuntu 이미지를 사용합니다. 이미 가지고 있다면 가져오기가 빠를 것입니다.

docker pull ubuntu

이제 이미지를 나열하여 ubuntu 이미지의 이미지 ID 를 얻습니다.

docker images

출력에서 ubuntu 이미지를 찾고 해당 IMAGE ID를 기록해 둡니다. 이는 긴 16 진수 문자열입니다. 이미지를 고유하게 식별하려면 처음 몇 자 (일반적으로 3 자 이상) 만 있으면 됩니다.

REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
ubuntu        latest    270000000000   2 weeks ago    77.8MB

먼저 강제 옵션 없이 ID 를 사용하여 이미지를 제거해 보겠습니다. YOUR_IMAGE_IDdocker images 출력에서 기록한 실제 이미지 ID 로 바꿉니다.

docker rmi YOUR_IMAGE_ID

이미지가 실행 중이거나 중지된 컨테이너에서 사용되지 않는 경우 이 명령은 성공하고 이미지를 제거할 가능성이 높습니다. 그러나 이 이미지를 기반으로 하는 컨테이너가 있는 경우 이미지가 컨테이너에서 사용되고 있으므로 제거할 수 없다는 오류 메시지가 표시됩니다.

강제 옵션의 사용을 보여주기 위해 먼저 ubuntu 이미지를 기반으로 하는 컨테이너를 실행해 보겠습니다.

docker run -d ubuntu sleep 3600

이 명령은 분리 모드 (-d) 에서 Ubuntu 컨테이너를 실행하고 한 시간 동안 (sleep 3600) 실행 상태를 유지합니다.

이제 강제 옵션 없이 ID 로 ubuntu 이미지를 다시 제거해 보십시오.

docker rmi YOUR_IMAGE_ID

다음과 유사한 오류 메시지를 받게 됩니다.

Error response from daemon: conflict: unable to remove repository reference "ubuntu:latest" (must force) - image is referenced by one or more containers: 000000000000 (created ...)

이 오류는 컨테이너가 이미지를 사용하고 있기 때문에 발생합니다. 컨테이너에서 사용 중인 이미지를 제거하려면 강제 옵션 (-f) 을 사용해야 합니다.

이제 강제 옵션과 함께 ID 를 사용하여 이미지를 제거해 보겠습니다. YOUR_IMAGE_ID를 실제 이미지 ID 로 바꿉니다.

docker rmi -f YOUR_IMAGE_ID

강제 옵션은 컨테이너에서 사용 중인 경우에도 Docker 가 이미지를 제거하도록 지시합니다. Docker 는 먼저 이미지를 사용하고 있는 모든 컨테이너를 중지하고 제거한 다음 이미지 자체를 제거합니다. 출력은 이미지와 해당 레이어가 삭제되었음을 표시합니다.

Untagged: ubuntu:latest
Deleted: sha256:2700000000000000000000000000000000000000000000000000000000000000
Deleted: sha256:0000000000000000000000000000000000000000000000000000000000000000
... (more Deleted lines)

ubuntu 이미지가 사라졌는지 확인하기 위해 이미지를 다시 나열합니다.

docker images

ubuntu 이미지가 더 이상 목록에 없어야 합니다.

강제 옵션은 추가 확인 없이 컨테이너를 중지하고 제거하므로 주의해서 사용해야 합니다.

다이제스트로 이미지 제거

이 마지막 단계에서는 Docker 이미지를 다이제스트 (digest) 를 사용하여 제거하는 방법을 배우겠습니다. 이미지 다이제스트는 이미지 콘텐츠에 대한 암호화 방식으로 안전한 식별자입니다. 태그에 관계없이 이미지의 정확한 레이어와 구성을 고유하게 식별합니다.

먼저, 다이제스트로 제거할 수 있는 이미지를 가져와 보겠습니다. 이 예제에서는 alpine 이미지를 사용합니다.

docker pull alpine

이제 이미지의 다이제스트를 보려면 docker images --digests 명령을 사용할 수 있습니다.

docker images --digests

출력에서 alpine 이미지를 찾습니다. sha256:로 시작하는 값이 있는 DIGEST 열이 표시됩니다. 이것이 이미지 다이제스트입니다.

REPOSITORY    TAG       DIGEST                                                                    IMAGE ID       CREATED        SIZE
ubuntu        latest    <none>                                                                    270000000000   2 weeks ago    77.8MB
alpine        latest    sha256:0000000000000000000000000000000000000000000000000000000000000000   000000000000   3 weeks ago    5.59MB

다이제스트로 이미지를 제거하려면 docker rmi 명령을 사용하고 그 뒤에 이미지 이름과 REPOSITORY@DIGEST 형식의 다이제스트를 입력합니다. YOUR_ALPINE_DIGEST를 이전 출력에서 찾은 실제 다이제스트로 바꿉니다.

docker rmi alpine@YOUR_ALPINE_DIGEST

출력은 이미지가 삭제되었음을 표시합니다.

Deleted: sha256:0000000000000000000000000000000000000000000000000000000000000000
Deleted: sha256:0000000000000000000000000000000000000000000000000000000000000000
... (more Deleted lines)

alpine 이미지가 사라졌는지 확인하기 위해 이미지를 다시 나열합니다.

docker images

alpine 이미지가 더 이상 목록에 없어야 합니다.

REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
ubuntu        latest    <none>                                                                    270000000000   2 weeks ago    77.8MB

다이제스트로 제거하는 것은 이미지를 제거하는 가장 구체적인 방법으로, 해당 다이제스트로 식별된 이미지의 정확한 버전을 제거하도록 보장합니다.

요약

이 Lab 에서는 docker imagesdocker rmi 명령을 사용하여 Docker 이미지를 관리하는 방법을 배웠습니다. 먼저 기존 이미지를 나열하여 해당 리포지토리 (repository), 태그 (tag), ID, 생성 시간 및 크기를 이해했습니다.

그런 다음 이미지를 제거하는 과정을 살펴보았습니다. 여러 태그가 있는 이미지를 제거하려고 시도했으며, docker rmi는 다른 태그가 여전히 참조하고 있는 경우 기본 이미지 ID 가 아닌 지정된 태그만 제거한다는 것을 확인했습니다. 태그를 지정하여 이미지를 성공적으로 제거했으며, 필요한 경우 강제 플래그 (-f) 를 사용하는 것을 포함하여 ID 로 이미지를 제거하는 방법도 시연했습니다. 마지막으로, 이미지 콘텐츠에 대한 고유하고 변경 불가능한 식별자를 제공하는 다이제스트 (digest) 를 사용하여 이미지를 제거하는 방법을 배웠습니다.