반응형
말랑Cow
IT
말랑Cow
전체 방문자
오늘
어제
  • 분류 전체보기 (165)
    • Linux (33)
    • Windows (6)
    • Network (7)
    • Hardware (10)
    • Zabbix (13)
    • python (9)
    • script (0)
    • docker (16)
    • NAS (1)
    • DB (3)
    • php (33)
    • jQuery (1)
    • 정보보안기사 (0)
    • Ajax (1)
    • Javascript (21)
    • DELL (0)
    • HPE (0)
    • Secui (0)
    • AWS (2)
    • Elastic (0)
    • 보안 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • CentOS
  • php
  • 자바스크립트
  • php 클래스
  • 네트워크
  • php 객체
  • 모니터링
  • docker
  • ZABBIX
  • Shell
  • 파이썬
  • Python
  • jQuery
  • JavaScript
  • bash
  • 서버
  • 리눅스
  • Linux
  • 자빅스
  • 도커
hELLO · Designed By 정상우.
말랑Cow

IT

docker

도커 컨테이너 다루기(5) - 컨테이너 로깅

2021. 5. 28. 14:26
반응형

1. json-file 로그 사용하기


도커는 컨테이너의 표준출력과 에러로그를 별도의 메타데이터 파일로 저장합니다.

 

[root@localhost ~]# docker run -d --name mysql -e MYSQL_ROOT_PASSWD=1234 mysql:5.7
eeafd60870f87d7d47ee8d2647b1157be3b55a205f59b63678f7f85b19d7e73c

 

먼저 mysql 5.7 버전의 백그라운드모드의 컨테이너 하나를 생성하였습니다.

 

[root@localhost ~]# docker logs mysql
2021-05-28 01:28:57+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.33-1debian10 started.
2021-05-28 01:28:57+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2021-05-28 01:28:57+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.33-1debian10 started.
2021-05-28 01:28:57+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified
    You need to specify one of the following:
    - MYSQL_ROOT_PASSWORD
    - MYSQL_ALLOW_EMPTY_PASSWORD
    - MYSQL_RANDOM_ROOT_PASSWORD

컨테이너의 표준 출력을 확인함으로써 애플리케이션의 상태를 확인할 수 있습니다.

 

[root@localhost ~]# docker run -d --name mysql mysql:5.7
79c0c68b839781e0c78c12a8b84d39d4fb54def47810ecf32f001fc3883ebbe1
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE       COMMAND                  CREATED          STATUS                      PORTS     NAMES
79c0c68b8397   mysql:5.7   "docker-entrypoint.s…"   16 seconds ago   Exited (1) 15 seconds ago             mysql
[root@localhost ~]# docker start mysql
mysql
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE       COMMAND                  CREATED          STATUS                    PORTS     NAMES
79c0c68b8397   mysql:5.7   "docker-entrypoint.s…"   23 seconds ago   Exited (1) 1 second ago             mysql

이번엔 -e 옵션 없이 mysql 컨테이너를 생성하였습니다.

위와 같이 컨테이너를 start를 해도 시작이 되지 않습니다.

 

[root@localhost ~]# docker logs mysql
2021-05-28 01:31:08+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.33-1debian10 started.
2021-05-28 01:31:08+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2021-05-28 01:31:08+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.33-1debian10 started.
2021-05-28 01:31:08+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified
    You need to specify one of the following:
    - MYSQL_ROOT_PASSWORD
    - MYSQL_ALLOW_EMPTY_PASSWORD
    - MYSQL_RANDOM_ROOT_PASSWORD
2021-05-28 01:31:29+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.33-1debian10 started.
2021-05-28 01:31:30+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2021-05-28 01:31:30+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.33-1debian10 started.
2021-05-28 01:31:30+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified
    You need to specify one of the following:
    - MYSQL_ROOT_PASSWORD
    - MYSQL_ALLOW_EMPTY_PASSWORD
    - MYSQL_RANDOM_ROOT_PASSWORD

위 로그의 ERROR 부분을 확인하면 password 옵션이 정의되지 않아 실행되지 않는다는 것을 알 수 있습니다.

 

[root@localhost ~]# docker logs --tail 5 mysql
2021-05-28 01:31:30+00:00 [ERROR] [Entrypoint]: Database is uninitialized and password option is not specified
    You need to specify one of the following:
    - MYSQL_ROOT_PASSWORD
    - MYSQL_ALLOW_EMPTY_PASSWORD
    - MYSQL_RANDOM_ROOT_PASSWORD

로그가 너무 길어서 읽기 어렵다면 위처럼 tail 옵션으로 마지막 5줄만 출력하게 할 수 있습니다.

since 옵션으로 유닉스 시간을 입력하여 특정시간 이후의 로그를 확인할 수도 있습니다.

 

[root@localhost ~]# docker run -ti --name test ubuntu:18.04
root@c698f52dafb7:/# echo test
test
root@c698f52dafb7:/# exit
exit
[root@localhost ~]# docker logs test
root@c698f52dafb7:/# echo test
test
root@c698f52dafb7:/# exit
exit

또한 -t -i 옵션을 설정해 attach 명령을 사용할 수 있는 컨테이너도 사용 가능하며, 컨테이너 내부에서 bash 셸 등을 입출력한 내용을 확인할 수 있습니다.

 

기본적으로 위와같은 컨테이너 로그는 json 형태로 도커 내부에 저장됩니다.

 

[root@localhost ~]# cd /var/lib/docker/containers/
[root@localhost containers]# ll
합계 0
drwx-----x. 4 root root 237  5월 28 10:31 79c0c68b839781e0c78c12a8b84d39d4fb54def47810ecf32f001fc3883ebbe1
drwx-----x. 4 root root 237  5월 28 10:40 c698f52dafb72eaa73ffaa57cf955fa5a3aaaa2b61d84abd34000b524f9cc479
[root@localhost containers]# cd c698f52dafb72eaa73ffaa57cf955fa5a3aaaa2b61d84abd34000b524f9cc479/
[root@localhost c698f52dafb72eaa73ffaa57cf955fa5a3aaaa2b61d84abd34000b524f9cc479]# ll
합계 28
-rw-r-----. 1 root root  489  5월 28 10:40 c698f52dafb72eaa73ffaa57cf955fa5a3aaaa2b61d84abd34000b524f9cc479-json.log
drwx------. 2 root root    6  5월 28 10:37 checkpoints
-rw-------. 1 root root 2462  5월 28 10:40 config.v2.json
-rw-r--r--. 1 root root 1472  5월 28 10:40 hostconfig.json
-rw-r--r--. 1 root root   13  5월 28 10:37 hostname
-rw-r--r--. 1 root root  174  5월 28 10:37 hosts
drwx-----x. 2 root root    6  5월 28 10:37 mounts
-rw-r--r--. 1 root root   77  5월 28 10:37 resolv.conf
-rw-r--r--. 1 root root   71  5월 28 10:37 resolv.conf.hash

위 경로의 container ID 디렉토리 하단에 "컨테이너id-json.log" 파일명으로 저장됩니다.

해당 파일내용은 가공되지 않은 json 데이터가 쌓여있습니다.

 

컨테이너 내부 출력이 너무 많은 상태로 방치되면 json 파일의 크기가 계속해서 커지게 되므로 이러한 상황을 방지하기 위해 --log-opt 옵션으로 컨테이너 json 로그파일의 최대 크기를 지정할 수 있습니다.

 

[root@localhost ~]# docker run -ti --log-opt max-size=100k --log-opt max-file=3 --name log-test ubuntu:18.04
root@a72ff4c33ab6:/# 

로그 파일의 최대 크기는 100k 이고 로그파일의 개수는 3개만 남도록 옵션을 지정하여 컨테이너를 생성한 모습입니다.

 

기본적으로 도커는 위와같이 컨테이너 로그를 json 파일로 저장합니다.

그 밖에 각종 로깅 드라이버를 사용하게 설정해 컨테이너 로그를 수집할 수 있습니다.(syslog, journald, fluentd ...)

docker 데몬 시작 시 다음과 같은 옵션으로 기본적인 설정을 변경할 수 있습니다.

 

DOCKER_OPTS="--log-driver=syslog" 
DOCKER_OPTS="--log-opt max-size=100k --log-opt max-file=3"

 

2. syslog 로그


컨테이너의 로그는 json뿐 아니라 syslog로 보내 저장하도록 설정할 수 있습니다.

(syslog란? 유닉스 시스템 내에서 사용하는 일종의 '로그 생성/관리' 도구입니다)

 

대부분의 유닉스 계열 OS에서는 syslog를 사용하는 인터페이스가 동일하기 때문에 로그를 체계적으로 수집하고 분석할 수 있다는 장점이 있습니다.

 

[root@localhost ~]# docker run -d --name syslog --log-driver=syslog ubuntu:18.04 echo syslogtest
610ce61a5700faa6c98c47664e9007b5f2755b88f81142f1ce0921930c7b8672
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND             CREATED         STATUS                     PORTS     NAMES
610ce61a5700   ubuntu:18.04   "echo syslogtest"   3 seconds ago   Exited (0) 2 seconds ago             syslog


[root@localhost ~]# cat /var/log/messages|grep syslogtest
May 28 11:07:47 localhost 610ce61a5700[1567]: syslogtest

컨테이너의 커맨드가 echo syslogtest로 설정되기 때문에 syslogtest라는 문구를 출력하고 컨테이너가 종료되었습니다.

 

syslog를 원격서버에 설치하면 로그 옵션을 추가해 로그 정보를 원격 서버로 보낼 수 있습니다.

 

[root@localhost ~]# docker run -ti -h rsyslog --name rsyslog_server -p 514:514 -p 514:514/udp ubuntu:18.04

root@rsyslog:/# apt update

root@rsyslog:/# apt install rsyslog

root@rsyslog:/# apt install vim

rsyslog 컨테이너를 생성했습니다.

 

root@rsyslog:/# vi /etc/rsyslog.conf

================================================
# provides UDP syslog reception
module(load="imudp")
input(type="imudp" port="514")

# provides TCP syslog reception
module(load="imtcp")
input(type="imtcp" port="514")
================================================

service rsyslog restart

module 과 input 부분의 주석을 해제 후 rsyslog 데몬을 restart 해줍니다.

 

[root@localhost ~]# docker run -ti --log-driver=syslog --log-opt syslog-address=tcp://192.168.1.166:514 --log-opt tag="mylog" ubuntu:18.04
root@bbf0e64a346c:/# echo test
test
[root@localhost ~]# docker attach 2
root@rsyslog:/# cat /var/log/syslog 
May 28 04:30:07 rsyslog rsyslogd: imklog: cannot open kernel log (/proc/kmsg): Operation not permitted.
May 28 04:30:07 rsyslog rsyslogd: activation of module imklog failed [v8.32.0 try http://www.rsyslog.com/e/2145 ]
May 28 04:30:07 rsyslog rsyslogd: rsyslogd's groupid changed to 102
May 28 04:30:07 rsyslog rsyslogd: rsyslogd's userid changed to 101
May 28 04:30:07 rsyslog rsyslogd:  [origin software="rsyslogd" swVersion="8.32.0" x-pid="808" x-info="http://www.rsyslog.com"] start
May 28 13:30:28 192.168.1.166 mylog[1567]: #033]0;root@bbf0e64a346c: /#007root@bbf0e64a346c:/# #015#033[K#033]0;root@bbf0e64a346c: /#007root@bbf0e64a346c:/# echo test#015
May 28 13:30:28 192.168.1.166 mylog[1567]: test#015

rsyslog 테스트용 컨테이너를 하나 생성 후 echo test 라는 명령을 실행했습니다.

이후 다시 rsyslog 서비스용 컨테이너로 진입하여 /var/log/syslog 파일을 확인해보니 mylog 라는 태그명으로 echo test 입력과 test 라는 출력이 발생한 로그를 확인할 수 있습니다.

(여기서 syslog-address=tcp 가 아닌 udp로도 쓸 수 있습니다)

 

[root@localhost ~]# docker run -ti --log-driver=syslog --log-opt syslog-address=tcp://192.168.1.166:514 --log-opt tag="mylog" --log-opt syslog-facility="mail" ubuntu:18.04
root@19059cb91f6b:/# echo mail_test
mail_test

--log-opt syslog-facility="mail" 이라는 옵션을 추가하여 컨테이너 생성 후 echo mail_test 라는 명령을 실행했습니다.

 

[root@localhost ~]# docker attach 2
root@rsyslog:/var/log# cat /var/log/^C
root@rsyslog:/var/log# ll 
total 308
drwxrwxr-x. 1 root   syslog    133 May 28 04:36 ./
drwxr-xr-x. 1 root   root       54 May 12 23:09 ../
-rw-r--r--. 1 root   root     8805 May 28 04:29 alternatives.log
drwxr-xr-x. 1 root   root       60 May 28 04:29 apt/
-rw-r--r--. 1 root   root    35330 May 12 23:06 bootstrap.log
-rw-rw----. 1 root   utmp        0 May 12 23:05 btmp
-rw-r--r--. 1 root   root   209863 May 28 04:29 dpkg.log
-rw-r--r--. 1 root   root     3264 May 28 04:29 faillog
-rw-rw-r--. 1 root   utmp    29784 May 28 04:29 lastlog
-rw-r-----. 1 syslog adm       233 May 28 04:36 mail.log
-rw-r-----. 1 syslog adm      1046 May 28 04:36 syslog
-rw-------. 1 root   root     6528 May 28 04:29 tallylog
-rw-rw-r--. 1 root   utmp        0 May 12 23:05 wtmp
root@rsyslog:/var/log# cat mail.log 
May 28 13:36:54 192.168.1.166 mylog[1567]: #033]0;root@19059cb91f6b: /#007root@19059cb91f6b:/# #015#033[K#033]0;root@19059cb91f6b: /#007root@19059cb91f6b:/# echo mail_test#015
May 28 13:36:54 192.168.1.166 mylog[1567]: mail_test#015

rsyslog 서버 컨테이너의 mail.log 파일에 로그 내용이 기록된 것을 확인할 수 있습니다.

즉 syslog-facility를 쓰면 로그가 저장될 파일을 바꿀 수 있습니다.

기본적으로 daemon으로 설정돼 있지만 kern, user, mail 등 다른 facility를 사용할 수 있습니다.

 

반응형

'docker' 카테고리의 다른 글

도커 컨테이너 다루기(7) - 도커 이미지(Image)  (0) 2021.05.31
도커 컨테이너 다루기(6) - 컨테이너 자원 할당 제한  (1) 2021.05.29
도커 컨테이너 다루기(4) - 도커 네트워크  (0) 2021.05.26
도커 컨테이너 다루기(3) - 도커 볼륨  (0) 2021.05.25
도커 컨테이너 다루기(2) - 컨테이너 외부 노출  (0) 2021.05.24
    'docker' 카테고리의 다른 글
    • 도커 컨테이너 다루기(7) - 도커 이미지(Image)
    • 도커 컨테이너 다루기(6) - 컨테이너 자원 할당 제한
    • 도커 컨테이너 다루기(4) - 도커 네트워크
    • 도커 컨테이너 다루기(3) - 도커 볼륨
    말랑Cow
    말랑Cow

    티스토리툴바