본문 바로가기

전산

# Docker에서 로그파일을 주기적으로 삭제하는 방법

반응형

Docker는 경량화된 컨테이너 환경을 제공해 어플리케이션 배포를 혁신적으로 변화시켰습니다. 그러나 Docker 컨테이너가 생성하고 남기는 로그 파일은 시간이 지남에 따라 디스크 공간을 압도적으로 차지할 수 있습니다.

Docker 로그 파일을 정기적으로 삭제하지 않으면 시스템 운영에 영향을 주거나, 컨테이너가 비정상 종료될 수도 있습니다. 이 글에서는 Docker에서 생성되는 로그 파일의 구조를 이해하고, 자동으로 정기 삭제하거나 사이즈를 제한하는 설정 방법을 실전 중심으로 설명합니다.


1. Docker 로그 파일은 어디에 저장될까?

기본적으로 Docker는 json-file 로그 드라이버를 사용하며, 각 컨테이너의 로그는 다음 경로에 저장됩니다:

/var/lib/docker/containers/<container-id>/<container-id>-json.log

이 파일은 stdout, stderr를 기록하며 용량 제한 없이 무한정 증가합니다. 따라서 반드시 로깅 정책을 설정하거나, 주기적으로 삭제 작업을 설정해야 합니다.


2. 로그가 디스크를 가득 채울 경우 생기는 문제

  • 컨테이너 중단: 디스크가 가득 차면 컨테이너 재시작 실패
  • 서버 다운: /var 파티션 과부하로 시스템 장애 발생
  • 디버깅 불가: 로그 분석이 어려워 운영 리스크 발생
  • 성능 저하: 대용량 로그 파일 처리 시 CPU/IO 병목 발생

3. Docker 로그를 주기적으로 삭제하는 방법 3가지

1) 로그 로테이션 설정 (추천)

가장 안전하고 공식적인 방법은 Docker 데몬 설정을 통해 로그 파일의 최대 크기와 보관 개수를 지정하는 것입니다.

설정 방법 (Ubuntu 기준):

  1. Docker 데몬 설정 파일 수정:
sudo nano /etc/docker/daemon.json
  1. 아래와 같이 추가:
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "5"
  }
}
  • max-size: 로그 파일 최대 크기 (예: 10MB)
  • max-file: 최대 보관 파일 수 (초과 시 삭제됨)
  1. Docker 데몬 재시작:
sudo systemctl restart docker

이 설정은 새로 생성되는 컨테이너에만 적용됩니다. 기존 컨테이너는 재배포 필요.


2) 기존 로그 수동 삭제 스크립트 + cron

이미 생성된 컨테이너의 로그 파일이 너무 크다면, 아래처럼 수동 삭제 또는 자동화 스크립트를 사용할 수 있습니다.

스크립트 예제:

#!/bin/bash
echo "===== Docker 로그 정리 시작 ====="
containers=$(docker ps -q)

for container in $containers; do
    log_path=$(docker inspect --format='{{.LogPath}}' $container)
    echo "" > $log_path
done

echo "===== Docker 로그 정리 완료 ====="

자동 실행 (cron 등록):

crontab -e
0 2 * * * /usr/local/bin/docker-log-clean.sh
  • 매일 새벽 2시에 로그 파일을 초기화

💡 로그 파일을 비우는 것은 삭제가 아닌 “내용 제거”이며, inode는 유지됩니다.


3) 로그 드라이버 변경 (optional)

json-file 외에도 syslog, journald, awslogs, fluentd, gelf 등 외부 로그 수집기를 사용할 수 있습니다. 로그 수집 서버를 운영 중이라면 json 로그 자체를 생성하지 않도록 변경 가능합니다.

docker run --log-driver=syslog nginx

대규모 운영 환경에서는 로그를 외부로 전송하고, Docker 내 저장은 최소화하는 전략이 좋습니다.


4. 기존 컨테이너에 로그 설정 적용하는 방법

기존 컨테이너는 재시작으로는 반영되지 않으며, 재배포(recreate)가 필요합니다.

  1. 기존 컨테이너 설정 확인 후 백업
  2. 컨테이너 중지 및 삭제
docker stop <container>
docker rm <container>
  1. 새 설정 적용 후 재생성:
docker run --log-opt max-size=10m --log-opt max-file=5 [OPTIONS] image_name

5. logrotate로 직접 관리하는 방법

/var/lib/docker/containers 경로를 직접 타겟팅하여 logrotate 설정도 가능합니다.

logrotate 설정 예시:

/var/lib/docker/containers/*/*.log {
    daily
    rotate 7
    compress
    missingok
    copytruncate
    notifempty
}
  • copytruncate: 로그 파일을 잘라내고 원래 파일은 유지
  • notifempty: 빈 파일은 무시
  • rotate 7: 7일치 로그만 유지

설정 파일을 /etc/logrotate.d/docker-containers로 저장하면 시스템이 자동으로 관리합니다.


6. 실무 팁: 디스크 사용량 점검 자동화

디스크 사용량이 일정 이상이면 관리자에게 알리는 자동화도 가능합니다.

df -h /var | awk 'NR==2 {print $5}' | sed 's/%//' | while read usage; do
  if [ $usage -gt 85 ]; then
    echo "WARNING: /var 디스크 사용률 ${usage}% 초과!" | mail -s "Docker 로그 경고" admin@example.com
  fi
done

7. 자주 묻는 질문 (FAQ)

Q1. Docker 로그 파일 크기 제한은 모든 컨테이너에 자동 적용되나요?

A. 아니요. daemon.json 설정은 적용 이후 새로 생성되는 컨테이너에만 반영됩니다. 기존 컨테이너는 로그 정책을 포함하여 다시 배포해야 적용됩니다.


Q2. 로그 파일을 직접 삭제하면 문제가 생기나요?

A. 직접 rm으로 삭제하면 Docker 데몬이 해당 파일 핸들을 계속 참조하여 로그 기록이 멈추거나 파일이 재생성되지 않는 문제가 발생할 수 있습니다. echo "" > log파일 형태의 초기화 방식이 안전합니다.


Q3. 로그 드라이버를 변경하면 성능에 영향을 줄 수 있나요?

A. 로그 드라이버에 따라 처리 방식이 다르므로 성능 영향이 있을 수 있습니다. 예를 들어 fluentd로 외부 전송 시 네트워크 트래픽이 발생하므로, 로컬 저장보다 I/O 부담은 줄지만 네트워크 부하가 증가할 수 있습니다.


Q4. 로그 로테이션 설정 후에도 로그가 계속 커지는 이유는?

A. 다음과 같은 이유일 수 있습니다:

  • 해당 컨테이너는 새 설정 적용 전 생성된 것
  • 로그 파일이 로테이션 되지 않고 계속 참조 중
  • 데몬 재시작이 누락됨

Q5. logrotate와 json 로그 삭제를 병행해도 괜찮나요?

A. 병행 사용은 가능하지만 중복되거나 충돌될 수 있으므로 한 가지 방식으로 통일하는 것이 안전합니다. Docker 데몬 자체 설정이 가장 안전한 방법입니다.


요약

항목 방법
로그 기본 위치 /var/lib/docker/containers/<id>/<id>-json.log
삭제 주기 설정 daemon.json 또는 log-opt 설정
자동 삭제 도구 cron, logrotate, log-driver 변경
권장 옵션 max-size, max-file 조합
로그 무중단 초기화 echo "" > log파일 또는 copytruncate
대안 방법 로그 수집기로 외부 전송 (ELK, Fluentd 등)

마무리

Docker는 편리한 도구지만, 로그 파일을 관리하지 않으면 시스템에 큰 부담을 줄 수 있습니다. 로그 로테이션 설정, 크론 자동화, 적절한 로그 드라이버 선택 등을 통해 디스크 공간을 확보하고, 안정적인 서비스 운영을 실현하세요.

운영 환경에 따라 로그를 외부로 전송하거나 중앙 로그 서버와 연계하는 것도 좋은 전략입니다. 단순 삭제보다 구조적 로그 전략이 서버 관리의 핵심입니다.


🔍 관련 키워드: Docker 로그 삭제, Docker 로그 자동 정리, json 로그 로테이션, docker log cleanup, daemon.json 설정, docker log rotation

반응형