블로그를 정적 웹으로 서비스하는 것이 유행인가 보다. 몰랐는데 가끔 보던, 사이트 소스를 GitHub 같은 곳에 올려둔 것이 그런 것이었던 것 같다. 앞 글에서 AWS 따라하기 했던 블로그가 그런 사이트이다. 코드 저장소에 hakyll을 이용하여 웹페이지를 만들어 내는 소스를 올려두고 AWS 서비스로 코드를 빌드해서 스태틱웹을 만든 다음에 그걸 AWS S3에 올리는 것이다. 코드를 빌드할 때는 자동으로 빌드하게 하는데 이런 것을 CI라고 하는가 보다. 가끔 광고에서나 글에서 보던 CI가 그거였던 것이다. 여기서 도커 이미지가 사용된다.

그 블로그를 따라서 hakyll 도커 이미지를 만들어 보았다. 그런데 몇 번 실패하다 보니 루트파일시스템 공간이 부족해져 버렸다. 보니까 /var/lib/docker/btrfs/subvolumes에 엄청난 공간이 쓰이고 있었다. 중간에 이미지를 막 중복해서 만들어 내고 실패 때문에 지우지 않아서 남겨진 것일까? docker image list로 이미지 리스트를 보고 이미지를 지워봤지만 subvolume들은 지워지지 않았다.

구글에 검색을 해 보니 도커 개발 GitHub에 btrfs와 연관된, 비슷한 이슈 보고가 있었고 들여다 보니 아직 해결되지 않은 듯하다. 그래서 btrfs 저장 드라이버를 쓰지 않도록 다른 하드디스크를 ext4로 포맷하여 /var/lib/docker에 마운트하고 빌드를 해 보았다. 그런데 overlay2 디렉토리에 엄청난 공간이 사용되고 이미지를 지워도 지워지지 않는 것은 똑같았다.

btrfs 문제가 아닌가? 그 해결이 안 되었다는, 이슈에 달린 댓글들은 다 뭐지? 그러다가 Prune unused Docker objects을 보았고 docker container prune을 하니 싹 지워져 버렸다.

거기 btrfs 디렉토리나 overlay2 디렉토리는 이미지 저장소가 아니라 컨테이너 공간이었던 것이다. 컨테이너는 가상머신이나 chroot 같은, 독립된 가상 루트파일시스템 같은 것이고 도커는 이 공간을 이용해서 빌드를 하다가 빌드가 끝나면 이미지로 만들어 내고 이 공간을 지우는 것 같다. 그런데 컨테이너가 빌드 실패로 중단되고 또 빌드하고 실패하면 이 컨테이너 영역을 도커가 알아서 지우지 않기 때문에 계속 공간 사용이 늘어난다. 도커는 다음 빌드 시도에 이 컨테이너를 재사용하는 것 같다. 그래서 남겨둔 것이다.

공간을 보존하려면 docker ps -a하면 중지된 컨테이너가 보이는데 이것들을 지워야 한다. 단순한 생각으로 docker container kill을 해 보았는데 이미 죽은 것이어서 죽지 않는다. docker container prune을 해야 하는 것이다. 도커 툴이 남은 공간을 체크하고 어떻게 해서 공간을 비울 수 있는지 알려 준다면 좋겠다.

ext4를 쓴 시도는 하드디스크 공간이 넉넉해서 이미지를 만들어 냈는데 이미지가 너무 크다. 5GB가 넘는다. 압축하면 더 작아지겠지만 많이 큰 것 같다. 도커 허브에는 hakyll 이미지가 대략 1GB 안팎이던데 뭘 어떻게 만들어야 하나.