- Server2가 CD 과정중에 용량 부족으로 실패하는 에러가 발생했다.
- 우리팀 서버는 EC2 프리티어를 사용하고있다.
- EC2 프리티어의 용량이 8GB 밖에 되지 않기 때문에 백업 버전관리를 서버에서 직접하지 않고 도커 허브를 통해서 하고 있었다.
- jenkins를 통해서 CI/CD결과를 받아보고 서버의 남은 용량이 5% 밖에 남지 않았다는 것을 인지하게 되었다. 직접 확인해 보니 정말로 5%밖에 남지 않았다.
- workflow에서 이전 버전의 container 및 image의 삭제를 자동화 해놓은상황이었기 때문에 서버에 직접 접속해서 남아있는 구버전의 container와 image가 남아있는지 명령어로 확인했다.
- 하지만 구버전의 image와 container는 존재하지 않았다.
- 확인해 보니 /var/lib/docker/overlay2 경로에서 많은 용량을 차지하고 있는 것을 발견했다.
- 문제를 찾아보니 /var/lib/docker/overlay2 가 용량이 큰 경우 diff/tmp 에 컨테이너 내부 파일구조 변경 사항들이 과도하게 쌓였기 때문이라고 한다. 이 파일은 삭제해도 동작에 큰 문제가 생기지 않는다고 한다.
- Docker 컨테이너의 작동원리는 여러 개의 레이어로 구성된 이미지를 기반으로 실행된다.
- 각 레이어는 독립적인 파일 시스템을 가지는데 이러한 레이어들을 효율적으로 관리하고 겹치게 하기 위해 Docker는 스토리지 드라이버를 사용한다.
- 이번에 문제가 된 overlay2 스토리지 드라이버는 Linux의 OverlayFS 기능을 활용한다.
- 이 기능은 OverlayFS는 여러 개의 디렉토리를 하나의 디렉토리처럼 겹치게 하여 사용할 수 있는 유니온 파일 시스템인데. 이를 통해 컨테이너가 실행되는 동안 기존 레이어에 변경사항이 발생하면, 해당 변경사항만을 새로운 레이어에 저장한다.
- 이렇게 변경된 내용만 새 레이어에 저장하는 전략을 Copy-on-Write(CoW)라고 한다.
- 정크 레이어들을 정리 후에 원활하게 동작한다.
참조 : https://velog.io/@newdana01/EC2-%EB%94%94%EC%8A%A4%ED%81%AC-%EC%9A%A9%EB%9F%89-%EB%B6%80%EC%A1%B1-%EC%9B%90%EC%9D%B8-%ED%8C%8C%EC%95%85%ED%95%98%EA%B8%B0-feat.-dockeroverlay2