記錄

[docker] docker 로그 저장 위치 및 저장 용량 이슈 본문

Infra/docker

[docker] docker 로그 저장 위치 및 저장 용량 이슈

surhommejk 2019. 9. 2. 21:09

사실 docker를 먼저 공부하게 된 이유는 회사에서 도커 용량 초과시 로그가 기록되지 않는 이슈가 발생했을 때 이를 맡아서 해결해야 하는 포지션이 서버 개발자이기 때문이다. 더 정확히는 기존에 그걸 하고 계시던 분이 휴가를 가셔서 혹시나 그 사이에 내가 해야할 일이 발생할 까봐 미리 준비하는 차에 찾아보다 보니 재밌어서 그냥 포스팅으로 남길 생각이 들었다.

그래서 앞서 포스팅에서 쓴 

로컬에서 개발 -> 도커 이미지 생성 -> 도커 허브 및 레지스트리에 이미지 업로드 -> aws 인스턴스 생성 및 aws 상에 배포

의 흐름대로 가는 것이 가장 기본적이긴 한데, 그 전에 회사에서 찾아본 내용을 정리하고 넘어가겠다.

 

이슈는 끊임없이 발생되는 도커 상의 로그가 꽉 차서 더 이상 로그를 볼 수 없을 때 이를 해결하는 것이었다. 사실 해결책은 이미 회사에 메뉴얼화 되어 있었다. 1~3번 까지의 코드를 순서대로 그냥 치면 되는 것이었는데 왜 그렇게 하면 그 문제가 해결이 되는지도 궁금했고 그걸 알아야만 개발자라고 할 수 있지 '이렇게 하면 저렇게 된다더라'고 알기만 알고 내부 원리를 모른채 사용하고 싶지 않았다. 그게 바보가 되는 지름길이라 생각하기 때문이다.

회사 메뉴얼은 

1. docker ps 

2. docker rm -f [컨테이너 id]

3. docker-compose down

4. docker-compose up -d

이렇게 하면 해결이 된다고 했던거 같은데(기억에 의존해서 썼다) 이게 왜 그렇게 되는지도 잘 몰랐고 하나하나의 의미도 뭔지 몰랐다. 그래서 쭉쭉 내가 필요한 정보만 찾아서 살을 붙여봤다.

내가 궁금했던 점은 아래와 같다.

Q) 도커에서 누가, 언제 로그를 남기는지

누가?

도커는 자체적으로 로그를 남기는 메커니즘을 가지고 있다.

Docker includes multiple logging mechanisms to help you get information from running containers and services. These mechanisms are called logging drivers.

https://docs.docker.com/config/containers/logging/configure/

언제?

By default, docker logs or docker service logs shows the command’s output just as it would appear if you ran the command interactively in a terminal. UNIX and Linux commands typically open three I/O streams when they run, called STDIN, STDOUT, and STDERR. STDIN is the command’s input stream, which may include input from the keyboard or input from another command. STDOUT is usually a command’s normal output, and STDERR is typically used to output error messages. By default, docker logsshows the command’s STDOUT and STDERR. 

https://docs.docker.com/config/containers/logging/

 

Q) 로그가 쌓이는 위치

/var/lib/docker/containers/[container-id]/[container-id]-json.log

cf) aws 상에서는 터미널을 통해 인스턴스에 붙으면 cd .. 를 통해서 더 위로 올라가보면 var가 보이는 순간이 온다

 

Q) 용량의 한계는 언제 누가 정했나?

docker-compose.yml 에서 max-file : “4” 해둔대로 최대 용량이 정해진다. 로그가 위치한 경로로 가다가 끝까지 들어가지 않고 컨테이너가 만들어진 경로인  /var/lib/docker/containers 까지만 가서 'ls -alh' 명령어를 통해 컨테이너의 용량을 보면 docker-compose.yml에서 선언한 최대 용량과 같이 꽉 차있음을 확인할 수 있다.

 

Q) 왜 저거(down-> up) 한다고 용량이 비게 되는 건가?

docker-compose down 명령어 자체가 containers, networks, volumes, and images들을  지우는거라서 해당 로그 날아가기 때문이다. 더 정확히 이해하기 위해서는 해당 커맨드에 대한 레퍼런스를 짚고 넘어가면 된다. 컨테이너를 싹 지웠다가 새로 만들기 때문에 그 내부에 포함된 로그들(/var/lib/docker/containers/[container-id]/[container-id]-json.log) 이 삭제되기 때문이다.

* docker-compose up -d ) Builds, (re)creates, starts, and attaches to containers for a service.

 -d, --detach               Detached mode: Run containers in the background, print new container names. Incompatible with --abort-on-container-exit.

* docker-compose down ) Stops containers and removes containers, networks, volumes, and images created by up.

'Infra > docker' 카테고리의 다른 글

[docker] docker 컨셉 및 기초  (0) 2019.09.02
Comments