HOWTO · Docker

Docker 컨테이너 로그 지우기

이 문서에서는 도커 컨테이너에서 로그를 지우는 데 사용할 수 있는 다양한 접근 방식을 설명합니다.

이 페이지의 내용

컨테이너 로그 파일을 잘라내면 Docker 로그를 수동으로 비울 수 있지만, Docker에는 범용 docker logs clear 명령이 없습니다. 로그를 지속적으로 보관하려면 로그 회전을 설정하세요. 먼저 컨테이너의 로깅 드라이버와 로그 경로를 확인해야 합니다. 경로와 지원되는 작업은 Docker 설정에 따라 다르며, 파일을 직접 수정하면 로깅을 방해하거나 변경 내용이 덮어써질 수 있습니다.

Docker 로그를 안전하게 관리하는 방법 선택하기

출력을 확인하려면 docker logs를 사용하세요. 당장 공간을 확보해야 한다면 권한이 있는 관리자가 드라이버와 경로를 확인한 뒤 컨테이너의 활성 로그 파일을 잘라낼 수 있습니다. 이는 신중하게 수행해야 하는 운영상 우회 방법이지, Docker가 지원하는 로그 관리 인터페이스는 아닙니다. 앞으로 늘어날 로그를 관리하려면 json-file 드라이버의 회전 한도를 설정하거나 환경에 필요한 보관 방식을 지원하는 로깅 드라이버를 선택하세요. 로그 회전은 시간이 지나면서 보관되는 데이터를 제한하며, 기존 항목을 즉시 지우지는 않습니다.

애플리케이션 프로세스는 진단 메시지와 일반 메시지를 표준 오류와 표준 출력에 기록하는 경우가 많습니다. Docker의 로깅 드라이버는 두 스트림을 모두 수집할 수 있습니다. 다음 간단한 예에서는 JSON 로그 레코드에 stdout과 stderr 스트림 레이블이 표시되는 방식을 볼 수 있습니다. 레이블과 출력은 영어로 표시됩니다.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

records = [
    {"stream": "stdout", "log": "ready\n"},
    {"stream": "stderr", "log": "warning\n"},
]
for record in records:
    print(f"{record['stream']}: {record['log'].rstrip()}")
stdout: ready
stderr: warning

Docker의 로깅 드라이버와 로그 경로 파악하기

파일을 찾거나 수정하기 전에 컨테이너가 어떤 드라이버를 사용하는지 확인하세요. docker inspect --format='{{.HostConfig.LogConfig.Type}}' CONTAINER는 설정된 로깅 드라이버를 보여 주고, docker inspect --format='{{.LogPath}}' CONTAINER는 Docker가 로그와 연결해 둔 경로를 보여 줍니다. CONTAINER를 컨테이너 이름이나 ID로 바꾸세요. 경로가 비어 있거나 접근할 수 없다고 해서 로그가 없다는 뜻은 아닙니다. 드라이버가 로그를 다른 곳으로 보내거나 Docker 데몬의 저장 위치와 권한이 현재 계정과 다를 수 있습니다.

json-file 드라이버는 대개 Docker 데이터 디렉터리에 레코드를 저장하며, 흔히 /var/lib/docker/containers/ 아래에서 찾을 수 있습니다. 하지만 위치는 설정에 따라 달라지며 권한이 제한된 사용자는 접근하지 못할 수도 있습니다. 모든 설치 환경에서 이 드라이버나 경로를 사용한다고 가정하지 마세요. 다른 드라이버는 레코드를 시스템 서비스나 원격 대상으로 보낼 수 있으며, 잘라낼 수 있는 로컬 파일을 제공하지 않을 수도 있습니다.

컨테이너 로그 확인하기

Docker가 수집한 출력을 읽으려면 docker logs CONTAINER를 사용하세요. 표시할 항목 수를 제한하려면 --tail 100을, 최근 항목만 보려면 --since 10m을, 타임스탬프를 포함하려면 --timestamps를 추가하세요. docker logs --follow CONTAINER로 새 레코드를 계속 확인할 수 있으며, 중지하려면 Ctrl+C를 누르세요. 이 명령은 드라이버가 제공하는 로그 스트림을 읽을 뿐 로그를 비우지는 않습니다.

드라이버가 json-file이면 복사한 컨테이너 ID로 경로를 조합하지 말고 Docker가 보고한 경로를 확인하세요. 필요한 호스트 접근 권한이 있다면 less나 tail 같은 도구로 해당 경로의 내용을 읽을 수 있습니다. JSON 레코드에는 스트림과 타임스탬프가 포함되지만, 형식과 필드는 드라이버마다 다릅니다. 일반적인 확인에는 docker logs를 사용하고, 파일을 직접 읽는 방법은 해당 드라이버를 진단할 때 사용하세요.

로그 파일을 수동으로 비우기

드라이버가 활성 로컬 파일을 사용하고 해당 파일을 수정할 권한이 있는 경우에만 수동으로 파일을 잘라낼 수 있습니다. Docker가 새 레코드를 쓰는 시점과 작업이 겹치거나, 유용한 진단 기록이 사라지거나, Docker가 지원하지 않는 동작이 발생할 수 있습니다. 필요한 기록은 미리 저장하고 컨테이너와 경로를 확인하세요. 유지보수 중에는 컨테이너를 중지하는 방안도 고려할 수 있습니다. 파일을 삭제하지 마세요. 로깅 드라이버가 해당 파일을 계속 열어 두고 있을 수 있습니다.

json-file 컨테이너의 경우 확인한 경로를 셸 변수에 담고, 파일을 잘라내기 전에 경로를 검증하세요. 다음 명령 패턴은 예시입니다. 호스트 셸, Docker 접근 권한 및 적절한 권한이 필요하므로 실행 결과는 제시하지 않습니다.

  • log_path=$(docker inspect --format='{{.LogPath}}' CONTAINER)
  • printf 'Log path: %s\n' "$log_path" — 계속하기 전에 예상한 비어 있지 않은 파일인지 확인하세요.
  • sudo truncate -s 0 -- "$log_path" — 해당 파일의 크기를 0바이트로 줄입니다.

truncate는 파일을 유지하면서 크기만 변경합니다. 대안인 sudo sh -c ': > "$1"' sh "$log_path"도 파일을 잘라냅니다. sudo echo ... > file은 셸이 sudo로 권한을 높이기 전에 리디렉션을 처리하므로 사용하지 마세요. 확인하지 않은 컨테이너의 경로나 다른 드라이버가 관리하는 파일에는 어느 방법도 실행하지 마세요. 애플리케이션이 다시 기록하면 새 메시지가 곧 나타날 수 있습니다.

지속적인 보관을 위해 로그 회전 설정하기

json-file로 로그를 지속적으로 보관하려면 Docker에서 max-size와 max-file 옵션을 지원합니다. 지원되는 옵션과 동작 방식은 공식 Docker json-file 로깅 드라이버 문서를 참고하세요. 데몬 전체 설정은 Docker 데몬의 daemon.json에 기본값을 지정할 수 있으며, Linux에서는 보통 /etc/docker/daemon.json에 있습니다. 기존 JSON의 다른 설정을 덮어쓰지 말고 다음 키를 병합하세요.

{"log-driver":"json-file","log-opts":{"max-size":"10m","max-file":"3"}}

데몬 설정에서 Docker 로깅 옵션 값은 문자열이어야 합니다. 이 예시는 파일당 약 10MB에서 회전하고 컨테이너마다 최대 세 개의 파일을 보관하도록 요청합니다. 실제 디스크 사용량에는 기록 중인 데이터와 다른 Docker 데이터도 포함됩니다. 변경을 적용하기 전에 파일의 유효성을 확인하고 해당 플랫폼의 데몬 설정을 참고하세요. 데몬 전체 기본값은 새로 만드는 컨테이너에 적용됩니다. 기존 컨테이너에서 변경된 기본값을 사용하려면 컨테이너를 다시 만들어야 할 수 있습니다. 재시작이나 다시 불러오기 방식은 플랫폼과 데몬 설정에 따라 다르므로 systemctl reload docker가 지원된다고 가정하지 마세요.

새 컨테이너 하나에 옵션을 지정하려면 docker run에 --log-driver json-file --log-opt max-size=10m --log-opt max-file=3을 전달하세요. 컨테이너별 설정은 데몬 기본값보다 우선합니다. 다른 드라이버에 이 옵션을 적용하기 전에 해당 드라이버의 문서를 확인하세요. 지원되는 설정은 드라이버마다 다릅니다.

결과 확인 및 일반적인 문제 해결

수동으로 파일을 잘라낸 뒤 docker logs --tail 20 CONTAINER를 실행하고, 권한이 있다면 보고된 파일 크기도 확인하세요. 결과가 비어 있어도 이는 선택한 드라이버가 현재 반환하는 내용만 나타냅니다. 애플리케이션 출력은 곧바로 다시 들어올 수 있습니다. 로그 회전을 설정한 뒤에는 컨테이너의 로깅 설정을 확인하고, 회전이 진행되는지 확인할 수 있을 만큼 일정 시간 동안 출력을 발생시키세요. 회전은 이후 기록에 적용되므로 한도를 설정했다고 이전 레코드가 삭제되지는 않습니다.

docker logs에서 로그를 사용할 수 없다고 나오면 컨테이너 이름, 상태 및 로깅 드라이버를 확인하세요. 점검 결과 사용할 수 있는 로컬 경로가 없다면 드라이버가 파일을 사용하지 않거나 데몬이 데이터를 다른 곳에 저장할 수 있습니다. 파일 작업에서 권한 오류가 발생하면 호스트 측 권한을 확인하고 시스템에서 허용한 관리자 절차를 이용하세요. Docker가 출력을 수집하기 위해 컨테이너를 root로 실행할 필요는 없습니다. 확실하지 않다면 파일을 그대로 두고 Docker가 관리하는 저장소를 직접 수정하기보다 드라이버가 지원하는 설정과 점검 도구를 사용하세요.