docker logs로 보이는 로그는 시스템 메모리에 계속 누적되지 않습니다. 대신, 기본적으로 호스트(Host) 시스템의 디스크에 파일로 저장됩니다.


로그는 어디에 어떻게 저장되나요? ⚙️



Docker는 컨테이너의 표준 출력(stdout)과 표준 에러(stderr) 스트림을 모두 캡처하여 로깅 드라이버(Logging Driver) 를 통해 처리합니다. 특별한 설정을 하지 않았다면, Docker는 기본적으로 json-file 로깅 드라이버를 사용합니다.

  • 저장 위치: 컨테이너의 로그는 호스트 시스템의 특정 경로에 JSON 형식의 파일로 저장됩니다. 일반적으로 경로는 다음과 같습니다.

    • /var/lib/docker/containers/[컨테이너_ID]/[컨테이너_ID]-json.log
  • docker logs 명령어: 이 명령어는 사실 메모리에 있는 내용을 보여주는 것이 아니라, 위에 언급된 JSON 로그 파일을 읽어서 터미널에 보여주는 것입니다.


로그가 계속 쌓이면 디스크 용량이 부족해지지 않나요? 🤔

네, 맞습니다. 아무런 조치를 하지 않으면 로그 파일이 계속 커져서 호스트의 디스크 용량을 모두 차지할 수 있습니다. 이를 방지하기 위해 Docker는 로그 파일의 크기와 개수를 제한하는 로그 로테이션(Log Rotation) 옵션을 제공합니다.

예를 들어, docker run 명령어를 실행할 때 다음과 같은 옵션을 추가할 수 있습니다.

docker run -d \
  --log-driver json-file \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  nginx
  • --log-opt max-size=10m: 로그 파일 하나의 최대 크기를 10MB로 제한합니다.

  • --log-opt max-file=3: 로그 파일의 최대 개수를 3개로 제한합니다. 3개가 넘어가면 가장 오래된 파일부터 삭제됩니다.

이렇게 설정하면 해당 컨테이너의 로그는 최대 30MB(10MB * 3개)까지만 디스크 공간을 사용하게 됩니다.


결론 📝



  • Docker 컨테이너의 콘솔 로그는 시스템 메모리가 아닌 호스트의 디스크에 파일로 저장됩니다.

  • docker logs 명령어는 이 저장된 파일을 읽어와 보여주는 역할을 합니다.

  • 로그 파일이 무한정 커지는 것을 방지하려면 로그 로테이션 옵션(max-size, max-file)을 설정하는 것이 매우 중요합니다.

Docker Compose에서는 docker-compose.yml 파일 안에서 각 서비스별로 로깅 옵션을 아주 쉽게 설정할 수 있습니다.

docker run 명령어의 --log-opt 플래그가 YAML 형식으로 들어간다고 생각하시면 됩니다.


docker-compose.yml 파일에 설정하기 📝

아래는 my-app이라는 서비스에 로그 로테이션을 적용하는 예시입니다.

services:
  my-app:
    image: your-app-image
    # ... 다른 설정들 ...
    deploy:
      resources:
        limits:
          memory: 512M

    # 👇 이 부분이 로그 설정입니다.
    logging:
      driver: "json-file"  # 사용할 로깅 드라이버 (기본값이므로 생략 가능)
      options:
        max-size: "10m"    # 파일당 최대 크기: 10MB
        max-file: "3"      # 최대 파일 개수: 3개
  • logging: 해당 서비스의 로깅 설정을 시작하는 키입니다.

  • driver: 사용할 로깅 드라이버를 지정합니다. json-file이 기본값입니다.

  • options: 드라이버에 전달할 옵션을 설정합니다.

    • max-size: docker run--log-opt max-size와 동일합니다.

    • max-file: docker run--log-opt max-file과 동일합니다.

이제 docker-compose up으로 이 서비스를 시작하면, my-app 컨테이너의 로그는 자동으로 로테이션되어 최대 30MB(10MB * 3개)의 디스크 공간만 사용하게 됩니다.


모든 컨테이너에 기본값으로 설정하기 🌍

만약 모든 컨테이너에 일일이 옵션을 주기 번거롭고, 시스템 전체에 기본 정책을 적용하고 싶다면 Docker 데몬(Daemon) 설정 파일을 수정하는 방법이 가장 좋습니다.

  1. /etc/docker/daemon.json 파일을 열거나 생성합니다. (파일이 없다면 새로 만드세요.)

  2. 아래와 같이 내용을 작성합니다.

{
    "log-driver": "json-file",
    "log-opts": {
        "max-size": "10m",
        "max-file": "3"
    }
}
  1. Docker 데몬을 재시작합니다.
sudo systemctl restart docker

이렇게 설정하면, 앞으로 생성되는 모든 컨테이너는 별도의 로깅 설정을 하지 않는 한 자동으로 이 정책을 따르게 됩니다. 물론, docker-compose.yml 파일이나 docker run 명령어에서 특정 컨테이너에 대해 다른 로깅 옵션을 지정하면 개별 설정이 데몬 설정보다 우선 적용됩니다.

요약

  • 개별 서비스 설정: docker-compose.yml 파일 내의 logging 섹션에서 설정하는 것이 가장 일반적이고 편리합니다.

  • 글로벌 기본 설정: 서버의 모든 컨테이너에 일괄적인 정책을 적용하려면 /etc/docker/daemon.json 파일을 수정하세요.