| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 | 31 |
- virtualmachine
- 티스토리챌린지
- VM
- 오토바이
- 개발기
- 퇴근길
- 일상
- 휘발류
- FreeBSD
- Bloc
- 개발
- K&R
- 리눅스
- 연습문제
- 에러
- Linux
- node.js
- 오블완
- 인프라
- Flutter
- 주유소
- DART
- ubuntu
- VMware
- 가상머신
- 객체지향프로그래밍
- podman
- 잡담
- 템플릿
- C언어
- Today
- Total
그냥저냥
[컨테이너] registry 저장소 이미지 삭제~ 본문
우연히 디스크 용량 확인...
오늘 서버에 접속했는데 / (루트) 파티션 사용량이 91%나 되었다. / (루트) 파티션 총 용량이 226GB인데 193GB를 사용중이다. 이대로면 곧 디스크 사용량이 100%을 채울 것 같았다.
$ df -hT
Filesystem Type Size Used Avail Use% Mounted on
tmpfs tmpfs 782M 2.0M 780M 1% /run
efivarfs efivarfs 128K 75K 49K 61% /sys/firmware/efi/efivars
/dev/mapper/ubuntu--vg-ubuntu--lv ext4 226G 193G 21G 91% /
tmpfs tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/sda2 ext4 2.0G 183M 1.7G 11% /boot
/dev/sda1 vfat 1.1G 6.2M 1.1G 1% /boot/efi
tmpfs tmpfs 782M 16K 782M 1% /run/user/1000
어디서 용량을 사용하는지 찾아야 한다.
컨테이너로 여러가지 서비스를 실행중이다. 이전에 잠깐 언급했던 적이 있는데 Ubuntu를 설치하면서 생성한 관리자 계정에 실행하는 스크립트를 포함하여 설정, 데이터가 있다. 그래서 우선 관리자 계정 홈 디렉토리에서 사용량을 확인하였다.
$ du --max-depth=1 -h . 2>/dev/null
# ...생략...
33G ./registry
# ...생략...
34G .
찾았다. 그 중 ./registry 디렉토리에서 용량을 33GB 씩이나 사용중이다. 사용량은 좀 많다고 생각이 든다. 내부 네트워크 레지스트리는 컨테이너 이미지 저장소이다. 한 노드에서 빌드한 컨테이너 이미지를 레지스트리에 업로드한 후 다른 노드에서 공유 받아 사용할 수 있는 서비스이다.
아무튼 사용량이 많기 때문에 정리를 해야 한다.
가비지 컬렉터를 사용해보자
검색해보니 레지스트리 컨테이너 내부에 /bin/registry 명령어에 가비지 컬렉터 기능을 찾을 수 있었다. 그래서 이 기능을 실행했었다. 그러나 원하는 결과는 얻지 못했다. (이 명령어 실행 기록을 남기지 못했다. ㅠㅠ)
$ docker exec registry /bin/registry garbage-collect /etc/docker/registry/config.yml --delete-untagged=true
그냥 삭제하자!고 생각을 고쳐먹었다.
위의 과정에서 /bin/registry 명령어에 가비지 컬렉터 기능을 사용했었다. 그러나 원하는 결과를 얻지 못해 공유된 이미지를 삭제하는 방향으로 생각을 고쳐먹었다. 그래서 검색을 시도하였다.
카타로그를 확인하니 3개의 저장소가 있었다. 다른 저장소도 삭제를 해야 하지만 여기서는 api 저장소를 삭제하는 것으로 가정하고 진행하겠다.
$ curl http://localhost:5000/v2/_catalog
{"repositories":["admin","api","www"]}
레지시트리에 api 저장소에 태그 리스트를 확인하니 너무 많다. 막막하다. 노가다가 예상된다.
curl http://localhost:5000/v2/api/tags/list
{"name":"api","tags":["fa3e6fa3","0b8da581","74ca7377",...,"afa46695"]}
그래서 이후 절차를 확인하고 아래와 같은 스크립트를 작성하였다.
$ curl -X GET http://127.0.0.1:5000/v2/_catalog | jq -r '.repositories.[]' | while read catalog; do
curl -X GET http://127.0.0.1:5000/v2/${catalog}/tags/list | jq -r '.tags.[]' | while read tag; do
echo ${tag}
digest=$( curl -X GET -I -H 'Accept: application/vnd.docker.distribution.manifest.v2+json' http://127.0.0.1:5000/v2/${catalog}/manifests/${tag} | grep 'Docker-Content-Digest' | awk '{print $2}' | tr -d '\r' )
echo ${digest}
curl -X DELETE -v "http://127.0.0.1:5000/v2/${catalog}/manifests/${digest}"
done
done
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 79 100 79 0 0 10146 0 --:--:-- --:--:-- --:--:-- 11285
# ...생략...
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 27 100 27 0 0 13399 0 --:--:-- --:--:-- --:--:-- 27000
jq: error (at <stdin>:1): Cannot iterate over null (null)
jq와 관련되어 에러 메시지가 있으나 스크립트는 잘 실행이 되었던 것 같다.
아마도 ;;
다시 가비지 컬렉터 실행
위 스크립트를 그 다음 레지스트리에 가비지 컬렉터 기능을 다시 한번 실행해보았다. 결과를 확인했더니 아까 실행했던 것과는 다른 결과를 출력했다.
$ docker exec registry /bin/registry garbage-collect /etc/docker/registry/config.yml --delete-untagged=true
admin
api
www
0 blobs marked, 4666 blobs and 0 manifests eligible for deletion
blob eligible for deletion: sha256:46daed2c401bb556ab0ddac1faf9449ca0ea921e21e73f5081184df8329eecba
INFO[0000] Deleting blob: /docker/registry/v2/blobs/sha256/46/46daed2c401bb556ab0ddac1faf9449ca0ea921e21e73f5081184df8329eecba go.version=go1.16.15 instance.id=b99c2a93-115d-4701-a9a9-a51bbc9b1a31 service=registry
blob eligible for deletion: sha256:c9fa698fd8b0a2e5371d5b0429b7a5843d4af46805102a41ea5b6f26eb724ca8
INFO[0000] Deleting blob: /docker/registry/v2/blobs/sha256/c9/c9fa698fd8b0a2e5371d5b0429b7a5843d4af46805102a41ea5b6f26eb724ca8 go.version=go1.16.15 instance.id=b99c2a93-115d-4701-a9a9-a51bbc9b1a31 service=registry
blob eligible for deletion: sha256:e877da37a0d2ac908dde626fc795b2b029051278cc724e65d13d006fe7522429
INFO[0000] Deleting blob: /docker/registry/v2/blobs/sha256/e8/e877da37a0d2ac908dde626fc795b2b029051278cc724e65d13d006fe7522429 go.version=go1.16.15 instance.id=b99c2a93-115d-4701-a9a9-a51bbc9b1a31 service=registry
blob eligible for deletion: sha256:8fe9f3f8b0c5a36d0cb5391a500999fa70cbd8ae59cda06fdd6f0819766a2728
# ...생략...
디스크 용량 다시 확인
다시 디스크 용량을 확인하니 / (루트) 파티션 사용량이 76%로 줄어들었다.
$ df -hT
Filesystem Type Size Used Avail Use% Mounted on
tmpfs tmpfs 782M 2.0M 780M 1% /run
efivarfs efivarfs 128K 75K 49K 61% /sys/firmware/efi/efivars
/dev/mapper/ubuntu--vg-ubuntu--lv ext4 226G 161G 54G 76% /
tmpfs tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs tmpfs 5.0M 0 5.0M 0% /run/lock
/dev/sda2 ext4 2.0G 183M 1.7G 11% /boot
/dev/sda1 vfat 1.1G 6.2M 1.1G 1% /boot/efi
tmpfs tmpfs 782M 16K 782M 1% /run/user/1000
추가로 해야할 것!
카탈로그 다시 확인했더니 저장소 목록이 아직 나온다. 저장소 내부에 태그의 데이터만 삭제된 것 같다. 카탈로그에 나오는 3개의 저장소 자체를 삭제할 수 있는 방법을 찾아봐야겠다.
$ curl http://localhost:5000/v2/_catalog
{"repositories":["admin","api","www"]}'인프라' 카테고리의 다른 글
| 회고 | 도커, 내가 겪은 인프라 자동화(IaC) (0) | 2026.02.06 |
|---|---|
| 회고 | 리눅스를 처음 접했을 때! (0) | 2026.02.02 |
| [Kubernetes] 왜! NFS 볼륨을 사용하게 되었느냐! (0) | 2025.05.01 |
| [Linux] IP 할당과 관련하여... (0) | 2024.11.21 |
| [Linux] CentOS VLAN IP 할당하기 (0) | 2024.10.26 |