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) 설정 파일을 수정하는 방법이 가장 좋습니다.
-
/etc/docker/daemon.json파일을 열거나 생성합니다. (파일이 없다면 새로 만드세요.) -
아래와 같이 내용을 작성합니다.
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
- Docker 데몬을 재시작합니다.
sudo systemctl restart docker
이렇게 설정하면, 앞으로 생성되는 모든 컨테이너는 별도의 로깅 설정을 하지 않는 한 자동으로 이 정책을 따르게 됩니다. 물론, docker-compose.yml 파일이나 docker run 명령어에서 특정 컨테이너에 대해 다른 로깅 옵션을 지정하면 개별 설정이 데몬 설정보다 우선 적용됩니다.
요약
-
개별 서비스 설정:
docker-compose.yml파일 내의logging섹션에서 설정하는 것이 가장 일반적이고 편리합니다. -
글로벌 기본 설정: 서버의 모든 컨테이너에 일괄적인 정책을 적용하려면
/etc/docker/daemon.json파일을 수정하세요.
댓글이 없습니다.