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개의 답글

관련 채용 정보