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

Docker Container Logging_fluentd(3/4) 본문

Simple is IT/Cloud & Container

Docker Container Logging_fluentd(3/4)

currenjin 2020. 7. 18. 17:22

Container Logging

도커에서 컨테이너 로그를 수집할 때 각종 드라이버를 통해 다양한 방법으로 컨테이너의 로그를 수집할 수 있죠.

이번에는 도커에서 제공하는 로깅 드라이버 중 fluentd를 사용해볼거에요!

 

 

fluentd

fluentd는 각종 로그를 수집하고 저장할 수 있는 기능을 제공하는 오픈소스 도구에요.

도커 엔진의 컨테이너 로그를 fluentd를 통해 저장할 수 있도록 플러그인을 공식적으로 제공한답니다.

데이터 포맷을 json 형태로 저장하기 때문에 사용하기도 쉬울뿐더러 각종 저장소(S3, HDFS, MongoDB 등)에도 저장이 가능합니다!

 

이제 우리는 실습을 통해 fluentd의 프로세스를 이해할거에요. 작업은 아래 시나리오를 기준으로 진행합니다!

로그 수집 시나리오

fluentd와 mongoDB를 연동해 데이터를 저장하는 구조에요.

특정 호스트에 생성되는 컨테이너는 하나의 fluentd에 접근하고, fluentd는 mongoDB에 데이터를 저장하죠.

 

먼저, mongoDB 컨테이너를 생성합니다.

docker run -d --name mongoDB \
--net host \
mongo

mongoDB가 사용하는 포트는 27017으로, 호스트 네트워크를 사용했어요.

 

그 다음으로, fluentd 컨테이너를 생성하는 작업을 진행합니다.

컨테이너를 생성하기 전에 아래와 같은 내용의 fluent.conf 파일을 저장할거에요.

<source>
  @type forward
</source>

<match docker.**>
  @type mongo
  database nginx
  collection access
  host mongoDB
  port 27017
  flush_interval 10s
</match>

fluentd 서버에 들어오는 로그 데이터를 mongoDB에 전송하고, access라는 이름의 컬렉션에 로그를 저장하며, mongoDB 컨테이너의 포트를 지정한 것이에요.

<match docker.**>는 로그의 태그가 docker로 시작하면 이를 mongoDB에 전달하는 것을 의미합니다!

이 예제에서는 mongoDB의 사용자와 비밀번호를 통한 인증 작업을 설정하진 않았어요.
만약 인증 정보를 설정했다면, <match> 태그 안에 사용자 명과 비밀번호를 명시해야해요.
user [username]
password [password]

 

파일이 저장되었다면, 저장된 경로에서 다음 명령어를 실행해 컨테이너를 생성합니다! 사용 포트는 24224 랍니다.

docker run -d --name fluentd \
--net host \
-v $(pwd)/fluent.conf:/fluentd/etc/fluent.conf \
-e FLUENTD_CONF=fluent.conf \
alicek106/fluentd:mongo

기존 도커 허브의 fluentd 이미지는 mongoDB에 연결하는 플러그인이 내장돼 있지 않아요.

그렇기 때문에 플러그인을 설치한 alicek106님의 fluentd:mongo 이미지를 이용합니다.

 

이제! 로그를 수집하기 위한 컨테이너를 생성합니다.

docker run -d --name nginx \
--net host \
--log-driver=fluentd \
--log-opt fluentd-address=127.0.0.1:24224 \
--log-opt tag=docker.nginx.webserver \
nginx

--log-driver를 fluentd로 설정하고 --log-opt의 fluentd-address 값에 fluentd 서버 주소를 지정해요.

--log-opt tag를 사용함으로써 로그의 태그를 docker.webserver로 <match docker.**> 조건에 맞춰줍니다.

 

호스트의 80번 포트 웹으로 접속하면 로그가 출력됩니다.

아래는 mongoDB에 접근 로그가 정상적으로 저장되었는지 확인하는 커맨드에요.

# docker exec -it mongoDB mongo

> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
nginx   0.000GB

> use nginx
switched to db nginx

> show collections
access

> db['access'].find()
{ "_id" : ObjectId("5f12af73eb0a190009bc6f47"), "container_id" : "f6d0f4b3cd7d27ee1e94b55ea00b1bb2fa2c97d444c42ede20b6408dd8186147", "container_name" : "/nginx", "source" : "stdout", "log" : "/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration", "time" : ISODate("2020-07-18T08:14:33Z") }

성공적입니다!

 

여기서 기억해야할 포인트는 Docker 엔진이 fluentd 서버에 컨테이너 로그를 전송했고, 이 로그는 다시 mongoDB 서버로 전송해 저장되었다는 것이에요. :)

Comments