이번엔 Docker를 이용해 ELK 스택을 구성해 보겠다. Docker는 LXC 기술중 하나로서, 이식성이 뛰어난 격리된 프로세스 컨테이너를 통해 어플리케이션을 구동하는 방식이다. Docker 관련 문서들은 차고 넘치니, 따로 정리하지는 않겠다.
Docker Compose는 이러한 Docker 컨테이너 여러개를 조합(Compose)하여 설정 할 수 있게 해주고, 따라서 다수의 컨테이너 설정을 하나의 파일에서 가능하게 해 준다. 또한 설정된 컨테이너를 한번에, 또는 각각 하나씩 구동 할 수도 있다.
하지만 단 하나의 컨테이너를 구동할때도 Docker Compose가 유용하다.
가령, 아래의 tomcat 컨테이너를 띄우는 Docker 명령이 있다고 하자.
$ docker run -it --rm -p 8888:8080 tomcat:8.0
위의 설정과 동일한 컨테이너를 Docker Compose로는 아래와 같이 설정하여 구동할 수 있다.
version: '2' services: tomcat: image: tomcat:8.0 ports: - 8888:8080
뭔가 텍스트가 더 많이 들어 간 것 같지만 기분 탓일 거다. 일단 깔끔하게 YAML 형식을 지원하는 Docker Compose 설정이 보기가(가독성이) 더 좋아 보인다. 위의 기본 docker 명령 예제에서 입력한 옵션은 많지 않지만, 훨씬 더 복잡한 옵션을 입력하고 컨테이너를 구동한다고 했을때 옵션을 입력하기도, 확인하기도 어려울 것이다. 따라서, 복잡한 하나 또는 여러개의 컨테이너 설정, 그리고 그 컨테이너들간의 관계를 설정 해야할 때는 당연히 뒤도 안보고 Docker Compose를 사용해야 한다.
docker-compose.yml 작성
ELK를 위한 docker-compose.yml 파일의 기본 골격은 아래와 같다.
version: '2' services: elasticsearch: . . . logstash: . . . kibana: . . .
하나씩 살펴보자.
1) Elasticsearch
elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:5.4.0 container_name: elasticsearch volumes: - ./elasticsearch/config/elasticsearch.yml:/usr/share /elasticsearch/config/elasticsearch.yml - ./elasticsearch/data:/usr/share/elasticsearch/data environment: ES_JAVA_OPTS: "-Xmx2048m -Xms2048m" ports: - 9200:9200 - 9300:9300
'volumes' 설정을 통해서 외부의 파일시스템과 컨테이너 내부의 파일시스템을 마운트한다. [외부디렉토리]: [내부디렉토리] 와 같은 형식으로 마운트할 수 있는데, 위에서 보는것과 같이 파일 자체(elasticsearch.yml)도 마운트 가능하다.
'environment'로 elasticsearch 인스턴스의 JVM 옵션을 줄 수 있다. 'ports' 또한 컨테이너 외/내부의 포트를 설정하여 해당 포트를 통한 통신을 가능하게 해 준다. 별거 없다. ㅇㅇ
2) Logstash
logstash: image: docker.elastic.co/logstash/logstash:5.4.0 container_name: logstash command: logstash -f /usr/share/logstash/pipeline/logstash.conf volumes: - ./logstash/config/:/usr/share/logstash/config/ - ./logstash/pipeline/:/usr/share/logstash/pipeline/ environment: LS_JAVA_OPTS: "-Xmx2048m -Xms2048m" ports: - 10080:10080 depends_on: - elasticsearch
elasticsearch 설정과 흡사하다. 단, 'command' 설정으로 컨테이너를 구동할때 'logstash -f ... ' 명령어로 logstash 를 실행하도록 한다. 물론 '-f' 옵션 다음의 오는 경로는 컨테이너 내부 파일 경로이다.
'depends_on' 은 'elasticsearch' 컨테이너가 시작한 후에 logstash 컨테이너를 구동하도록 하는 설정이다.
3) Kibana
kibana: image: docker.elastic.co/kibana/kibana:5.4.0 container_name: kibana volumes: - ./kibana/config/:/usr/share/kibana/config ports: - 5601:5601 depends_on: - logstash
설명할 건 다 했으니 생략.
docker-compose 구동
'docker-compose.yml' 파일이 위치하고 있는 디렉토리에서,
아래와 같은 명령을 통해 구동 한다.
$ docker-compose up -d
로그를 보고 싶다면 아래 명령어를 사용한다.
$ docker-compose logs -f --tail="100" [service_name]
설정파일의 전체 내용은 아래에 있다.
https://gist.github.com/JuPyoHong/17362d9e0b64256b627dc063b00cc357