docker prune으로 사용하지 않는 도커 오브젝트 정리하여 서버 용량 확보하기
docker를 운영하다보면 서버 용량이 가득차거나 사용하지 않는 오브젝트를 정리하는 순간이 찾아온다.
그 때 docker prune 명령어로 정리할 수 있다.
이번에는 호스트 서버 디스크가 85%이상 사용중이었고,
컨테이너에서 마운트해놓은 경로의 로그 용량이 작아서 도커 오브젝트가 차지하는 용량을 정리해야겠다고 판단했다.
기본 명령어
docker [오브젝트|system] prune [옵션]
docker image prune [옵션]
사용하지 않는 도커 이미지는 생각보다 적은 용량을 차지하고 있었다.
[admin@dev-server ~]$ docker image prune -a
WARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N] y
Deleted Images:
untagged: temp-auth:latest
deleted: sha256:3688849f122dd66e41334e0999bf143de5475db21c9068d0d90052fd899c3561
untagged: traefik/whoami:latest
untagged: traefik/whoami@sha256:24829edb0dbaea072dabd7d902769168542403a8c78a6f743676af431166d7f0
deleted: sha256:420d3c2af3570ad1ced363bce5b284a4c662cf7ee178e261ae42b7d750d488a4
deleted: sha256:502d1ce781b144943b00641e3316410ab4c36af5f8006ad4e69319d9fdb70466
deleted: sha256:a580db4c8ae9a8088edf1b44c0829709a74fbd8a963975756755cb10565f292c
deleted: sha256:a93d348aa1e336f3bf37c03a3e185058d9b1f798274d5a7a79649bb270f6704b
deleted: sha256:c42099ad57ea09d7cedd586c8d1c36c19ebe59fb215822565cddc648697072bc
deleted: sha256:31380d0fa3861946af8270b66b6ad4f3ec5b068853013905cdd479b67300d291
Total reclaimed space: 6.508MB
생성되어있지만 실행 상태가 아닌 컨테이너를 정리하는 명령어이다.
stop상태의 컨테이너가 없어서 아무것도 지워지지 않았다.
[admin@dev-server ~]$ docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Total reclaimed space: 0B
도커 이미지가 차지하는 용량이 생각보다 적었기 때문에, 볼륨에 많은 로그 파일이 쌓여있을 것이라 예상했다.
그러나 도커 볼륨도 생각보다는 적은 용량을 차지하고 있었다.
[admin@dev-server~]$ docker volume prune
WARNING! This will remove all local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Volumes:
675aa728ebf407617b37514640f80fc442fbfe2b48d8aec1e5dc8ba0dcf3ebcb
a261d31b2926204f1f4a80aa8f1bc29097d7104037863c5f82d4361767d770af
d88f6e41f5664deb473a0b55fa860e147e8a6dbb55787f8ef4ce98407fcc9c1e
e4470a97b394fda2e901e5f5bdbe55044867e0bd91d7cddb1ff36951d4dbadef
06ad089b99a5f7c162319ebf87c5f0fda574d81ee631f3913666433598a6cef7
07f8b6cb138483ea17b852435d3d4415a4535cef31f2617474ab2d3ab324286a
78cc888226b3890af4cf118adb860bd2ea1a169d2d3d7f48953254505fa67ae6
ae6bb58b9fd590b6d4e53d364167aeb37af94d936277154080e614278960f74b
d7f0569feab7d89ac6eb3a40f792fabb378fb33799fdb90cde5c796ed229d548
348db8b94ed0a989687f48e88f17646f06dac000f3d8fdea9849cd71e187eed0
715c095ca128eca6ee84c3222a31d1d2850f7a58a4296ddf290a5c3fb04d27a2
5b1b7ea8792fb60b3d4b124bc91785b4f5d71a710c24aeba80f29ad608ebf131
a108b50dded47a43b9e5ff7f2b33f940035352c79aa4b6f04743250079b88f17
a806e782e33c86c1b879284c898d6d21a58a916d9a9ef6a463ef36ca17834eb7
c098f2b51fb59cbd53e061d7912827fa2a5ca57624f45403cc491f821a06b74e
cc27e3d6f7eb5d48f5190d412c6e925891adf62986e7cbf47b28c097a176fe0b
da2859538d459509c25316ea8e6b61a9e4ee754d3e74541b679ff02a4766a27e
de52ff6d2b8689ae2264e9bb68b2f12a77bc7da61ee6da1a1662a78492520201
78d27e695418a6e095ab9de5af47b14f3c6fefbd9805f5814c797db04f3b9d37
Total reclaimed space: 1.611GB
사용하지 않는 네트워크를 삭제한다.
[admin@dev-server ~]$ docker network prune
WARNING! This will remove all custom networks not used by at least one container.
Are you sure you want to continue? [y/N] y
위의 오브젝트를 하나씩 지우지 않고, 모두 한 번에 정리하는 명령어가 있다.
docker system prune
1) 중지된 모든 컨테이너
2) 사용하지 않는 네트워크
3) 댕글링? 이미지
4) 댕글링? 빌드 캐시
<none>:<none>
처럼 이름도 태그도 달려있지 않은 이미지들[admin@dev-server ~]$ docker system prune
WARNING! This will remove:
- all stopped containers
- all networks not used by at least one container
- all dangling images
- all dangling build cache
Are you sure you want to continue? [y/N] y
Deleted build cache objects:
iiys59fflwy6yjd7xj8l1hol9
v2rkgvwv2lxuvkpbslyxha71y
3nj0qlpu2n7wf39iqk5uwwawl
...
uuvgrhzgv3kxt0ebpwqdn910h
Total reclaimed space: 28.73GB
나머지 오브젝트는 모두 위에서 하나씩 개별적으로 삭제명령을 내려봤으니 all dangling build cache만 남은 것이고,
이 용량이 29GB 가까이 된다는 것을 확인할 수 있었다.
이중화된 두 개의 서버 중 한 서버에서 빌드 캐시를 삭제한 후 배포를 진행했다.
빌드 캐시 존재 유무가 다른 두 서버 간의 빌드 속도 차이를 확인해보기 위함이었다.
1번 서버는 빌드 캐시를 모두 삭제했기 때문에 빌드가 6분 이상 소요되었고,
2번 서버는 빌드 캐시를 사용하기 때문에 빌드가 1분만에 성공한 것을 확인했다.
서버 용량 관리 및 도커 관리를 위해 주기적으로 docker prune명령을 실행하려 한다.
실행 후에는 다시 빌드를 호출해서 캐시를 만들어 놓아야 다음 배포시 빠른 빌드가 가능할 것이다.