1. 소개
이전 기사 에서 도커 이미지와 도커 컨테이너의 차이점에 대해 설명했습니다. 간단히 말해서 이미지는 Java 클래스와 같고 컨테이너는 Java 객체와 같습니다.
이 사용방법(예제)에서는 Docker 이미지를 제거하는 다양한 방법을 살펴보겠습니다.
2. 도커 이미지를 제거하는 이유는 무엇입니까?
Docker 엔진은 이미지를 저장하고 컨테이너를 실행합니다. 이를 위해, 도커 엔진은 "스토리지 풀"로 디스크 공간의 일정 금액을 보유 이미지, 컨테이너, (예 : 글로벌 도커 볼륨 또는 네트워크와 같은) 다른 모든 것들.
해당 스토리지 풀이 가득 차면 Docker 엔진이 작동을 멈춥니다. 더 이상 새 이미지를 생성하거나 다운로드할 수 없고 컨테이너가 실행되지 않습니다.
도커 이미지는 도커 엔진 스토리지 풀의 대부분을 차지합니다 . 따라서 Docker를 계속 실행하기 위해 Docker 이미지를 제거합니다 .
또한 Docker 엔진을 정리하고 깨끗하게 유지하기 위해 이미지를 제거 합니다. 예를 들어 개발 중에 더 이상 필요하지 않은 수십 개의 이미지를 쉽게 만들 수 있습니다. 또는 나중에 폐기할 수 있는 테스트를 위해 일부 소프트웨어 이미지를 다운로드합니다.
우리는 쉽게 우리가 부두 노동자 저장소에서 가져온하는 도커 이미지를 제거 할 수 있습니다 우리가 다시 그것을 필요로하는 경우, 우리가 번 저장소에서 당겨 것을 :.
그러나 우리는 우리가 직접 만든 Docker 이미지에 주의해야 합니다. 한 번 제거하면 저장하지 않는 한 자체 이미지가 사라집니다! Docker 이미지를 저장소로 푸시하거나 TAR 파일로 내보내 저장할 수 있습니다 .
3. PostgreSQL 13 베타 이미지 다운로드
PostgreSQL 은 오픈 소스 관계형 데이터베이스입니다. 우리는 사용할 것이다 처음 두 PostgreSQL의 13 베타 도커 이미지를 예로. 이 두 이미지는 비교적 작기 때문에 빠르게 다운로드할 수 있습니다. 그리고 베타 소프트웨어이기 때문에 Docker 엔진에 아직 없습니다.
베타 2 이미지를 사용하여 컨테이너를 만듭니다. 베타 1 이미지를 직접 사용하지 않습니다.
그러나 이 두 이미지를 다운로드하기 전에 먼저 Docker 이미지가 스토리지 풀에서 차지하는 공간을 확인하겠습니다.
docker system df --format 'table {{.Type}}\t{{.TotalCount}}\t{{.Size}}'
다음은 테스트 머신의 출력입니다. 첫 번째 줄은 71개의 Docker 이미지가 7.8GB를 사용한다는 것을 보여줍니다.
TYPE TOTAL SIZE
Images 71 7.813GB
Containers 1 359.1MB
Local Volumes 203 14.54GB
Build Cache 770 31.54GB
이제 두 개의 PostgreSQL 이미지를 다운로드하고 Docker 스토리지 풀을 다시 확인합니다.
docker pull postgres:13-beta1-alpine
docker pull postgres:13-beta2-alpine
docker system df --format 'table {{.Type}}\t{{.TotalCount}}\t{{.Size}}'
예상대로 이미지 개수는 71개에서 73개로 늘어났고 전체 이미지 크기는 7.8GB에서 8.1GB로 늘었다.
간결함을 위해 첫 번째 줄만 보여드리겠습니다.
TYPE TOTAL SIZE
Images 73 8.119GB
4. 단일 이미지 제거
PostgreSQL 13 베타 2 이미지로 컨테이너를 시작하겠습니다. PostgreSQL 컨테이너가 비밀번호 없이 시작되지 않기 때문에 secr3t 를 데이터베이스 루트 사용자의 비밀번호로 설정 했습니다 .
docker run -d -e POSTGRES_PASSWORD=secr3t postgres:13-beta2-alpine
docker ps --format 'table {{.ID}}\t{{.Image}}\t{{.Status}}'
테스트 머신에서 실행 중인 컨테이너는 다음과 같습니다.
CONTAINER ID IMAGE STATUS
527bfd4cfb89 postgres:13-beta2-alpine Up Less than a second
이제 PostgreSQL 13 베타 2 이미지를 제거하겠습니다. 우리가 사용하는 이미지 RM 고정 표시기 도커 이미지를 제거합니다 . 이 명령은 하나 이상의 이미지를 제거합니다.
docker image rm postgres:13-beta2-alpine
실행 중인 컨테이너가 여전히 해당 이미지를 사용하기 때문에 이 명령은 실패합니다.
Error response from daemon: conflict: unable to remove repository reference "postgres:13-beta2-alpine" (must force) - container 527bfd4cfb89 is using its referenced image cac2ee40fa5a
따라서 docker ps 에서 얻은 ID를 사용하여 실행 중인 컨테이너를 중지하겠습니다 .
docker container stop 527bfd4cfb89
이제 이미지를 다시 제거하려고 합니다. 동일한 오류 메시지가 나타납니다. 실행 여부에 관계없이 컨테이너에서 사용하는 이미지를 제거할 수 없습니다 .
그럼 컨테이너를 제거해 보겠습니다. 그런 다음 마침내 이미지를 제거할 수 있습니다.
docker container rm 527bfd4cfb89
docker image rm postgres:13-beta2-alpine
Docker 엔진은 이미지 제거에 대한 세부 정보를 인쇄합니다.
Untagged: postgres:13-beta2-alpine
Untagged: postgres@sha256:b3a4ebdb37b892696a7bd7e05763b938345f29a7327fc17049c7148c03ff6a92
removed: sha256:cac2ee40fa5a40f0abe53e0138033fe7a9bcee28e7fb6c9eaac4d3a2076b1a86
removed: sha256:6a14bab707274a8007da33fe08ea56a921f356263d8fd5e599273c7ee4880170
removed: sha256:5e6ef40b9f6f8802452dbca622e498caa460736d890ca20011e7c79de02adf28
removed: sha256:dbd38ed4b347c7f3c81328742a1ddeb1872ad52ac3b1db034e41aa71c0d55a75
removed: sha256:23639f6bd6ab4b786e23d9d7c02a66db6d55035ab3ad8f7ecdb9b1ad6efeec74
removed: sha256:8294c0a7818c9a435b8908a3bcccbc2171c5cefa7f4f378ad23f40e28ad2f843
고정 표시기 시스템 DF는 제거를 확인 : 이미지의 수는 72에 73로 감소 그리고 전체 이미지 크기가 8.1 GB 8.0 GB에 갔다 :
TYPE TOTAL SIZE
Images 72 7.966GB
5. 이름으로 여러 이미지 제거
이전 섹션에서 방금 제거한 PostgreSQL 13 베타 2 이미지를 다시 다운로드해 보겠습니다.
docker pull postgres:13-beta2-alpine
이제 베타 1 이미지와 베타 2 이미지를 이름으로 제거하려고 합니다. 지금까지 베타 2 이미지만 사용했습니다. 앞서 언급했듯이 베타 1 이미지를 직접 사용하지 않으므로 지금 제거하면 됩니다.
불행히도 docker image rm 은 이름으로 제거하는 필터 옵션을 제공하지 않습니다. 대신 Linux 명령을 연결하여 이름으로 여러 이미지를 제거합니다 .
docker pull 명령 과 같이 저장소 및 태그별로 이미지를 참조합니다 . 저장소는 postgres 이고 레이블은 13-beta1-alpine 및 13-beta2-alpine 입니다.
따라서 이름으로 여러 이미지를 제거하려면 다음을 수행해야 합니다.
- postgres:13-beta2-alpine 과 같은 리포지토리 및 태그별로 모든 이미지 나열
- 그런 다음 grep 명령 을 사용하여 정규식을 통해 해당 출력 라인을 필터링합니다 . ^postgres:13-beta
- 마지막으로 docker image rm 명령에 해당 줄을 입력합니다.
이것들을 합치기 시작합시다. 정확성을 테스트하기 위해 다음 조각 중 처음 두 개만 실행해 보겠습니다.
docker image ls --format '{{.Repository}}:{{.Tag}}' | grep '^postgres:13-beta'
그리고 테스트 머신에서 우리는 다음을 얻습니다.
postgres:13-beta2-alpine
postgres:13-beta1-alpine
이제 docker image rm 명령에 추가할 수 있습니다 .
docker image rm $(docker image ls --format '{{.Repository}}:{{.Tag}}' | grep '^postgres:13-beta')
이전과 마찬가지로 실행 중이거나 중지된 컨테이너가 이미지를 사용하지 않는 경우에만 이미지를 제거할 수 있습니다. 그러면 이전 섹션과 동일한 이미지 제거 세부 정보가 표시됩니다. 그리고 docker system df 는 테스트 머신에서 7.8GB의 71개 이미지로 돌아갔다는 것을 보여줍니다.
TYPE TOTAL SIZE
Images 71 7.813GB
이 이미지 제거 명령은 Linux 및 Mac의 터미널에서 작동합니다. Windows에서는 Docker Toolbox 의 "Docker Quickstart Terminal"이 필요합니다 . 미래에는 Windows용 최신 Docker Desktop 도 Windows 10에서 이 Linux 명령과 함께 작동 할 수 있습니다 .
6. 크기별 이미지 제거
디스크 공간을 절약하는 가장 좋은 방법은 가장 큰 Docker 이미지를 먼저 제거하는 것입니다.
이제 docker image ls도 크기별로 정렬할 수 없습니다. 따라서 모든 이미지를 나열 하고 크기별로 이미지를 보기 위해 sort 명령을 사용하여 해당 출력을 정렬 합니다 .
docker image ls | sort -k7 -h -r
테스트 머신에서 다음을 출력합니다.
collabora/code 4.2.5.3 8ae6850294e5 3 weeks ago 1.28GB
nextcloud 19.0.1-apache 25b6e2f7e916 6 days ago 752MB
nextcloud latest 6375cff75f7b 5 weeks ago 750MB
nextcloud 19.0.0-apache 5c44e8445287 7 days ago 750MB
다음으로 제거할 항목을 찾기 위해 수동으로 검토합니다. ID 열 3은 저장소 및 태그 열 1과 2보다 복사 및 붙여넣기가 더 쉽습니다. Docker를 사용하면 한 번에 여러 이미지를 제거할 수 있습니다.
nextcloud:latest 및 nextcloud:19.0.0-apache 를 제거하고 싶다고 가정해 보겠습니다 . 간단히 말해서, 테이블에서 해당 ID를 보고 docker image rm 명령 에 나열할 수 있습니다 .
docker image rm 6375cff75f7b 5c44e8445287
이전과 마찬가지로 컨테이너에서 사용하지 않는 이미지만 제거할 수 있으며 일반적인 이미지 제거 세부정보를 볼 수 있습니다. 이제 테스트 시스템에서 7.1GB의 이미지가 69개로 줄어듭니다.
TYPE TOTAL SIZE
Images 69 7.128GB
7. 생성 날짜별 이미지 제거
Docker는 생성 날짜까지 이미지를 제거할 수 있습니다 . 이를 위해 새로운 docker image prune 명령을 사용합니다. docker image rm 과 달리 여러 이미지 또는 모든 이미지를 제거하도록 설계되었습니다.
이제 2020년 7월 7일 이전에 생성된 모든 이미지를 제거하겠습니다.
docker image prune -a --force --filter "until=2020-07-07T00:00:00"
여전히 컨테이너에서 사용하지 않는 이미지만 제거할 수 있으며 일반적인 이미지 제거 세부정보는 계속 볼 수 있습니다. 이 명령은 테스트 시스템에서 2개의 이미지를 제거했으므로 테스트 시스템에서 67개의 이미지와 5.7GB에 도달했습니다.
TYPE TOTAL SIZE
Images 67 5.686GB
생성 날짜별로 이미지를 제거하는 또 다른 방법은 마감 날짜 대신 시간 범위를 지정하는 것입니다. 일주일이 지난 모든 이미지를 제거하고 싶다고 가정해 보겠습니다.
docker image prune -a --force --filter "until=168h"
Docker 필터 옵션을 사용하려면 해당 시간 범위를 시간으로 변환해야 합니다.
8. 용기와 이미지 가지치기
docker image prune 은 사용하지 않는 이미지를 대량으로 제거합니다. 중지된 컨테이너를 대량 제거하는 docker container prune 과 함께 사용됩니다. 마지막 명령부터 시작하겠습니다.
docker container prune
경고 메시지를 인쇄합니다. 우리는 입력 할 필요가 Y 를 눌러 입력 진행 :
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
removed Containers:
1c3be3eba8837323820ecac5b82e84ab65ad6d24a259374d354fd561254fd12f
Total reclaimed space: 359.1MB
그래서 테스트 머신에서 이것은 하나의 중지된 컨테이너를 제거했습니다.
이제 이미지 관계에 대해 간략하게 논의할 필요가 있습니다. Java 클래스가 다른 Java 클래스를 확장하는 것처럼 Docker 이미지는 기능을 얻기 위해 다른 이미지를 확장합니다.
확장 중인 이미지 를 보려면 PostgreSQL 베타 2 이미지용 Dockerfile 의 상단을 살펴보겠습니다 .
FROM alpine:3.12
따라서 베타 2 이미지는 alpine:3.12 를 사용 합니다. 이것이 우리가 처음에 베타 2 이미지를 가져올 때 Docker가 암시적으로 alpine:3.12를 다운로드한 이유 입니다. docker image ls 에서는 이러한 암시적으로 다운로드된 이미지를 볼 수 없습니다 .
이제 PostgreSQL 13 베타 2 이미지를 제거했다고 가정해 보겠습니다. 다른 Docker 이미지가 alpine:3.12를 확장하지 않으면 Docker는 alpine:3.12를 소위 "dangling image"로 간주 할 것입니다. docker image prune 은 다음 매달린 이미지를 제거합니다.
docker image prune
이 명령은 입력 우리를 필요로 Y 키를 누릅니다 입력 진행 :
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
Total reclaimed space: 0B
테스트 머신에서는 이미지가 제거되지 않았습니다.
docker image prune -a 는 컨테이너에서 사용하지 않는 모든 이미지를 제거합니다 . 따라서 실행 중인 컨테이너가 없으면 모든 Docker 이미지가 제거됩니다 ! 그것은 실제로 위험한 명령입니다.
docker image prune -a
테스트 머신에서 모든 이미지가 제거되었습니다. docker system df 는 컨테이너와 이미지가 모두 남아 있지 않은지 확인합니다.
TYPE TOTAL SIZE
Images 0 0B
Containers 0 0B
9. 결론
이 기사에서는 먼저 단일 Docker 이미지를 제거하는 방법을 보았습니다. 다음으로 이름, 크기 또는 생성 날짜별로 이미지를 제거하는 방법을 배웠습니다. 마지막으로 사용하지 않는 모든 컨테이너와 이미지를 제거하는 방법을 배웠습니다.