☆IT 개발 프로그램☆/Open Source

[도커 + 엘라스틱서치] Docker로 ElasticSearch ELK 스택 디플로이

호기심을 품고사는 중 2020. 6. 4. 15:12

도커로 ELK스택 구동하기

도커를 사용하는 이유

  1.  다른 OS 플랫폼을 사용하는 유저들도 동일한 로컬 개발환경을 구성할 수 있다.
  2. 쉽고 간단한 버전 매니지먼트가 가능하다.


 

도커로 ELK 스택 디플로이

도커(Docker)를 이용하여 엘라스틱서치 + 키바나 + 로그스태쉬, 일명 ELK스택을 기동한다. 

 


 

오리지널 빌드

별도 플러그인이나 config 수정이 필요하지 않으면 깃허브에서 공식 이미지를 그대로 pull해와서 그대로 빌드할수 있다. 키바나, 로그스태쉬 이미지를 pull한다. 버전명은 물론 편의에 따라 수정할 수 있다.

# docker pull docker.elastic.co/elasticsearch/elasticsearch:7.3.1
$ docker pull docker.elastic.co/kibana/kibana:7.3.1
$ docker pull docker.elastic.co/logstash/logstash:7.3.1

 

 

 

커스텀 빌드

엘라스틱서치의 경우, 한국어 분석기 플러그인인 'nori'를 함께 설치하기 위하여 DockerFile을 만들어 커스텀 빌드를 해보자.

$ vi Dockerfile
FROM elasticsearch:7.3.1

RUN /usr/share/elasticsearch/bin/elasticsearch-plugin install --batch analysis-nori

Dockerfile 을 만든 후, 파일이 있는 디렉토리안에서 빌드 커맨드를 실행한다. elasticsearch-custom 이라는 이름으로 태그를 달아주었다.

$ docker build --tag elasticsearch-custom .

** 태그를 달지 않고 그대로 진행하는 경우, 후술할 키바나의 config 수정 파트는 건너 뛰기 바란다. default는 elasticsearch다.

 

 

컨테이너 런

$ docker run -p 9200:9200 -p 9300:9300 --name elk-e -e "discovery.type=single-node" elasticsearch-custom
$ docker run -d --link elk-e:elasticsearch-custom --name elk-k -p 5601:5601 docker.elastic.co/kibana/kibana:7.3.1
$ docker run -d --link elk-e:elasticsearch-custom --name elk-l -p 5044:5044 docker.elastic.co/logstash/logstash:7.3.1

 

1) 엘라스틱서치 RUN

엘라스틱서치를 커스텀 빌드할때 elasticsearch-custom 이라는 태그를 달았으므로, elasticsearch-custom의 이름의 이미지를 지정하여 컨테이너에 올려주었다. --name 옵션으로 컨테이너의 이름을 지정해주는 것이 여러모로 편리하다. -e 옵션은 환경변수를 새로 지정하거나, 변경하는 옵션인데, 예제에서는 사용하지 않았지만  JVM 의 Heap 메모리를 설정할 수 있는 ES_JAVA_OPTS 정도는 기억해두는 것이 좋다. 

-e ES_JAVA_OPTS="-Xms16g -Xmx16g"

 

2) 키바나 RUN

컨테이너 'elk-k'에 아까 pull해온 이미지 kibana 7.3.1을 올린다. 

 

3) 로그스태쉬 RUN

컨테이너 'elk-l'에 아까 pull해온 이미지 logstash 7.3.1을 올린다. 

 

 

* 커맨드뒤에 /dev/null 2>&1 를 붙여주면, 컨테이너는 백그라운드 실행되고 stdout은 /dev/null 으로 가게된다. 콘솔에 로그메시지가 자동으로 출력되는 것이 번거로울때에 붙여주면 좋다.

$ docker run -d --link elk-e:elasticsearch-custom --name elk-k -p 5601:5601 docker.elastic.co/kibana/kibana:7.3.1 /dev/null 2>&1

 

 

 

컨테이너 프로세스 확인

$ docker container ps

컨테이너가 잘 돌고 있다.

 

 

 

 

컨피그 수정

$ docker container exec -it elk-k bash
bash-4.2$ vi config/kibana.yml

키바나 세팅을 수정하기 위하여 키바나 컨테이너의 shell에 액세스한다. 키바나에 연동할 엘라스틱서치 이미지이름을 바꿔주기 위해서이다. default 이미지 이름이 elasticsearch로 되어있는데, elasticsearch-custom으로 빌드했으므로 config에서 아래와같이 수정해주었다.

bash-4.2$ cat config/kibana.yml
#
# ** THIS IS AN AUTO-GENERATED FILE **
#

# Default Kibana configuration for docker target
server.name: kibana
server.host: "0"
elasticsearch.hosts: [ "http://elasticsearch-custom:9200" ]
#elasticsearch.hosts: [ "http://elasticsearch:9200" ]
xpack.monitoring.ui.container.elasticsearch.enabled: true

 

그리고 컨테이너 쉘을 빠져나와 컨테이너를 재시작해준다.

bash-4.2$ exit
$ docker container restart elk-k

 

같은 작업을 logstash에서도 해준다. (logstash는 설명을 생략한다.)

 

 

 

 

동작 확인

각 컨테이너의 포트로 접속했을 때 아래와 같이 기동되면 정상이다.

 

엘라스틱서치 localhost:9200 접속

 

Kibana localhost:5601 접속

 


 

도커 커맨드

컨테이너 쉘 실행

# docker container exec [OPTIONS] CONTAINER COMMAND [ARG...]
$ docker container exec -it elk-e
$ docker container exec -it elk-e bash

 

컨테이너 로그 체크

# docker container logs [OPTIONS] CONTAINER
$ docker container logs elk-e
$ docker container logs elk-l
$ docker container logs elk-k

 

컨테이너 스탑, 삭제

$ docker container stop elk-container
$ docker container rm elk-container

 

컨테이너 프로세스 체크

$ docker container ps