개발일기

docker-compose ELK 설치 본문

취준생 프로젝트

docker-compose ELK 설치

한둥둥 2024. 8. 14. 17:37

 

우선 ELK를 사용하는 이유는 ElasticSearch를 사용하여 자동완성 기능을 만들 예정이며, 

Logstash , kibana, elasticSearch를 통하여 logback을 통하여 log를 분석하여 그래프로 볼 예정이다.

이에 따라서 해당 기능들이 필요하기에 ELK 세팅을 진행하게 되었다. 

참고로 ELK 설치에 관한 자세한 내용이 없어 세팅하는데 많은 시간을 사용한 거 같다. 

 

 😎 1. Git clone 

git clone https://github.com/teichae/docker-elk

 

위에와 같이 clone 을 사용하여 클론해주었다. 

 

elastic이 있고 원래는 여기에  docker-compose.yml 이 있다. 나는 해당 부분을 밖에다가 빼주어 관리해주었다. 

 

 

😎 elasitcsearch.yml 

## Default Elasticsearch configuration from Elasticsearch base image.
## https://github.com/elastic/elasticsearch/blob/main/distribution/docker/src/docker/config/elasticsearch.yml
#
cluster.name: docker-cluster
network.host: 0.0.0.0

## X-Pack settings
## see https://www.elastic.co/guide/en/elasticsearch/reference/current/security-settings.html
#
xpack.license.self_generated.type: basic
xpack.security.enabled: true

 

 

 

😜 kibana.yml

## Default Kibana configuration from Kibana base image.
## https://github.com/elastic/kibana/blob/main/src/dev/build/tasks/os_packages/docker_generator/templates/kibana_yml.template.ts
#
server.name: kibana
server.host: 0.0.0.0
elasticsearch.hosts: [ http://elasticsearch:9200 ]

 

 

😜 pipeline/logstash.conf

input {
    beats {
        port => 5044
    }

    tcp {
        port => 50000
    }

    file {
        path => "/usr/share/logstash/input/test-input.csv"
        start_position => "beginning"
        sincedb_path => "NUL"
    }
}

## Add your filters / logstash plugins configuration here

output {
    elasticsearch {
        hosts => "elasticsearch:9200"
        user => "elastic"
        password => "${LOGSTASH_INTERNAL_PASSWORD}"
        index => "test-input"
    }

    stdout {
        codec => json_lines
    }
}

 

🔥 1.  beats

beats { 
	port => 5044
}

- beats 입력 플러그인은 Filebeat와 같은 Beats 데이터를 수신하는 데 사용됨. 

- Logstash가 Beats 데이터를 수신할 포트를 지정.

- Beats 에이전트는 이 포트로 데이터를 전송

 

🔥 2. tcp

tcp {
    port => 50000
}

- tcp 입력 플러그인은 TCP 소켓을 통해 데이터를 수신하는 데 사용

- Logstash가 TCP 데이터를 수신할 포트를 지정

 

🔥 3. file

file {
    path => "/usr/share/logstash/input/test-input.csv"
    start_position => "beginning"
    sincedb_path => "NUL"
}

- file 입력 플러그인은 파일에서 데이터를 읽음

- /usr/share/logstash/input/test-input.csv : 데이터를 읽어올 파일의 경로를 지정

- est-input.csv라는 CSV 파일 읽음.

- start_position => "beginning" : 파일을 처음부터 읽기 시작. 항상 처음부터 읽어오게 만들어줌. 

- sincedb_path => "NUL" : Logstash는 기본적으로 파일의 읽기 위치를 추적하기 위해 sincedb라는 파일을 사용

- 여기서 NUL로 설정하면, 윈도우 환경에서 sincedb 파일이 생성 x , 매번 파일을 처음부터 읽음

 

😇 docker-compose.yml

environment:
      ELASTIC_PASSWORD: ${ELASTIC_PASSWORD:-}
      LOGSTASH_INTERNAL_PASSWORD: ${LOGSTASH_INTERNAL_PASSWORD:-}
      KIBANA_SYSTEM_PASSWORD: ${KIBANA_SYSTEM_PASSWORD:-}
      METRICBEAT_INTERNAL_PASSWORD: ${METRICBEAT_INTERNAL_PASSWORD:-}
      FILEBEAT_INTERNAL_PASSWORD: ${FILEBEAT_INTERNAL_PASSWORD:-}
      HEARTBEAT_INTERNAL_PASSWORD: ${HEARTBEAT_INTERNAL_PASSWORD:-}
      MONITORING_INTERNAL_PASSWORD: ${MONITORING_INTERNAL_PASSWORD:-}
      BEATS_SYSTEM_PASSWORD: ${BEATS_SYSTEM_PASSWORD:-}
    networks:
      - prod
    depends_on:
      - elasticsearch

  elasticsearch:
    build:
      context: ./elastic/elasticsearch/
      args:
        ELASTIC_VERSION: ${ELASTIC_VERSION}
    image: elasticsearch:8.14.3
    container_name: elasticsearch
    volumes:
      - ./elastic/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro,Z
      - ./elastic/elasticsearch:/usr/share/elasticsearch/data:Z
    ports:
      - 9200:9200
      - 9300:9300
    environment:
      node.name: elasticsearch
      ES_JAVA_OPTS: -Xms512m -Xmx512m
      # Bootstrap password.
      # Used to initialize the keystore during the initial startup of
      # Elasticsearch. Ignored on subsequent runs.
      ELASTIC_PASSWORD: ${ELASTIC_PASSWORD:-}
      # Use single node discovery in order to disable production mode and avoid bootstrap checks.
      # see: https://www.elastic.co/guide/en/elasticsearch/reference/current/bootstrap-checks.html
      discovery.type: single-node
    networks:
      - prod


  logstash:
    build:
      context: ./elastic/logstash/
      args:
        ELASTIC_VERSION: ${ELASTIC_VERSION}
    image: logstash:8.14.3
    container_name: logstash
    volumes:
      - ./elastic/logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml:ro,Z
      - ./elastic/logstash/pipeline:/usr/share/logstash/pipeline:ro,Z
      - ./elastic/logstash/input:/usr/share/logstash/input:ro,Z
    ports:
      - 5044:5044
      - 50001:50000/tcp
      - 50001:50000/udp
      - 9600:9600
    environment:
      LS_JAVA_OPTS: -Xms256m -Xmx256m
      LOGSTASH_INTERNAL_PASSWORD: ${LOGSTASH_INTERNAL_PASSWORD:-}
    networks:
      - prod
    depends_on:
      - elasticsearch
      
  kibana:
    build:
      context: ./elastic/kibana/
      args:
        ELASTIC_VERSION: ${ELASTIC_VERSION}
    image: kibana:8.14.3
    container_name: kibana
    volumes:
      - ./elastic/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml:ro,Z
    ports:
      - 5601:5601
    environment:
      KIBANA_SYSTEM_PASSWORD: ${KIBANA_SYSTEM_PASSWORD:-}
    networks:
      - prod
    depends_on:
      - elasticsearch

networks:
  prod:
    external: true

 

 

😎 ElasticSearch 

elasticsearch:
  build:
    context: ./elastic/elasticsearch/
    args:
      ELASTIC_VERSION: ${ELASTIC_VERSION}
  image: elasticsearch:8.14.3
  container_name: elasticsearch
  volumes:
    - ./elastic/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro,Z
    - ./elastic/elasticsearch:/usr/share/elasticsearch/data:Z
  ports:
    - 9200:9200
    - 9300:9300
  environment:
    node.name: elasticsearch
    ES_JAVA_OPTS: -Xms512m -Xmx512m
    ELASTIC_PASSWORD: ${ELASTIC_PASSWORD:-}
    discovery.type: single-node
  networks:
    - prod

 

 

  • build: context 경로에서 Docker 이미지를 빌드합니다. ELASTIC_VERSION은 빌드 중에 사용될 버전
  • image: 이미지를 직접 지정합니다. 여기서는 elasticsearch:8.14.3을 사용
  • container_name: 컨테이너의 이름을 elasticsearch로 지정
  • volumes: 호스트의 파일 시스템 경로를 컨테이너 내부 경로와 매핑.
    • ./elastic/elasticsearch/config/elasticsearch.yml: 설정 파일을 읽기 전용으로 매핑.
    • ./elastic/elasticsearch: Elasticsearch의 데이터 디렉터리를 매핑.
  • ports: 호스트와 컨테이너 간의 포트 매핑을 설정
    • 9200:9200: Elasticsearch HTTP API에 접근하기 위한 포트.
    • 9300:9300: Elasticsearch 노드 간 통신에 사용되는 포트.
  • environment: 환경 변수를 설정
    • node.name: Elasticsearch 노드의 이름을 지정.
    • ES_JAVA_OPTS: JVM 메모리 옵션을 설정.
    • ELASTIC_PASSWORD: 초기 관리자 비밀번호를 설정.
    • discovery.type: 단일 노드 모드로 실행되도록 설정(클러스터 부트스트랩 체크를 피하기 위함).
  • networks: prod 네트워크에 연결

 

😎 Logstash

logstash:
  build:
    context: ./elastic/logstash/
    args:
      ELASTIC_VERSION: ${ELASTIC_VERSION}
  image: logstash:8.14.3
  container_name: logstash
  volumes:
    - ./elastic/logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml:ro,Z
    - ./elastic/logstash/pipeline:/usr/share/logstash/pipeline:ro,Z
    - ./elastic/logstash/input:/usr/share/logstash/input:ro,Z
  ports:
    - 5044:5044
    - 50001:50000/tcp
    - 50001:50000/udp
    - 9600:9600
  environment:
    LS_JAVA_OPTS: -Xms256m -Xmx256m
    LOGSTASH_INTERNAL_PASSWORD: ${LOGSTASH_INTERNAL_PASSWORD:-}
  networks:
    - prod
  depends_on:
    - elasticsearch

 

  • build: context 경로에서 Docker 이미지를 빌드합니다. ELASTIC_VERSION은 빌드 중에 사용될 버전
  • image: 이미지를 직접 지정합니다. 여기서는 logstash:8.14.3을 사용
  • container_name: 컨테이너의 이름을 logstash로 지정

 

ports: 호스트와 컨테이너 간의 포트 매핑을 설정합니다.

  • 5044:5044: Logstash가 Beats 입력을 수신하는 포트.
  • 50001:50000/tcp: Logstash가 TCP 입력을 수신하는 포트.
  • 50001:50000/udp: Logstash가 UDP 입력을 수신하는 포트.
  • 9600:9600: Logstash 모니터링 API에 접근하기 위한 포트.

environment: 환경 변수를 설정

  • LS_JAVA_OPTS: JVM 메모리 옵션을 설정.
  • LOGSTASH_INTERNAL_PASSWORD: Elasticsearch에 연결할 때 사용될 비밀번호를 설정.

 

depends_on: Logstash가 Elasticsearch가 시작된 후에 실행되도록 의존성을 설정

networks: prod 네트워크에 연결

 

😎 Kibana

kibana:
  build:
    context: ./elastic/kibana/
    args:
      ELASTIC_VERSION: ${ELASTIC_VERSION}
  image: kibana:8.14.3
  container_name: kibana
  volumes:
    - ./elastic/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml:ro,Z
  ports:
    - 5601:5601
  environment:
    KIBANA_SYSTEM_PASSWORD: ${KIBANA_SYSTEM_PASSWORD:-}
  networks:
    - prod
  depends_on:
    - elasticsearch
  • build: context 경로에서 Docker 이미지. ELASTIC_VERSION은 빌드 중에 사용
  • image: 이미지를 직접 지정. 여기서는 logstash:8.14.3을 사용
  • container_name: 컨테이너의 이름을 logstash로 지정
  • volumes: 호스트의 파일 시스템 경로를 컨테이너 내부 경로와 매핑합니다.
    • kibana.yml: Kibana 설정 파일을 매핑.
  • ports: 호스트와 컨테이너 간의 포트 매핑을 설정합니다.
    • 5601:5601: Kibana 웹 인터페이스에 접근하기 위한 포트.
  • environment: 환경 변수를 설정합니다.
    • KIBANA_SYSTEM_PASSWORD: Elasticsearch에 연결할 때 사용될 비밀번호를 설정.
  • depends_on: Kibana가 Elasticsearch가 시작된 후에 실행되도록 의존성을 설정합니다.
  • networks: prod 네트워크에 연결됩니다.

 

😜 환경 변수 

environment:
  ELASTIC_PASSWORD: ${ELASTIC_PASSWORD:-}
  LOGSTASH_INTERNAL_PASSWORD: ${LOGSTASH_INTERNAL_PASSWORD:-}
  KIBANA_SYSTEM_PASSWORD: ${KIBANA_SYSTEM_PASSWORD:-}
  METRICBEAT_INTERNAL_PASSWORD: ${METRICBEAT_INTERNAL_PASSWORD:-}
  FILEBEAT_INTERNAL_PASSWORD: ${FILEBEAT_INTERNAL_PASSWORD:-}
  HEARTBEAT_INTERNAL_PASSWORD: ${HEARTBEAT_INTERNAL_PASSWORD:-}
  MONITORING_INTERNAL_PASSWORD: ${MONITORING_INTERNAL_PASSWORD:-}
  BEATS_SYSTEM_PASSWORD: ${BEATS_SYSTEM_PASSWORD:-}

 

- 여러 환경 변수를 정의해주는 부분이다. 기본적으로 빈 값이 설정. 필요한 경우 외부에서 주입된 값으로 대체 될 수 있다. 

 

😜 네트워크 설정

networks:
  - prod

 

- 각 서비스는 prod 네트워크로 연결될 것이며 이를 통해, Docker-compose 서비스를 서로 통신할 수 있도록 설정하는 가상의 네트워크

 

external: true로 설정되어 있어 외부 Docker에서도 연결 가능 

 

 

 

아래 명령어를 입력하여 실행하면 된다. 한번 실행하면 다시는 실행 할 필요는 없기에 setup 관련 docker-compsoe는 없습니다. 하지만,기본적으로 docker-compose.yml 파일에 제공해주기에 해당 부분을 붙여넣기하여 사용하면 되겠습니다. 

또한. setup을 없애도 정상적으로 잘 동작합니다. 

 

처음 시작은 docker-compose up -d  -> set up 순으로 진행 이후에는 위에 내용처럼 없이 진행하면됩니다. 

여기서 up -d로 되는 이유는 build : context 에서 잡아서 해주기에 굳이 build를 해줄 필요없이 진행하면 된다. 

  • docker-compose up -d
  • docker-compose up setup

한번하면 docker-compose up -d만으로도 정상적으로 실행된다.