Docker

컨테이너 로깅

쿠와와 2020. 12. 30. 18:20

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

이렇게 mysql 을 깔아준다. 

 

json-file log

docker logs 컨테이너name 를 이용해서 컨테이너 내부의 표준 출력을 볼 수 있다. 

 

--tail 을 써서 마지막 로그 줄부터 출력할 수 있다. 

ex) docker logs --tail 2 mysql  설명 : 마지막 2줄 확인 

 

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

-t 옵션을 추가로 줘서 타임스탬프를 표시할 수도 있다. 

-f 는 컨테이너에서 실시간으로 출력되는 내용을 확인할 수 있다 (유용하다)

 

기본적으로 컨테이너 로그는 JSON 형식으로 도커 내부에 저장된다. 이때 파일 경로는 

cat /var/lib/docker/container/${CONTAINER_ID}/${CONTAINER_ID}-json.log 에 저장된다. 

 

그러나 컨테이너 내부의 출력이 너무 많은 상태로 방치하면 json 파일의 크기가 계속해서 커질 수 있다. 

그래서 !!!!

 

--log-opt를 사용하여 컨테이너 json 로그 파일의 최대 크기를 지정할 수 있다. 

docker run -it 

--log-opt max-size=10k --log-opt max-file=3 

--name log-test ubuntu:14.04

 

syslog log

위와 다르네 syslog를 사용해 log를 저장할 수도 있는데 다음 명령어를 사용해야한다. 

docker run -d --name syslog_container

--log-driver=syslog

ubuntu:14.04

echo syslogtest 

 

syslog 로깅 드라이버는 기본적으로 로컬호스트의 syslog에 저장, 그러므로 파일 위치를 알아야 한다.

우분트 14.04 -> /var/log/syslog

우분트 16.04 -> docker.service 명령어로 확인 

CentoOS, RHEL -> /var/log/messages

CentoOS -> jourmalctl -u 명령어로 확인 

 

rsyslog

 서버  구동

docker run -i -t 

-h rsyslog 

--name rsys_server

-p 514:514 -p 514:514/udp

ubuntu:14.04

 

서버 컨테이너 내부에서

vi /etc/rsyslog.conf 

파일로 들어가 서버를 구동시키는 항목의 주석을 해체한다.

 

# provides UDP syslog reception

$ModLoad imudp

$UDPServerRun 514

 

# provides TCP syslog reception

$ModLoad imtcp

$INPUTTCPServerRun 514

 

그후 service rsyslog restart로 재구동 

 

그후 클라이언트에서 

docker run -i -t

--log-driver=syslog

--log-opt syslog-address=tcp"///[serverIP:port]

--log-opt tag="mylog"

ubuntu:14.04

 

이런식으로 사용 

 

fluentd logging

fluentd는 각종 로그를 수집하고 저장할 수 있는 기능을 제공하는 오픈소스 도구이다. 도커 엔진의 컨테이너의 로그를 fluentd를 통해 저장할 수 있도록 플로그인을 공식적으로 제공해준다. 

-> 데이터 셋은 JSON으로 사용한다. 

 

예를 들어보자.

 

도커 서버 : 192.168.0.100

fluentd 서버 : 192.168.0.101

몽고DB 서버 : 192.168.0.102

 

몽고 컨테이서 생성

docker run --name mongoDB -d  -p 27017:27017 mongo

 

그후 

fluentd 서버 호스트에서 fluen.conf 파일을 수정한다. 

로그 데이터 -> 몽고DB에 전송, access라는 이름의 컬렉션에 로그 저장, 몽고 컨테이너 호스트 주소와 포트를 지정

<match docker.**>

@type mongo

database nginx

collection access

host 192.168.0.102

port 27017

flush_interval 10s

</match>

 

그후 fluen.conf 파일이 있는 디렉터리에서 작업 수행

docker run -d --name fluentd -p 24224:24224

-v $(pwd)/fluen.con:/fluentd/etc/fluen.conf

-e FLUENTD_CONF=fluen.conf

alicek106/fluentd:mongo

 

그후 도커 서버에서로그를 수집할 컨테이너 생성한다. 

docker run -p80:80 -d 

--log-driver=fluentd

--log-opt fluentd-address=192.168.0.101:24224

--log-opt tag=docker.nginx.webserver 

nginx

 

 

위와 같이 하면 호스트 80번 포트에 nginx 웹 서버에 접근할 수 있다. 

docker exec -it mongoDB mongo 명령어를 사용해서 결과를 확인해보자.

 

그외 아마존 클라우드워치 로그가 있다. 다루지는 않겠다.