docker logs <컨테이너>로 로그를 보는 건 익숙하지만, 운영에서 진짜 문제는 따로 있습니다. 어느 날 디스크가 꽉 차서 확인해 보면 /var/lib/docker/containers/.../*-json.log 한 파일이 수십 GB를 차지하고 있는 경우입니다. 도커는 기본적으로 컨테이너 표준출력을 무제한 json 파일에 계속 쌓기 때문입니다. 로그 드라이버와 로테이션을 이해하면 이 문제를 막을 수 있습니다.
1단계 — 지금 어떤 드라이버를 쓰는지 본다
# 데몬 기본 로그 드라이버
docker info --format '{{.LoggingDriver}}'
# 특정 컨테이너의 드라이버
docker inspect -f '{{.HostConfig.LogConfig.Type}}' <컨테이너>
# 로그 파일이 실제로 얼마나 큰지
sudo du -sh /var/lib/docker/containers/*/*-json.log
기본값이 json-file이고 옵션이 없다면, 로테이션 없이 무한히 커지는 상태입니다.
로그 드라이버 비교
| 드라이버 | 특징 | 언제 쓰나 |
|---|---|---|
json-file | 기본값, docker logs 사용 가능 | 로테이션 옵션 필수 |
local | 압축·로테이션 내장, 더 효율적 | 단일 호스트 운영 권장 |
journald | systemd 저널로 전송 | 호스트 로그와 통합 관리 |
none | 로그 비활성화 | 로그가 불필요한 배치 작업 |
json-file과 local은 docker logs가 동작하지만, journald로 보내면 journalctl로 봐야 합니다.
핵심 해결 — 로테이션을 강제한다
가장 중요한 설정은 파일 크기와 개수 제한입니다. 데몬 전체에 기본값을 주려면 /etc/docker/daemon.json을 수정합니다.
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
이러면 컨테이너당 로그가 10m 파일 3개, 즉 최대 30MB로 묶입니다. 적용은 데몬 재시작이 필요합니다.
sudo systemctl restart docker
주의: daemon.json의 기본값은 새로 만드는 컨테이너에만 적용됩니다. 이미 떠 있는 컨테이너는 재생성해야 반영됩니다.
컨테이너별로 지정하기
데몬 전체가 아니라 특정 컨테이너만 제어하려면 실행 시 옵션을 줍니다.
docker run -d \
--log-driver json-file \
--log-opt max-size=10m \
--log-opt max-file=3 \
myapp
docker-compose.yml에서는 서비스 아래 logging.driver와 logging.options로 같은 값을 지정합니다.
체크리스트
docker info --format '{{.LoggingDriver}}' # 기본 드라이버 확인
sudo du -sh /var/lib/docker/containers/*/*-json.log # 현재 로그 크기
docker inspect -f '{{.HostConfig.LogConfig}}' <컨테이너> # 로테이션 적용 여부
이미 비대해진 로그 파일은 컨테이너를 재생성하면 정리되며, 이후부터는 로테이션 안에서 관리됩니다.
로그 드라이버를 바꾸고 로테이션이 실제로 동작하는지 확인하는 실습은 도커 트랙에서 무료로 할 수 있습니다.