컨테이너 로그와 로그를 잃지 않는 방법
Docker 로그가 어디에 저장되는지, 디스크를 가득 채우지 않도록 크기를 제한하는 방법, 컨테이너를 다시 만들어도 기록이 남도록 하는 방법을 설명해요.
업데이트 2026년 8월 23일
서비스가 다운되면 로그만이 유일한 진실의 원천이에요. 기본적으로 Docker는 로그를 컨테이너 옆 파일에 기록하며 크기 제한을 두지 않아요. 로그를 많이 남기는 애플리케이션이라면 일주일 만에 디스크 전체를 채울 수도 있어요.
읽는 방법
docker logs -f --tail 100 <container>
docker compose logs -f app
docker compose logs --since 30m --timestamps app
docker logs <container> 2>&1 | grep -i error | tail -50
기억해 둘 점: Docker는 애플리케이션이 표준 출력과 표준 오류로 보내는 내용을 보여줘요. 애플리케이션이 컨테이너 내부의 자체 파일에 기록한다면 docker logs에는 아무것도 나타나지 않아요. 로그를 내부에서 찾거나 출력을 리다이렉트해야 해요.
docker compose exec app ls -la /var/log
지금 바로 크기 제한 걸기
모든 컨테이너에 적용되는 전역 설정은 /etc/docker/daemon.json에 있어요:
{
"log-driver": "json-file",
"log-opts": { "max-size": "20m", "max-file": "3" }
}
sudo systemctl restart docker
이 설정은 재시작 후 생성된 컨테이너에 적용돼요. 실행 중인 컨테이너는 다시 만들어야 해요. 단일 서비스라면 같은 내용을 Compose에 넣어요:
services:
app:
logging:
driver: json-file
options:
max-size: "20m"
max-file: "3"
결과: 무한정 늘어나는 대신 서비스당 최대 60 MB로 제한돼요.
예상치 못한 상황이 닥치기 전에 현재 크기를 확인하세요:
sudo du -sh /var/lib/docker/containers/*/*-json.log | sort -h | tail. 실행 중인 파일은rm으로 정리할 수 없어요. Docker가 파일 디스크립터를 잡고 있는 동안에는 공간이 해제되지 않아요. 올바른 방법은 컨테이너를 다시 만들거나sudo truncate -s 0 <file>을 실행하는 거예요.
컨테이너가 사라져도 로그 남기기
로그 파일은 컨테이너와 함께 삭제돼요. 기록이 중요하다면 시스템 저널에 넘기세요:
logging:
driver: journald
options:
tag: "myapp"
journalctl -t myapp -n 200 --since today
journalctl -t myapp -p err --since "2 days ago"
journald는 기록을 스스로 순환시키며 /etc/systemd/journald.conf의 SystemMaxUse 설정으로 크기가 제한돼요. 얼마나 공간을 차지하는지 확인하려면 journalctl --disk-usage를 실행하세요.
여러 서비스를 한꺼번에 다룰 때는 모든 로그를 한곳에 모으는 게 더 편해요. 예를 들어 기록을 날짜별 파일로 저장하는 전용 수집 컨테이너를 쓰는 방법이 있어요. 하지만 우선 journald로 시작하세요. 이미 설치되어 있고 비용도 들지 않아요.
장애를 디버깅할 때 살펴볼 것
- 크래시 직전 마지막 200줄:
docker logs --tail 200 <container>. - 종료 코드:
docker inspect -f '{{.State.ExitCode}} {{.State.OOMKilled}}' <container>. 코드 137과OOMKilled의true는 메모리 부족으로 커널이 프로세스를 종료했다는 뜻이에요. 리소스 제한을 참고하세요. - 머신의 시스템 로그:
sudo dmesg -T | tail -50을 실행하면 메모리 부족 종료와 디스크 오류를 볼 수 있어요.
흔한 실수
- 로그 때문에 디스크가 가득 차서 모든 서비스가 다운됐어요. Docker 설치 직후에 크기 제한을 거는 건 필수예요.
- 이미 삭제된 컨테이너의 로그를 들여다봐요.
docker compose down후에는 로그가 사라져요. 미리journald로 기록을 모으세요. - 로그에 비밀 정보가 남아요. 애플리케이션은 비밀번호가 포함된 연결 문자열을 즐겨 출력해요. 머신에 접근할 수 있는 사람은 누구나 로그를 읽을 수 있어요.
- 텍스트 콘솔에서 오류를 찾아요. 항상 80×24 크기라 긴 줄은 잘려요. 로그를 읽을 때는 SSH나 “Screen” 콘솔이 더 편해요.