본문 바로가기

Docker

[Docker] Elasticsearch, Kibana를 docker-compose로 구동

반응형

Elasticsearch 정리

Elasticsearch 설치

Elasticsearch 설치는 docker cli를 통해 쉽게 할 수 있다. (생략 가능)

 

$ docker pull docker.elastic.co/elasticsearch/elasticsearch:7.15.2

 

 

Elasticsearch 단일 노드 클러스터 실행

 

docker run --name elasticsearch\
 -p 127.0.0.1:9200:9200\
 -p 127.0.0.1:9300:9300\
 -e "discovery.type=single-node"\
 docker.elastic.co/elasticsearch/elasticsearch:7.15.2

 

9200번 포트는 elasticsearch가 클라이언트와 통신하기 위한 포트이다. 포트 번호가 중복되면 9200번 부터 9299번 까지 자동으로 부여된다.

9300번 포트는 노드가 여러게일 때 elasticsearch 간 통신을 위한 포트이다. 마찬가지로 노드끼리 중복된 포트가 사용되면 9301번 부터 9399번 까지 자동으로 부여된다.

환경 변수(discovery.type=single-node)는 이전 버전에서는 싱글노드 타입을 명시 안 해줘도 실행이 되었는데 최근 버전부터는 싱글노드 옵션을 명시해주어야 에러가 나지 않는다.

 

curl -XGET 'localhost:9200'

 

위 명령어를 통해 elasticsearch가 정상적으로 실행되었는지 확인할 수 있다.

 

 

 

Docker Compose로 다중 노드 클러스터 실행

docker-compose.yml파일을 작성한다.

 

version: '3.8'
services:
  es01:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.15.2
    container_name: es01
    environment:
      - node.name=es01
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es02,es03
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - data01:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
    networks:
      - my-network
  es02:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.15.2
    container_name: es02
    environment:
      - node.name=es02
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es01,es03
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - data02:/usr/share/elasticsearch/data
    networks:
      - my-network
  es03:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.15.2
    container_name: es03
    environment:
      - node.name=es03
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es01,es02
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - data03:/usr/share/elasticsearch/data
    networks:
      - my-network

volumes:
  data01:
    driver: local
  data02:
    driver: local
  data03:
    driver: local

networks:
  my-network:
    name: test-network

 

  • environment
    • node.name - 노드의 이름을 지정
    • cluster.name - 노드의 클러스터 지정
    • discovery.seed_hosts - 클러스터 구성을 위해 바인딩 할 노드의 ip또는 도메인 주소를 배열 형태로 지정, 주소만 적는 경우 9300~9305 사이의 포트값만 검색하며 이 밖의 범위에 있는 경우 포트번호까지 같이 적어줘야한다.
    • cluster.initial_master_nodes - 클러스터가 최초 실행 될 때 여기에 명시된 노드들 중 마스터 노드를 선출.
    • bootstrap.memory_lock: true - Elasticsearch가 사용중인 힙 메모리 영역을 다른 자바 프로그램이 간섭 못하도록 미리 점유하는 설정, 항상 true로 설정하는것을 권장
    • "ES_JAVA_OPTS=-Xms512m -Xms512m" - 수동으로 JVM 힙 크기를 512MB로 설정, 공식 문서에는 프로덕션 환경에서는 사용하지 않는것을 권장한다. 설정하지 않을 시 힙 크기를 자동으로 조정한다.
  • ulimits.melock
    • 성능 및 노드 안정성을 위해 스와핑 비활성화 (참고)

3개의 노드를 가진 클러스터를 구성한다. es01은 localhost:9200을 listen 하고 있고, es02와 es03은 도커 네트워크를 통해 es01과 커뮤니케이션을 한다.

이 구성은 모든 네트워크 인터페이스에서 9200 포트를 열어줘야 한다. 이것은 엘라스틱 클러스터는 공개적으로 접속이 가능하고, 잠재적으로 firewall 세팅을 무시하는 것을 의미한다. 만약 9200 포트를 공개적으로 오픈하고 싶지 않다면 reverse proxy를 사용하면 된다. docker-compose 파일에서 9200:9200 이 부분을 127.0.0.1:9200:9200로 변경해주면, host만 elasticsearch에 접근할 수 있다.

도커를 재시작해도 데이터가 유지되도록 하기 위해 data01, data02, data03이라는 이름을 가진 공유 볼륨에 노드의 데이터를 저장한다.

 

$ docker-compose -f /Users/sanho1tech/Desktop/compose-files/elasticsearch-multi-node-compose.yml up -d

 

위 명령어로 elasticsearch 클러스터를 실행한다.

 

 

curl -X GET "localhost:9200/_cat/nodes?v=true&pretty"

 

 

현재 노드들의 상태를 표시해주고 있다. 마스터 노드는 es03번이 선출된 것을 확인할 수 있다.

 

반응형

 

Kibana 실행

docker pull docker.elastic.co/kibana/kibana:7.15.2

 

위 명령어는 생략 가능하다.

 

docker run -d --name kibana\
 --network test-network\
 -p 5601:5601\
 -e "ELASTICSEARCH_HOSTS=http://es01:9200"\
 -e "ELASTICSERCH_URL=http://es01:9200"\
 docker.elastic.co/kibana/kibana:7.15.2

 

run 후 정상적으로 실행 됐다면 잠시 기다리고 localhost:5600 으로 접속이 가능하다.

 

 

Elasticsearch와 Kibana를 docker compose 로 실행

version: '3.8'
services:
  ...
  kibana:
    image: docker.elastic.co/kibana/kibana:7.15.2
    container_name: kibana
    ports:
      - 5601:5601
    environment:
      ELASTICSEARCH_URL: http://es01:9200
      ELASTICSEARCH_HOSTS: http://es01:9200
    networks:
      - my-network
  ...
networks:
  my-network:
    name: test-network

 

Elasticsearch 클러스터를 실행하는 compose 파일에 추가적으로 kibana실행하는 구문만 정의해주면 된다.

 

 

작성한 docker compose 파일을 실행해주면 다음과 같이 잘 실행이 된다.

반응형