도커(Docker) + 엘라스틱 서치(Elastic Search) ELK 스택 디플로이 하기
2020, Sep 07
ELK 스택이란?
- Elasticsearch, Logstash, Kibana 를 통칭
ElasticSearch : JSON 기반의 분산형 오픈 소스 검색 및 분석 엔진, 주로 REST API로 처리
Logstash : 여러 소스에서 동시에 데이터를 수집하여 변환한 후 stash
(엘라스틱 서치와 같은)로 전송하는 서버 사이드 데이터 처리 파이프 라인
Kibana : 사용자가 엘라스틱 서치에서 차트와 그래프를 이용해 데이터를 시각화 할 수 있게 함
elastic search, kibana, logstash 이미지 pull 받기
[root@localhost test]# docker pull docker.elastic.co/elasticsearch/elasticsearch:7.3.1
[root@localhost test]# docker pull docker.elastic.co/kibana/kibana:7.3.1
[root@localhost test]# docker pull docker.elastic.co/logstash/logstash:7.3.1
엘라스틱 서치 커스텀 빌드
- 한국어 분석기 플러그인인
nori
를 함께 설치하기 위해 DockerFile로 커스텀 빌드함
//Dockerfile 생성
vi Dockerfile
//Dockerfile 내용
FROM elasticsearch:7.3.1
RUN /usr/share/elasticsearch/bin/elasticsearch-plugin install --batch analysis-nori
//elasticsearch-custom이라는 태그로 커스텀 빌드 (default는 elasticsearch)
[root@localhost elk]# docker build --tag elasticsearch-custom .
컨테이너 실행
- 엘리스틱 서치 : 커스텀 빌드하였으므로 elasticsearch-custom의 이름으로 지정하여 컨테이너를 올려줌. (JVM의 Heap 메모리를 설정할 수 있는 -e ES_JAVA_OPTS=”-Xms16g -Xmx16g”는 기억)
- 키바나 : pull 받은 이미지에 5601 포트를 지정하여 컨테이너를 올려줌.
- 로그스태시 : pull 받은 이미지에 5044 포트를 지정하여 컨테이너를 올려줌.
- 커맨드 뒤에 로그가 출력되는 것이 불편하다면
/dev/null 2>&1
를 붙여줌.
[root@localhost elk]# docker run -p 9200:9200 -p 9300:9300 elk-e "discovery.type=single-node" elasticsearch-custom
[root@localhost elk]# docker run -d --link elk-e:elasticsearch-custom --name elk-k -p 5601:5601 docker.elastic.co/kibana/kibana:7.3.1
[root@localhost elk]# docker run -d --link elk-e:elasticsearch-custom --name elk-l -p 5044:5044 docker.elastic.co/logstash/logstash:7.3.1
컨테이너 프로세스 확인
[root@localhost elk]# docker container ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c07c91e993f6 docker.elastic.co/logstash/logstash:7.3.1 "/usr/local/bin/dock…" 5 minutes ago Up 5 minutes 0.0.0.0:5044->5044/tcp, 9600/tcp elk-l
f2e06e2e88e6 docker.elastic.co/kibana/kibana:7.3.1 "/usr/local/bin/dumb…" 6 minutes ago Up 6 minutes 0.0.0.0:5601->5601/tcp elk-k
79ec3b09b257 elasticsearch-custom "/usr/local/bin/dock…" 10 minutes ago Up 10 minutes 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp elk-e
elk-k config 수정
- elasticsearch-custom으로 빌드했기 때문에 설정 변경 필요
[root@localhost elk]# docker container exec -it elk-k bash
bash-4.2$ vi 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" ] //변경할 부분
xpack.monitoring.ui.container.elasticsearch.enabled: true
//수정을 완료했다면 쉘에서 빠져나온다.
bash-4.2$ exit
//elk-k 재시작
[root@localhost elk]# docker container restart elk-k
elk-k
logstash config 수정
- logstash도 위와 동일하게 config를 수정해준다.
[root@localhost elk]# docker exec -it elk-l bash
bash-4.2$ vi config/logstash.yml
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://elasticsearch-custom:9200" ] //수정할 부분
//수정을 완료했다면 쉘에서 빠져나온다.
bash-4.2$ exit
//elk-l 재시작
[root@localhost elk]# docker container restart elk-l
elk-l
각 컨테이너의 포트 접속
컨테이너 쉘 실행 명령어
- 엘라스틱 서치 :
docker exec -it elk-e bash
- 로그 스태시 :
docker exec -it elk-l bash
- 키바나 :
docker exec -it elk-k bash
[root@localhost elk]# docker exec -it elk-e bash
[root@79ec3b09b257 elasticsearch]# exit
exit
[root@localhost elk]# docker exec -it elk-l bash
bash-4.2$ exit
exit
[root@localhost elk]# docker exec -it elk-k bash
bash-4.2$ exit
exit
컨테이너 로그 확인
- 엘라스틱 서치 :
docker container logs elk-e
- 로그 스태시 :
docker container logs elk-l
- 키바나 :
docker container logs elk-k
[root@localhost elk]# docker container logs elk-e
[root@localhost elk]# docker container logs elk-l
[root@localhost elk]# docker container logs elk-k
컨테이너 중지, 삭제
- 엘라스틱 서치 중지 :
docker container stop elk-e
- 로그 스태시 중지 :
docker container stop elk-l
- 키바나 중지 :
docker container stop elk-k
- 엘라스틱 서치 삭제 :
docker container rm elk-e
- 로그 스태시 삭제 :
docker container rm elk-e
- 키바나 삭제 :
docker container rm elk-e
[root@localhost elk]# docker container stop elk-e
[root@localhost elk]# docker container stop elk-l
[root@localhost elk]# docker container stop elk-k
[root@localhost elk]# docker container rm elk-e
[root@localhost elk]# docker container rm elk-l
[root@localhost elk]# docker container rm elk-k
컨테이너 프로세스 체크
docker container ps