[Docker] 디스크 용량으로 인한 배포 실패 상황
CodeDeploy를 통해 개발 서버에 배포 하던 중 배포가 실패된 상황이 발생했다.
No space left on device
맞다. 서버에 남은 공간이 없다는 말이다.
비용적인 문제로 인해 개발서버를 t2.micro에 띄워 배포하고 있었는데, 프리티어의 경우 storage volumn이 최대 30GB까지만 허용되기 때문에 30GB를 다 사용했다는 말이었다.
그런데, 여태 코드 몇 줄 추가 했다고 30GB가 전부 채워질리는 없었다.
그럼 먼저 용량을 한번 확인해보자.
$ sudo df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 475M 0 475M 0% /dev/shm
tmpfs 190M 3.0M 187M 2% /run
/dev/xvda1 30G 27G 3G 90% /
tmpfs 475M 0 475M 0% /tmp
/dev/xvda128 10M 1.3M 8.7M 13% /boot/efi
tmpfs 95M 0 95M 0% /run/user/1000
overlay 30G 27G 3G 90% /var/lib/docker/overlay2/8ac2a574daa56a8bfa9de4a4e5f06ffddb866
확인해 보면 docker에서 27GB의 용량을 차지하고 있는 것을 볼 수 있다.
overlay2?
overlay2에 관련해서는 다음 글을 참고하자.
https://seoarc.tistory.com/126
원인
/var/lib/docker/overlay2에 왜 이렇게 용량이 차있는걸까?
Docker를 통해 여러 번 새로운 배포를 수행하면 이 overlay2에 여러 임시파일이나 미사용 이미지, 컨테이너 파일 등이 남아있게 된다.
때문에, 먼저 중지된 컨테이너, 사용하지 않은 이미지, 삭제하지 않고 남긴 로그 데이터가 있진 않은지 다시 한번 확인해 보는 것이 좋다. 또 추가적으로 고정된 volume이 있다면 이 부분도 확인이 필요하다.
특히, 서버를 계속 실행하다 보면 로그가 쌓이기 마련인데, Docker는 자체적으로 컨테이너 로그를 json으로 캐싱하는 json-file logging driver를 사용한다. 이로 인해 로그가 쌓여 디스크가 고갈되는 경우가 생긴다. (
https://docs.docker.com/config/containers/logging/configure/
해당 문서에서는 디스크 고갈 방지를 위해 local logging driver를 구성하여 사용할 것을 권장하고 있다.
두번째로, 이미지에 대한 변경사항들이 과도하게 쌓이지 않았는지 확인해보는 것이 좋다. 이는 Docker가 유니온 파일 시스템 구조를 사용하고 있기 때문인데, 유니온 파일 시스템은 Copy-on-Write(CoW) 전략을 사용하기 때문에 변경사항을 원본에 반영하지 않고 따로 저장하게 된다.
유니온 파일 시스템에 관련하여 추가적으로 알고 싶다면 다음 링크를 확인해보자.
https://seoarc.tistory.com/126
만약 남긴 데이터가 없다면, 남은 것은 캐시 데이터일 확률이 높다. Docker는 이미지 레이어를 재사용하기 위해 캐싱하는데, 이미지를 삭제해도 캐시가 남아있을 수 있기 때문에 이를 삭제해줘야 한다.
https://depot.dev/blog/docker-clear-cache
해결
미사용 리소스 삭제
이제 디스크 공간을 지우기 위한 방법을 알아보자.
먼저 docker에는 prune이라는 명령이 있는데, 이 명령을 통해 사용하지 않는 리소스를 삭제할 수 있다.
- Docker 캐시에서 컨테이너 제거: docker container prune
- 이미지 제거: docker image prune
- 볼륨 제거: docker volume prune
- 빌드 캐시 제거: docker buildx prune
- 네트워크 제거: docker network prune
- 모든 것을 제거: docker system prune
prune 명령 시 삭제할 거냐는 경고문이 발생한다. 경고문을 띄우고 싶지 않다면 -f 옵션을 붙여 수행하면된다.
[참고]
[1] https://junstar92.tistory.com/170#1.-%EC%8A%A4%ED%86%A0%EB%A6%AC%EC%A7%80-%EB%93%9C%EB%9D%BC%EC%9D%B4%EB%B2%84%EC%9D%98-%EC%9B%90%EB%A6%AC
[2] https://docs.redhat.com/ko/documentation/openshift_container_platform/3.11/html/scaling_and_performance_guide/comparing-overlay-graph-drivers
[3] https://docs.redhat.com/ko/documentation/red_hat_enterprise_linux/7/html/7.2_release_notes/technology-preview-file_systems#technology-preview-file_systems
[4] https://docs.docker.com/storage/storagedriver/
[5] https://blog.naver.com/alice_k106/221530340759
[6] https://uiandwe.tistory.com/1313
[7] https://ngela.tistory.com/90
[8] https://velog.io/@lom/Docker-overlay2
'DevOps > Docker' 카테고리의 다른 글
[Docker] docker의 용량을 차지하는 overlay2는 무엇일까? (0) | 2024.07.28 |
---|