Simple is IT, 누구나 보고 누구나 깨닫는 IT

Docker Container Logging_logs(1/4) 본문

Simple is IT/Cloud & Container

Docker Container Logging_logs(1/4)

currenjin 2020. 7. 18. 14:30

Container Logging

컨테이너 내부에서 어떤 일이 일어나는지 아는 것은 디버깅뿐만 아니라 운영 측면에서도 굉장히 중요해요.

그래서 Application Level에서 로그가 기록되도록 개발해 별도의 로깅 서비스를 쓸 수도 있습니다.

But! 도커는 컨테이너의 표준 출력(StdOut)과 에러(StdErr) 로그를 별도의 메타데이터 파일로 저장하고 확인하는 명령어를 제공하죠.

 

 

mysql 이미지의 컨테이너를 생성해 간단한 로그를 남겨볼게요.

docker run -d \
--name mysql \
-e MYSQL_ROOT_PASSWORd=password \
mysql

mysql 컨테이너는 Foreground 상태로 실행되므로 -d 옵션을 사용해 background 상태로 컨테이너를 생성했어요.

이에 대해 우리는 Application이 잘 동작하는지, 어떻게 동작하는지를 궁금해 할 필요가 있죠.

 

docker logs 명령은 우리가 동작에 대한 궁금증을 해소할 수 있도록 도와줍니다.

# docker logs mysql
2020-07-18 04:51:37+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.31-1debian10 started.
2020-07-18 04:51:37+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2020-07-18 04:51:37+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.31-1debian10 started.

docker logs 명령을 통해 우리는 컨테이너 내부에서 출력하는 내용들을 볼 수 있답니다.

 

한 번, 우리는 -e 옵션을 제외한 방법으로 mysql 컨테이너를 생성해볼게요.

docker run -d \
--name nopw_mysql \
mysql

 

이상하네요! 컨테이너가 정상적으로 동작하지 않는군요.

# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
d2f57ef971ce        mysql:5.7           "docker-entrypoint.s…"   7 seconds ago       Exited (1) 6 seconds ago                       nopw_mysql

컨테이너가 정상적으로 동작하지 않는 위 상황에서 우리는 attach 명령으로 접속할 수도 없고 참 난감합니다.

 

이때에도 docker logs 명령을 통해서 무슨 문제가 있는지 확인해 볼 수 있어요.

# docker logs nopw_mysql
.....
2020-07-18 05:05:15+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified
        You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD

로그를 통해 우리는 mysql 컨테이너에 대한 password 값이 지정되지 않았다는 것을 알았어요.

 

로그가 너무 많아 읽기 힘들다면 --tail 옵션으로 출력하는 로그 줄 수를 조절할 수 있습니다.

# docker logs --tail 2 nopw_mysql
2020-07-18 05:05:15+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified
        You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD

 

추가로, 아래와 같은 옵션들이 있으니 적절한상황에서 효율적으로 사용하길 바랍니다!

-t : 타임스태프 표시
-f : 실시간으로 출력되는 로그들을 스트림으로 확인
--since : 유닉스 시간을 입력해 특정 시간 이후의 로그 확인

 

로그 데이터 포맷

기본적으로 컨테이너 로그들은 JSON 형태로 도커 내부에 저장됩니다!

이 파일들은 다음 경로에 컨테이너 ID로 시작하는 파일명으로 저장돼죠. cat, vi 등의 명령으로 json 형태인 것을 확인할 수 있습니다.

/var/lib/docker/containers/${CONTAINER_ID}/${CONTAINER_ID}-json.log

 

컨테이너 내부의 출력이 너무 많은 상태로 방치되면 json 파일의 크기가 계속해서 커지는 것은 당연한 일입니다. 이 것이 지속되다보면 호스트의 저장 공간을 엄청 많이 차지하게 돼죠.

이 상황을 방지하기 위해 --log-opt 옵션으로 컨테이너 json 로그 파일의 최대 크기를 지정할 수 있어요.

docker run -d \
--log-opt max-size=10k --log-opt max-file=3 \
--name mysql \
mysql

max-size : log file의 크기

max-file : log file의 개수

 

Comments