Docker를 사용해 ELK를 구축하기

울이·2020년 8월 19일
4

Docker위의 웹서버

목록 보기
3/6
post-thumbnail

[Docker 위의 웹서버] 프로젝트 세팅 (2) - ELK 세팅

GITHUB

paullee714/Flask-Vue-ELK-Mongo-Docker

프로젝트 세팅

이전 글에서 프로젝트 세팅을 해 줄 도구들을 보았다.

  • ELK (ElasticSearch, Logstash, Kibana)
  • Docker, docker-compose

위의 도구들을 이용해서 프로젝트를 세팅 해 보도록 하려고 한다.

Docker Build를 위한 구상

Docker와 docker-compose를 사용해서 Build하려고 한다.

Dockerfile은 총 4개로 구성 할 것이다.

  • ElasticSearch
  • Logstash
  • Kibana
  • Flask(python3)

각각의 Dockerfile을 Build하고, Build한 Docker를 하나의 network로 묶어 주려고 한다.

이번 글에서는 ELK 세팅을 하려고 한다.

프로젝트 구조(대분류...)

Flask-Vue-ELK-Mongo-Docker
├── ELK
│   ├── elasticsearch
│   ├── kibana
│   └── logstash
├── README.md
├── docker-compose.yml
└── web
    └── back

6 directories, 2 files
  • 크게 ELK, web 폴더로 나누어 작업하려고 한다.
  • ELK 폴더에는 elasticsearch, logstash, kibana를 세팅 해 놓으려고 한다
  • web 폴더에는 backend인 flask와 아직 작성하지 않은 frontend를 작업 하려고한다.

Setting ELK

ELK
├── elasticsearch
│   ├── config
│   │   └── elasticsearch.yml
│   ├── data
│   │   └── nodes
│   └── elastic.Dockerfile
├── kibana
│   ├── config
│   │   └── kibana.yml
│   └── kibana.Dockerfile
└── logstash
    ├── config
    │   └── logstash.yml
    ├── logstash.Dockerfile
    └── pipeline
        └── logstash.conf

9 directories, 7 files

Elastic Search - elasticsearch/config/elasticsearch.yml

엘라스틱 서치에서 세팅을 위한 config폴더를 만들어주고, elasticsearch.yml을 만들어 준다

## Default Elasticsearch configuration from Elasticsearch base image.
## https://github.com/elastic/elasticsearch/blob/master/distribution/docker/src/docker/config/elasticsearch.yml
#
cluster.name: "docker-cluster"
network.host: 0.0.0.0

## X-Pack settings
## see https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-xpack.html
#
xpack.license.self_generated.type: trial
xpack.security.enabled: true
xpack.monitoring.collection.enabled: true

Elastic Search - elasticsearch/elastic.Dockerfile

여러개의 도커파일이 있기 때문에 구분을 위해 앞에 elasitc을 붙여주었다.

# https://www.docker.elastic.co/
FROM docker.elastic.co/elasticsearch/elasticsearch:7.8.1

# 여기에 ELASTIC SEARCH의 추가 PLUGIN 을 추가 해 주면 된다
# Example: RUN elasticsearch-plugin install analysis-icu

Kibana - kibana/config/kibana.yml

키바나도 마찬가지로, 연동을 위한 설정파일을 작성 해 준다

## Default Kibana configuration from Kibana base image.
## https://github.com/elastic/kibana/blob/master/src/dev/build/tasks/os_packages/docker_generator/templates/kibana_yml.template.js
#
server.name: kibana
server.host: "0"
elasticsearch.hosts: [ "http://elasticsearch:9200" ]
xpack.monitoring.ui.container.elasticsearch.enabled: true

## X-Pack security credentials
#
elasticsearch.username: elastic
elasticsearch.password: changeme
  • 여기서 elasticsearch.hosts가 나오는데, 대부분 elasticsearch는 url + 9200포트이다.
  • 여기서 url은 0.0.0.0 혹은 localhost이겠지만, docker위에서 사용하기 때문에 엘라스틱서치의 docker 컨테이너 이름을 url로 설정 해 주어야 한다. → 이부분은 docker-compose와 연관이 되어있다.

Kibana - kibana/kibana.Dockerfile

# https://www.docker.elastic.co/
FROM docker.elastic.co/kibana/kibana:7.8.1

# 여기에 PLUGIN 추가 코
# Example: RUN kibana-plugin 드nstall <name|url>

Logstash - logstash/config/logstash.yml

## Default Logstash configuration from Logstash base image.
## https://github.com/elastic/logstash/blob/master/docker/data/logstash/config/logstash-full.yml
#
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://elasticsearch:9200" ]

## X-Pack security credentials
#
xpack.monitoring.enabled: true
xpack.monitoring.elasticsearch.username: elastic
xpack.monitoring.elasticsearch.password: changeme

Logstash - logstash/pipeline/logstash.conf

input {
	tcp {
		port => 5001
	}
}

## Add your filters / logstash plugins configuration here

output {
	elasticsearch {
		hosts => "elasticsearch:9200"
		user => "elastic"
		password => "changeme"
		index => "elk-logger"
	}
}
  • 설정 중, input과 output이 있다.
  • input 으로 데이터를 받고 (tcp 5001 port), 받은 데이터를 output으로 넘겨준다( elasticsearch:9200)

Logstash - logstash/logstash.Dockerfile

# https://www.docker.elastic.co/
FROM docker.elastic.co/logstash/logstash:7.8.1

# 여기에 플러그인 추가
# Example: RUN logstash-plugin install logstash-filter-json

Setup With docker-compose

docker-compose를 사용해서 모든 docker파일들을 묶어 주려고 한다.

docker-compose.yml

이 docker-compose.yml 파일의 위치는 프로젝트 루트 위치이다.

version: '3.2'

services:
  elasticsearch:
    build:
      context: "${PWD}/ELK/elasticsearch/"
      dockerfile: elastic.Dockerfile
      args:
        ELK_VERSION: $ELK_VERSION
    volumes:
      - type: bind
        source: "${PWD}/ELK/elasticsearch/config/elasticsearch.yml"
        target: /usr/share/elasticsearch/config/elasticsearch.yml
        read_only: true
      - "${PWD}/ELK/elasticsearch/data:/usr/share/elasticsearch/data"
    ports:
      - "9200:9200"
      - "9300:9300"
    environment:
      ES_JAVA_OPTS: "-Xmx256m -Xms256m"
      ELASTIC_PASSWORD: changeme
      # Use single node discovery in order to disable production mode and avoid bootstrap checks
      # see https://www.elastic.co/guide/en/elasticsearch/reference/current/bootstrap-checks.html
      discovery.type: single-node
    networks:
      - elk

  logstash:
    build:
      context: "${PWD}/ELK/logstash/"
      dockerfile: logstash.Dockerfile
      args:
        ELK_VERSION: $ELK_VERSION
    volumes:
      - type: bind
        source: "${PWD}/ELK/logstash/config/logstash.yml"
        target: /usr/share/logstash/config/logstash.yml
        read_only: true
      - type: bind
        source: "${PWD}/ELK/logstash/pipeline"
        target: /usr/share/logstash/pipeline
        read_only: true
    ports:
      - "5001:5001/tcp"
      - "5001:5001/udp"
      - "9600:9600"
    environment:
      LS_JAVA_OPTS: "-Xmx256m -Xms256m"
    networks:
      - elk
    depends_on:
      - elasticsearch

  kibana:
    build:
      context: ELK/kibana/
      dockerfile: kibana.Dockerfile
      args:
        ELK_VERSION: $ELK_VERSION
    volumes:
      - type: bind
        source: "${PWD}/ELK/kibana/config/kibana.yml"
        target: /usr/share/kibana/config/kibana.yml
        read_only: true
    ports:
      - "5601:5601"
    networks:
      - elk
    depends_on:
      - elasticsearch

networks:
  elk:
    driver: bridge

run docker-compose.yml

$ docker-compose up --build 
profile
개발을 개발개발

2개의 댓글

comment-user-thumbnail
2021년 2월 17일

저 혹시 너무 늦게 질문 드렸을 수도있는데요...

yml파일을 그냥 volumes로 옮긴다고해도

그 yml파일을 못 읽더라구요 그래서 계속 elastic의 노드 종류를 master, data를 구분하지 못하고

mdi로 취급해 버리는데 이런경유 volumes를 잘못 쓴것 인가요? 아니면 제가 놓친 설정 부분이 따로 있는 건가요..?

1개의 답글