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 |