티스토리 뷰

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

- 애플리케이션 레벨에서 로그가 기록되도록 개발해 별도의 로깅 서비스를 쓸 수도 있지만 도커 컨테이너의

표준 출력(StdOut)과 에러(StdErr) 로그를 별도의 메타데이터 파일로 저장하며 확인하는 명령어를 제공합니다.

 

 

 

[mysql 5.7이 설치된 컨테이너 생성 및 로그 남기기]

# docker run -d --name mysql \
-e MYSQL_ROOT_PASSWORD=1234 \
mysql:5.7

- mysql과 같은 애플리케이션을 구동하는 컨테이너는 포그라운드 모드로 실행되므로 -d 옵션을 써서 백그라운드 모드로 컨테이너를 생성하는 경우가 많습니다.

- 애플리케이션이 잘 구동되는지 여부를 알 수 없지만 docker logs 명령어를 써서 컨테이너의 표준 출력을 확인함으로써 애플리케이션의 상태를 알 수 있습니다.

- docker logs 명령어는 컨테이너 내부에서 출력을 보여주는 명령어입니다.

 

 

 

 

 

 

 

[mysql 5.7이 설치된 컨테이너 생성 및 로그 남기기]

# docker logs mysql

 

 

[-e 옵션을 제외 후, mysql 5.7 컨테이너 생성]

# docker run -d --name no_passwd_mysql \
mysql:5.7

- 위 명령어를 실행한 뒤 docker ps 명령어로 컨테이너의 목록을 확인하면 no_passwd_mysql 컨테이너는 생성됐으나 실행되지 않았습니다.

- docker start 명령어로 다시 시작해도 컨테이너는 시작되지 않습니다.

 

 

[docker logs 명령어를 통해 애플리케이션 문제 확인]

# docker logs no_passwd_mysql

- 실행되지 않는 no_passwd_mysql 컨테이너의 문제를 확인하기 위해 docker logs [컨테이너명] 명령어 사용합니다.

- 위의 경우는 mysql 실행에 필요한 환경변수를 지정하지 않아 컨테이너가 시작하지 않았습니다.

- docker logs 명령어를 쓰면 간단하고 빠르게 에러를 확인할  수 있습니다.

 

 

 

# docker logs --tail 2 no_passwd_mysql

- 컨테이너의 로그가 너무 많아 읽기 힘들다면 --tail 옵션을 써서 마지막 로그 줄부터 출력할 줄의 수를 설정할 수 있습니다.

 

 

 

# date +%s	// 유닉스시간 확인

# docker logs --since [유닉스시간] no_passwd_mysql

-  '--since' 옵션에 유닉스 시간을 입력해 특정 시간 이후의 로그를 확인할 수 있습니다.

 

 

 

# docker logs -f -t no_passwd_mysql

- '-t' 옵션으로 타임스탬프를 표시할 수도 있습니다.

- 컨테이너에서 실시간으로 출려괴는 내용을 확인하려면 -f 옵션을 써서 로그를 스트림으로 확인할 수 있습니다.

- 특히 -f 옵션은 애플리케이션을 개발할 때 유용합니다.

 

 

 

# docker run -i -t --name logtest ubuntu:14.04
# echo test!	// 컨테이너

#docker logs logtest

- 기본적으로 위와 같은 컨테이너 로그는 JSON 형태로 도커 내부에 저장- 컨테이너 내부에서 어떤 일이 일어나는지 아는 것은 디버깅뿐만 아니라 운영 측면에서도 중요합니다.

 

- 애플리케이션 레벨에서 로그가 기록되도록 개발해 별도의 로깅 서비스를 쓸 수도 있지만 도커 컨테이너의

 

표준 출력(StdOut)과 에러(StdErr) 로그를 별도의 메타데이터 파일로 저장하며 확인하는 명령어를 제공합니다.

 

 

 

 

 

 

 

[mysql 5.7이 설치된 컨테이너 생성 및 로그 남기기]

 

# docker run -d --name mysql \
-e MYSQL_ROOT_PASSWORD=1234 \
mysql:5.7

- mysql과 같은 애플리케이션을 구동하는 컨테이너는 포그라운드 모드로 실행되므로 -d 옵션을 써서 백그라운드 모드로 컨테이너를 생성하는 경우가 많습니다.

 

- 애플리케이션이 잘 구동되는지 여부를 알 수 없지만 docker logs 명령어를 써서 컨테이너의 표준 출력을 확인함으로써 애플리케이션의 상태를 알 수 있습니다.

 

- docker logs 명령어는 컨테이너 내부에서 출력을 보여주는 명령어입니다.

 

 

 

 

 

 

 

 

[mysql 5.7이 설치된 컨테이너 생성 및 로그 남기기]

# docker logs mysql

 

 

 

 

[-e 옵션을 제외 후, mysql 5.7 컨테이너 생성]

# docker run -d --name no_passwd_mysql \
mysql:5.7

- 위 명령어를 실행한 뒤 docker ps 명령어로 컨테이너의 목록을 확인하면 no_passwd_mysql 컨테이너는 생성됐으나 실행되지 않았습니다.

 

- docker start 명령어로 다시 시작해도 컨테이너는 시작되지 않습니다.

 

 

 

 

 

[docker logs 명령어를 통해 애플리케이션 문제 확인]

# docker logs no_passwd_mysql

- 실행되지 않는 no_passwd_mysql 컨테이너의 문제를 확인하기 위해 docker logs [컨테이너명] 명령어 사용합니다.

 

- 위의 경우는 mysql 실행에 필요한 환경변수를 지정하지 않아 컨테이너가 시작하지 않았습니다.

 

- docker logs 명령어를 쓰면 간단하고 빠르게 에러를 확인할 수 있습니다.

 

 

 

 

 

 

# docker logs --tail 2 no_passwd_mysql

- 컨테이너의 로그가 너무 많아 읽기 힘들다면 --tail 옵션을 써서 마지막 로그 줄부터 출력할 줄의 수를 설정할 수 있습니다.

 

 

 

 

 

# date +%s // 유닉스시간 확인

# docker logs --since [유닉스시간] no_passwd_mysql

- '--since' 옵션에 유닉스 시간을 입력해 특정 시간 이후의 로그를 확인할 수 있습니다.

 

 

 

 

# docker logs -f -t no_passwd_mysql

- '-t' 옵션으로 타임스탬프를 표시할 수도 있습니다.

 

- 컨테이너에서 실시간으로 출력되는 내용을 확인하려면 -f 옵션을 써서 로그를 스트림으로 확인할 수 있습니다.

 

- 특히 -f 옵션은 애플리케이션을 개발할 때 유용합니다.

 

 

 

 

 

# docker run -i -t --name logtest ubuntu:14.04
# echo test! // 컨테이너

#docker logs logtest

- docker logs 명령어는 run 명령어에서 -i, -t 옵션을 설정해 docker attach 명령어를 사용할 수 있는 컨테이너에도 쓸 수 있으며, 컨테이너 내부에서 bash 셸 등 입출력한 내용을 확인할 수 있습니다.

 

 

 

[JSON 형태의 Log 파일 저장소 위치]

# ls /var/lib/docker/containers/

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

- 위와 같은 컨테이너 로그는 JSON 형태로 도커 내부에 저장됩니다.

- 이 파일은 /var/lib/docker/containers/ 경로에 컨테이너의 ID로 시작하는 파일명으로 저장됩니다.

 

 

 

 

[컨테이너 로그 파일 크기, 갯수 제한 옵션]

# docker run -it \
--log-opt max-size=10k --log-out max-file=3 \
--name log-test ubuntu:14.04

- 컨테이너 내부의 출력이 너무 많은 상태로 방치하면 json 파일의 크기가 계속해서 커질 수 있으며, 결국 호스트의 남은 저장 공간을 전부 사용할 수도 있습니다.

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

- max-size는 로그 파일의 최대 크기, max-file은 로그파일의 개수를 의미합니다.