Docker log 들을 EFK 스택에 보내는 방법 알아보기

오늘은 Docker와 Docker-compose로 Docker 컨테이너에서 나오는 log 들을 EFK 스택에 보내는 방법을 대하여 알아봅니다.

개요

Docker 컨테이너에서 나오는 로그를 EFK (Elasticsearch + Fluentd + Kibana) 스택에 수집할 수 있습니다.

검색 엔진인 Elasticsearch, 로그 수집기인 Fluentd 그리고 데이터 시각화 웹 UI인 Kibana를 같이 묶어서 부르는 게 EFK 스택입니다.

도커 설치

이전 포스트에서 Docker와 Docker-compose를 설치하는 내용을 볼 수 있습니다.

docker-compose 구성

이번 예시에서는 파이썬 컨테이너와 fluentd, elasticsearch, kibana를 docker-compose.yml 파일로 구성합니다.

version: '3.2'
services:
  python_command1:
    build:
      context: .
      dockerfile: Dockerfile
    command: python3 example1.py
    restart: always
    logging:
      driver: "fluentd"
      options:
        fluentd-address: localhost:24224
        tag: python.command

컨테이너 로깅 드라이버를 Fluentd Logging Driver로 지정합니다.

이제 로그가 발생하면 fluentd-address로 보냅니다.

  fluentd:
    build: ./fluentd
    volumes:
      - ./fluentd/conf:/fluentd/etc
    links:
      - "elasticsearch"
    ports:
      - "24224:24224"
      - "24224:24224/udp"

fluent에서 받는 포트를 열고 도커 이미지, 볼륨을 준비합니다.

  elasticsearch:
    image: elasticsearch
    expose:
      - 9200
    ports:
      - "9200:9200"

elasticsearch 이미지와 포트를 준비합니다.

  kibana:
    image: kibana
    links:
      - "elasticsearch"
    ports:
      - "5601:5601"

localhost의 5601 포트로 kibana를 사용할 수 있게 준비합니다.

fluentd Dockerfile 구성

FROM fluent/fluentd:v0.12-debian
RUN ["gem", "install", "fluent-plugin-elasticsearch", "--no-rdoc", "--no-ri", "--version", "1.9.2"]

fluent/fluentd 공식 이미지로 fluentd의 Dockerfile 파일을 준비합니다.

fluent.conf 구성

<source>
  @type forward
  port 24224
  bind 0.0.0.0
</source>
<match *.**>
  @type copy
  <store>
    @type elasticsearch
    host elasticsearch
    port 9200
    logstash_format true
    logstash_prefix fluentd
    logstash_dateformat %Y%m%d
    include_tag_key true
    type_name access_log
    tag_key @log_name
    flush_interval 1s
  </store>
</match>

forward로 입력하고, elasticsearch로 출력하는 fluent의 설정 파일을 만듭니다.

실행

docker-compose up -d 로 서비스를 빌드하고 실행합니다.

http://localhost:5601/ 주소에 접속하고 인덱스 패턴을 fluentd-* 로 설정하면 fluentd에서 받는 모든 로그가 Kibana로 출력됩니다.

Written on December 21, 2019