지난 글에 이어 도커 컨테이너 내에 저장하던 로그를 stdout, stderr로 출력하도록 Dockerfile 을 수정해 빌드 해서 일단 컨테이너 내에 저장하는 것은 막았지만 결국 도커에서는 컨테이너에서 생성된 로그를 자동으로 *-json.log라는 파일로 저장해 주고 있었습니다.
도커 엔진 서비스의 기본 설정으로는 이 로그가 용량 제한 없이 저장되기 때문에 또다시 몇 달 뒤 파일시스템 용량 초과 문제가 생길게 뻔하죠.
결국 다른 경로로 로그를 저장하던지 아니면 우분투 기본 로그 파일 저장 방식처럼 일정 기간 적당히 잘라서 저장하고 그보다 오래된 것은 순차적으로 삭제해서 저장 공간을 유지하도록 해야 합니다.
구글에서 검색해 보니 도커는 1.8 버전 이후로 로그 저장 드라이버나 최대 저장 용량, 로테이션 로깅 최대 개수등을 지정할 수 있도록 기능을 가지고 있었습니다.
도커 설정 파일인 /etc/docker/daemon.json 파일을 수정해 아래 내용을 추가합니다. (만약 파일이 없다면 새로 만들어서 작성하면 됩니다. 보통 도커는 처음 설치한 경우 daemon.json 파일이 없습니다)
{
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "10",
"labels": "production_status",
"env": "os,customer"
}
}
위와 같이 하면 최대 100MiB까지 저장하고 로테이션 로그 파일을 10개까지 저장할 수 있도록 설정합니다.
당연히 도커 서비스를 재시작해야 합니다.
# systemctl status docker.service
또한 도커 서비스 재시작 전에 이미 떠있는 도커 컨테이너들도 적용하려면 마찬가지로 각 도커 컨테이너별로 재생성해줘야 로그 설정이 반영됩니다. (매우 중요)
저의 경우 아래와 같이 docker compose 를 사용하므로 아래와 같이 재시작하면 컨테이너를 재생성하게 됩니다. 이러면 로그 설정이 적용됩니다.
# docker compose down
# docker compose up -d
드디어 서버 저장 용량 초과 오류 걱정 없이 두발 쭉 뻗고 잘 수 있겠네요. ㅜㅜ
앞으로 해결할 점은 디버그 편의를 위해 프로젝트의 docker compose에 nginx 웹서버를 내장했었는데 이걸 릴리스 버전(혹은 프로덕션 버전)에서는 내장하지 않고 별도로 빼서 처리하는 구성 방법을 고민해 봐야겠습니다. 현재도 디버그 버전과 릴리스 버전이 슬슬 조금씩 설정이 달라지고 있거든요.
참고자료
- https://stackoverflow.com/questions/31829587/docker-container-logs-taking-all-my-disk-space
- https://docs.docker.com/config/containers/logging/configure/