도커
이미지
삭제

도커 이미지 삭제 | 전체, 강제, none, tag, cache, Docker Hub 까지

이번 포스팅은 도커 이미지 삭제 관련 7가지 핵심 내용을 다룹니다. docker image rm 명령어를 중심으로, 특정 이미지 삭제, 강제 삭제, 전체 삭제, 안쓰는 이미지 삭제, 대그 삭제, 빌드 캐시 삭제, 도커 허브 이미지 삭제 까지 거의 모든 종류의 도커 이미지 삭제 방법을 정리해보겠습니다.

1. 도커 특정 이미지 삭제 명령어

도커에서 하나 이상의 이미지를 제거하는 명령어는 다음의 기본 형식을 갖습니다.

docker image rm [OPTIONS] IMAGE [IMAGE...]

이전 명령어 체계의 docker rmi 명령어와 같은 역할을 하며, IMAGE 위치에 이미지의 이름, 이름과 태그, 이미지 ID 등을 입력합니다. 사용할 수 있는 옵션으로는 강제 삭제를 수행하는 --force, 부모 이미지는 제거하지 않는 --no-prune 이 있습니다.

도커에서 특정 이미지를 삭제하기 위해서는, 현재 존재하는 컨테이너가 이 이미지를 사용하지 않아야 합니다. 따라서, 이러한 이미지를 대상으로 아래와 같이 명령어를 입력하면 이미지를 삭제할 수 있습니다.

만약 최신 버전의 Nginx 이미지를 제거한다면 다음과 같이 명령어를 입력합니다.

$ docker image rm nginx:latest
Untagged: nginx:latest
Untagged: nginx@sha256:af296b188c7b7df99ba960ca614439c99cb7cf252ed7bbc23e90cfda59092305
Deleted: sha256:f9c14fe76d502861ba0939bc3189e642c02e257f06f4c0214b1f8ca329326cda
Deleted: sha256:419f8948c50c723f2a5ac74428af3d804b5d0079d6df8f7f827663cf10cbc366
Deleted: sha256:1030aac4f1a8096ed58d3d4a2df55dd1b1b27d919ad156d97ad1f68081d0051a
Deleted: sha256:7d90b49d96c3036539ef144ecc27c01de03902d8ea166a0f7b77d11d3779c4bd
Deleted: sha256:551acb210764654af31b6cd51adaa74edc9a202587c3395fe0e9f95a2e097f8b
Deleted: sha256:3c530958db4c75c6fb409f339367aaf9a1e163c84718c035d4b09bebc83f43e7
Deleted: sha256:8cbe4b54fa88d8fc0198ea0cc3a5432aea41573e6a0ee26eca8c79f9fbfa40e3

위처럼 이미지 이름으로 삭제할 수도 있지만, 다음과 같이 이미지 ID로 제거할 수도 있습니다.

$ docker image ls ubuntu:latest
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
ubuntu       latest    3b418d7b466a   5 weeks ago   77.8MB
 
$ docker image rm 3b418d
Untagged: ubuntu:latest
Untagged: ubuntu@sha256:dfd64a3b4296d8c9b62aa3309984f8620b98d87e47492599ee20739e8eb54fbf
Deleted: sha256:3b418d7b466ac6275a6bfcb0c86fbe4422ff6ea0af444a294f82d3bf5173ce74
Deleted: sha256:b8a36d10656ac19ddb96ef3107f76820663717708fc37ce929925c36d1b1d157

2. 이미지 강제 삭제

섹션 1에서 잠깐 언급했지만 도커 이미지 삭제가 안되는 경우가 크게 3가지 존재합니다. 이런 경우에는 --force 옵션을 활용해 강제 삭제로 진행해야 합니다. 우선 일반적인 삭제가 불가능한 3가지 경우를 보겠습니다.

2.1. 도커 이미지 삭제가 안되는 경우

  • 이미지가 실행 중인 컨테이너에 의해 사용되고 있는 경우: 도커는 기본적으로 실행/정지 중인 컨테이너가 사용하고 있는 이미지를 삭제하는 것을 허용하지 않습니다. 이러한 이미지를 삭제하려면 먼저 해당 컨테이너를 중지하거나 삭제해야 합니다.
  • 이미지가 다른 이미지의 부모 이미지인 경우: 도커 이미지는 레이어의 집합으로 이루어져 있으며, 한 이미지는 다른 이미지의 기반이 될 수 있습니다. 이런 경우 기반 이미지를 삭제하려고 하면 작업이 거부됩니다. 이 문제를 해결하려면 의존하는 모든 이미지를 먼저 삭제해야 합니다.
  • 도커 디스크 공간이 부족한 경우: 도커는 이미지를 삭제하는 과정에서 일시적으로 추가적인 디스크 공간을 사용할 수 있습니다. 디스크 공간이 부족하면 이미지 삭제가 실패할 수 있습니다.

이러한 상황에서는 문제를 해결한 후에 이미지 삭제를 다시 시도해야 합니다. 예를 들어, 실행 중인 컨테이너를 중지하거나 삭제하거나, 부모 이미지를 사용하는 모든 자식 이미지를 삭제하거나, 필요한 경우 디스크 공간을 확보해야 합니다.

하지만 상황을 해결하는 것이 도리어 많은 시간과 비용을 낭비하는 경우도 있습니다. 만약, 개발용으로 사용하거나, 예기치 못한 일에 대응할 수 있는 경우에는 강제 삭제를 진행할 수도 있습니다.

2.2. 이미지 강제 삭제 방법

이미지 강제 삭제 방법은 간단합니다. rm 명령어에 --force 옵션을 추가하면 됩니다. 다음은 정지한 컨테이너가 사용하고 있는 이미지입니다. 강제 삭제 실행 결과를 보겠습니다.

$ docker image rm php:7
Error response from daemon: conflict: unable to remove repository reference "php:7" (must force) - container 086591af79a4 is using its referenced image 0b50b7a54cab
 
$.docker image rm --force php:7
Untagged: php:7
Untagged: php@sha256:a4325b962bf0ced295f9f6ea275837f504109fcb8497cb0fd340094bc5b5f29f
Deleted: sha256:0b50b7a54cab40ebbb65919b3502dbff938bbdaa6c4e18339d73745fc73ccdf5

일반적인 삭제를 시도했을 때는 에러가 났지만, 강제 삭제는 정상적으로 완료했습니다.

3. 안쓰는 이미지 완전 삭제 (none)

여러 개의 도커 이미지를 다운로드받거나, 스스로 커스팅 이미지를 빌드하다보면 자연스레 이미지 이름이 <none> 인 이미지들이 쌓이게 됩니다. 이러한 이미지들은 이미지 빌드 속도 혹은 결과물의 용량을 최적화하는 과정에서 만들어지는 중간 단계의 이미지들입니다. 대체로 사용하지 않는 이미지일 확률이 높습니다.

도커는 이렇게 dangling 상태에 놓인 이미지들을 한 번에 삭제할 수 있는 명령어를 제공합니다. 바로 docker image prune 입니다.

현재 아래와 같이, 많은 <none> 이미지를 목록에서 확인할 수 있습니다.

dagling 상태의 이미지들 prune 명령어를 입력한 후, 프롬프트에 긍정 답변을 보내면 아래와 같이 삭제가 진행됩니다.

docker image prune 결과 만약 이 과정에서도 지워지지 않은 이미지가 있다면, 섹션 2.1.에서 보았던 3가지 이유 중 하나일 가능성이 큽니다.

4. 모든 이미지 모두 전체 삭제

추천하지 않는 방법이지만, 만약 로컬 환경의 모든 이미지를 어떤 상태이든 상관 없이 전체 삭제하고자 한다면, 다음의 방법을 사용할 수 있습니다.

$ docker image rm --force  $(docker image ls --all --quiet)

docker image ls --all --quiet 명령어는 로컬 환경의 모든 이미지 ID만 목록으로 출력하며, 쉘 스크립트의 $() 문법은 ID 목록을 앞 명령어의 인자로 보내는 역할을 합니다. rm 명령어는 --force 옵션이 있어서 어떤 상태의 이미지든 삭제할 수 있습니다.

예기치 못하게 중요한 이미지를 삭제하지 않도록 꼭 백업을 한 뒤에, 위 명령어를 사용하길 바랍니다.

5. 이미지 tag 삭제

이미지 tag 삭제 명령어는 docker image rm 입니다. 뭔가 이상하다고 느끼셨다면 그 느낌이 맞습니다. 특정 아미지를 삭제하는 명령어와 같으며, 도커는 별도의 태그 삭제 명령어를 제공하지 않습니다.

도커에서 이미지 tag 삭제는, 하나의 이미지가 여러 태그를 갖고 있는 경우에만 가능합니다. 만약 특정 이미지에 다른 태그가 없다면, 이미지 전체를 삭제합니다. 그러나 해당 이미지에 다른 태그가 여러 개 있다면, 명령어로 지정한 태그만 삭제하고 이미지는 여전히 남아있습니다.

실제 실행 결과를 보기 위해 Nginx 이미지에 새로운 태그를 부여해보겠습니다. 이미지에 새 태그를 추가할 때는 docker image tag명령어를 사용합니다.

$ docker image tag nginx:latest nginx:my-tag
 
$ docker image ls nginx
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
nginx        latest    f9c14fe76d50   6 days ago      143MB
nginx        my-tag    f9c14fe76d50   6 days ago      143MB

nginx:latest 이미지에 my-tag 라는 새 태그를 추가했으며, ls 명령어 실행 결과를 보면 같은 이미지 ID를 가진 2개의 태그를 확인할 수 있습니다.

이제, my-tag 태그를 삭제해보겠습니다.

$ docker image rm nginx:my-tag
Untagged: nginx:my-tag
 
$ docker image ls nginx
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
nginx        latest    f9c14fe76d50   6 days ago      143MB
nginx        1.21      f8f4ffc8092c   20 months ago   133MB

해당 Nginx 이미지는 여러 태그를 가지고 있었기 때문에, 태그만 삭제되고 이미지는 여전히 남아 있는 것을 확인할 수 있습니다.

이와 마찬가지로 이미지 태그 수정을 위해서는, 일단 이미지를 삭제하고 새 태그를 가진 동일 이미지를 다시 빌드할 수 있습니다. 혹은 새 태그를 추가하고 이미지의 기존 태그를 삭제하는 방법을 사용할 수도 있고요.

도커 이미지의 태그를 삭제하면 해당 태그와 연관된 이미지를 찾는 것이 불가능해지므로, 태그를 삭제하기 전에 해당 이미지에 다른 태그가 있는지 확인하는 것이 중요합니다.

6. 이미지 빌드 캐시 삭제

도커는 이미지를 빌드할 때 중간 단계의 결과를 캐시로 저장해서, 다음 번 빌드 시 재사용합니다. 이 캐시는 디스크 공간을 점점 차지하게 되므로, 필요에 따라 이를 삭제해야 합니다.

도커의 빌드 캐시를 삭제하려면, docker builder prune명령어를 사용합니다:

이 명령어는 사용되지 않는 빌드 캐시를 모두 삭제합니다. 만약 존재하는 모든 빌드 캐시를 삭제하려면 --all 옵션을 추가하여 실행하면 됩니다.

캐시를 삭제하면 로컬 환경의 디스크 용량은 증가하지만, 이미지 빌드 시간 역시 증가할 수 있습니다. 이러한 트레이드오프를 생각하며 명령어를 실행하는 것이 좋은 프로세스입니다.

7. 도커 허브 이미지 삭제

다음은 도커 허브에서 이미지를 삭제하는 과정입니다.

  1. Docker Hub에 로그인합니다.
  2. Repositories를 클릭합니다.
  3. 삭제하려는 이미지가 있는 저장소를 클릭합니다.
  4. Tags 탭으로 이동합니다.
  5. 삭제하려는 태그의 오른쪽에 있는 Delete 버튼을 클릭합니다.
  6. 팝업에서 Delete를 클릭하여 태그를 삭제하거나, Delete all tags를 클릭하여 저장소의 모든 태그를 삭제할 수 있습니다.

참고로, Docker Hub에서 이미지를 삭제하면 해당 이미지는 Docker Hub에서 영구적으로 제거됩니다. 이를 복구할 수 없으므로 삭제하기 전에 필요한 경우 백업을 권장합니다.

8. 마치며

이번 포스팅에서는, 도커 이미지 삭제 관련 7가지 핵심 내용을 정리했습니다. 특히, 특정 이미지 삭제, 강제 삭제, 전체 삭제, 안쓰는 이미지 삭제, 대그 삭제, 빌드 캐시 삭제, 도커 허브 이미지 삭제 까지 거의 모든 종류의 이미지 삭제 방법을 살펴보았습니다. 도커 이미지 삭제 과정에 도움이 되길 바랍니다.

copyright for docker image remove

© 2023 All rights reserved.