개요

회사의 ES를 5.2.0으로 업그레이드 하며 docker 사용을 검토하기 위해 아래와 같은 이미지를 제작하였다.

결론만 소개

docker를 사용할 줄 안다면 아래의 명령어로 간편하게 실행할 수 있다. docker daemon형태로 제공하지 않는 이유는 es를 직접 내렸다 올릴있도 있고 직접 컨테이너 안의 shell로 들어갈수 있어야 여러모로 편리하기 때문이다.

$ docker run -p 9200:9200 --volume /data:/es/data -i -t lks21c/es:5.2.0 /bin/bash
$ cd /es
$ chown es data
$ su es
$ cd elasticsearch-5.2.0
$ ./bin/elasticsearch

세부 이미지 빌드방법

해당 이미지는 아래와 같은 Spec을 지닌다.

  • centOS 6.6
  • JDK 1.8, 121
  • ES 5.2.0
  • 은전한닢 설치
  • 9200포트 외부 노출
  • Docker가 설치된 HOST장비의 /data 디렉토리가 컨테이너의 /es/data 디렉토리로 마운트됨

기본 이미지 준비

기본 이미지는 production 용도로의 사용을 고려하기 위해 centOS 6.6을 base로 하였다.

$ docker run -i -t centos:6.6 /bin/bash

JDK8 설치

$ yum install wget tar curl
$ wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u121-b13/e9e7ea248e2c4826b92b3f075a80e441/jdk-8u121-linux-x64.tar.gz"

JAVA 기본 설정

$ cd /opt/jdk1.8.0_121/
$ alternatives --install /usr/bin/java java /opt/jdk1.8.0_121/bin/java 2
$ alternatives --config java
$ ~/.bashrc에 export JAVA_HOME=/opt/jdk1.8.0_121 추가
$ ~/.bashrc에 export PATH=$PATH:/opt/jdk1.8.0_121/bin 추가
$ source ~/.bashrc

mecab-ko 라이브러리 설치

$ yum install gcc-c++
$ wget http://www.kwangsiklee.com/wp-content/uploads/2017/02/mecab-0.996-ko-0.9.2.tar-1.gz
$ tar -xvzf mecab-0.996-ko-0.9.2.tar-1.gz
$ cd mecab-0.996-ko-0.9.2
$ ./configure
$ make
$ make check
$ sudo make install
$ sudo ldconfig 라이브러리는 기본적으로 /usr/local/lib/ 에 설치 된다.

mecab-ko-dic 사전 설치

$ wget http://www.kwangsiklee.com/wp-content/uploads/2017/02/mecab-ko-dic-2.0.1-20150920.tar.gz
$ tar -xvzf mecab-ko-dic-2.0.1-20150920.tar.gz
$ cd mecab-ko-dic-2.0.1-20150920
$ ./configure
$ make
$ sudo make install 사전은 기본적으로 /usr/local/lib/mecab/dic/mecab-ko-dic에 설치 된다.

analysis-mecab-ko 플러그인 설치

$ ./bin/elasticsearch-plugin install https://bitbucket.org/eunjeon/mecab-ko-lucene-analyzer/issues/attachments/7/eunjeon/mecab-ko-lucene-analyzer/1486603969.8/7/elasticsearch-analysis-mecab-ko-5.2.0.0.zip
$ # 경고 메세지는 y로 넘어가면 된다.

mecab-java 다시 컴파일

$ wget https://bitbucket.org/eunjeon/mecab-java/downloads/mecab-java-0.996.tar.gz
$ tar zxvf mecab-java-0.996.tar.gz
$ cd mecab-java-0.996
$ vi Makefile

Makefile에서 바꿀 부분은 2가지 이다.

(CXX) -O3 -c -fpic $(TARGET)_wrap.cxx $(INC) 라인을 $(CXX) -O1 -c -fpic $(TARGET)_wrap.cxx $(INC) 으로 바꾼다.

INCLUDE 부분을 INCLUDE=/usr/lib/jvm/java-8-oracle/include 이런식으로 본인에 맞게 변경한다.

$ make
$ cp MeCab.jar /home/lks21c/elasticsearch-5.1.1/plugins/elasticsearch-analysis-mecab-ko/elasticsearch-analysis-mecab-ko-5.1.1.0.jar #경로는 맞게 변경
$ sudo cp libMeCab.so /usr/local/lib

환경변수 설정

$ vi ~/.bashrc
아래의 2줄을 추가해준다.
export ES_JAVA_OPTS="${ES_JAVA_OPTS} -Djava.library.path=/usr/local/lib"
export LD_LIBRARY_PATH=/usr/local/lib
$ source ~/.bashrc

es 계정 생성

보안을 위해 ES를 실행할 계정을 따로 생성한다.
$ adduser es

파일 소유권 전환

root권한에서 아래의 명령을 실행하여 파일의 소규권을 모두 “es”계정으로 전환한다.

$ chown -R es /es

nproc 증가

ES 레퍼런스에 나온 nproc 증가를 해준다.

$ vi /etc/security/limits.conf
아래의 2라인 추가
es               hard    nproc            2048
es               soft    nproc            2048

Virtual Memory 설정

$ vi /etc/sysctl.conf
vm.max_map_count=262144

File Descriptor

$ vi /etc/security/limits.conf
아래 두라인 추가
es               soft    nofile           65536  
es               hard    nofile           65536

최종실행 커맨드

$ docker run -p 9200:9200 --volume /data:/es/data -i -t lks21c/es:5.2.0 /bin/bash
$ cd /es
$ chown es data
$ su es
$ cd elasticsearch-5.2.0
$ ./bin/elasticsearch