본문 바로가기

Open source

Docker compose를 활용한 Elasticsearch, Kibana, Logstash 구축 및 활용 part1 (for Mac)

들어가기 앞서..

- "내 맘대로 네이버 뉴스 스크래핑"[링크]의 연장선으로 스크래핑한 스케줄링하여 색인/검색할 시스템이 필요해서 Elasticsearch를 이용해 보기로 했다. 검색을 하던 중 보통 ELK(Elasticsearch, Logstash, Kibana : Elastic stack)라고 3가지를 동시에 구축해서 활용하는 경우가 많은 것 같아 ELK를 구축하기로 했다. 처음에는 그냥 Docker를 활용하다가, 아무래도 3가지를 동시에 유지 관리하기가 어려워, Docker-compose를 활용했다.

 

Elastic Stack

  1) Elasticsearch : Apache Lucene기반으로 텍스트, 숫자, 위치 기반 정보, 정형 및 비정형 데이터 등 모든 유형의 데이터를 위한 무료 검색 및 분석 엔진으로 분산형 및 개방형을 특징으로 한다.

  2) Logstash : 실시간 파이프라인 기능을 가진 오픈소스 데이터 수집엔진이다. 서로 다른 소스의 데이터를 탄력적으로 통합하고 사용자가 선택한 목적지로 데이터를 정규화할 수 있다. 근본적으로는 로그 수집의 혁신을 주도해 왔지만 다양한 영역으로 확장되고 있다.

  3) Kibana : Elastic Stack을 기반으로 구축된 무료 오픈 소스 프론트엔드 어플리케이션으로, Elasticsearch에서 색인된 데이터를 검색하고 대시보드를 통해 시각화 하는 기능을 제공한다. 

ref. www.elastic.co/kr/what-is/

 

 

Docker & Docker-compose 차이

  1) Docker : Single Container를 관리하는 것이고, 커맨드 라인에서 명령어를 실행할 수 있다.

  2) Docker-compose : multi Container를 관리하는 것이고, yaml file 기반으로 명령어를 명시하여, 컨테이너를 정의하고 관리한다. 도커 기반의 시스템의 가독성이나 관리 측면에서 Docker-compose가 좋은듯 . . (서비스 아키텍쳐를 잘모르지만, 최근 마이크로서비스아키텍쳐를 추구하는데, 적합할듯) 

(자세한 내용 및 활용은 추후 정리해서 작성 예정)

 

Docker VS Docker-Compose  (고래와 문어 차이?)

 


Installation

Docker ELK git 레파지토리에서 git clone을 통해 프로젝트를 로컬로 받는다.

mkdir elk
cd ./elk
git clone https://github.com/deviantony/docker-elk.git

해당 git 레파지토리의 디렉토리 구조는 아래와 같다.

➜ docker-elk (main) ✗ tree . 
├── LICENSE 
├── README.md 
├── docker-compose.yml 
├── docker-stack.yml 
├── elasticsearch 
│   ├── Dockerfile 
│   └── config 
│   └── elasticsearch.yml 
├── extensions 
│   ├── README.md 
│   ├── apm-server 
│   │   ├── Dockerfile 
│   │   ├── README.md 
│   │   ├── apm-server-compose.yml 
│   │   └── config 
│   │   └── apm-server.yml 
│   ├── curator 
│   │   ├── Dockerfile 
│   │   ├── README.md 
│   │   ├── config 
│   │   │   ├── curator.yml 
│   │   │   └── delete_log_files_curator.yml 
│   │   └── curator-compose.yml 
│   ├── enterprise-search 
│   │   ├── Dockerfile 
│   │   ├── README.md 
│   │   ├── config 
│   │   │   └── enterprise-search.yml 
│   │   └── enterprise-search-compose.yml 
│   ├── logspout
│   │   ├── Dockerfile 
│   │   ├── README.md 
│   │   ├── build.sh 
│   │   ├── logspout-compose.yml 
│   │   └── modules.go
│   └── metricbeat 
│   ├── Dockerfile
│   ├── README.md 
│   ├── config 
│   │   └── metricbeat.yml
│   └── metricbeat-compose.yml 
├── kibana 
│   ├── Dockerfile
│   └── config 
│   ├── 1 
│   └── kibana.yml 
└── logstash 
      ├── Dockerfile 
      ├── config 
      │    └── logstash.yml 
      └── pipeline
              └── logstash.conf

기본적인 환경설정을 한다. (특별한 이슈가 없다면 수정하지 않아도 구동됨.)

 

Bold체의 파일 및 경로내의 파일에서 기본적인 configuration을 수정해주면 된다. elasticsearch, logstash, kibana의 각 컨테이너에 대한 셋팅은 "docker-compose.yml"에서 수정을 해주고, 특히 elasticsearch password의 경우 초기에 "changeme"로 되어 있고, 이를 수정할 경우 각 컨테이너 별(bold체 경로)로 .yml내의 elasticsearch password를 동일하게 변경해주면 된다. (숫자로만 이루어진 비밀번호 사용시 ""로 감싸서 String형으로 만들어 줘야 함.)

 

또한 Elastic stack내에서 사용하는 플러그인 모듈은 각 경로 내의 Dockerfile에 아래와 같이 명령어를 입력하면 사용할 수 있다.

Elasticsearch에서 공식으로 지원하는 한국어 형태소 분석기인 nori를 추가로 설치해 주었다. (nori는 mecab기반의 형태소 분석기 [링크])

# Add your elasticsearch plugins setup here
# Example: RUN elasticsearch-plugin install analysis-icu
RUN elasticsearch-plugin install --batch analysis-nori

 

 

새로운 이미지를 Build하고 구동한다.

 

아래 명령어 처럼 새로 Docker 이미지를 빌드한 후, 이전 버전에서 사용된 elasticsearch volume을 제거하고 다시 컨테이너를 구동한다.

docker-compose build
docker volume rm docker-elk_elasticsearch
docker-compose up

구동이 완료되면 아래와 같이, kibana(elasticsearch 도구)를 웹에서 "localhost:5601"로 접속해서 확인할 수 있다.

kibana 접속 화면

 

컨테이너 구동이 잘안되는 경우..

 

docker-compose up 명령어를 통해 각 컨테이너를 실행했을 때, 잘 안되는 경우가 있었는데, 그 부분은 메모리 문제가 대부분 이었다. 기본적으로 mac os에서 docker를 사용하는 경우 default 메모리가 2gb이다. 메모리 제한을 2gb인 상태로 Elastic stack을 구동하는 경우 컨테이너 하나가 죽는다거나, 제대로 안되는 케이스가 많았다. 아래와 같이 docker의 메모리를 3gb로 늘린 후 아무 문제 없이 제대로 구동 됐다.

Max os에서 docker preferences메뉴에서 meomory 증진

 

마무리  . .

docker-compose를 처음 활용해서 ELK를 구축했고 정상적으로 작동하는 것을 확인했다. (Mac os에서 메모리 이슈를 확인하는데 시간 소모를 많이했지만..) 다음에는 구축한 ELK를 활용하는(색인/검색) 부분을 정리할 예정이다.