본문 바로가기

데이터베이스/ELK

[ELK] GCP환경에서 Docker로 ELK 설치 및 실행하기

현재도 계속 공부중이라서 본인만을 위한 공부용으로 작성중인 글.

본인의 환경에서 설치 및 실행한 것이므로 파일 위치나 이름이 다를수 있습니다.

 

 

1. 설치 및 실행

 

1) 도커 및 도커 컴포즈 설치, 세팅

# 도커 설치
sudo yum install yum-utils device-mapper-persistent-data lvm2 -y
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo -y
sudo yum install docker-ce -y
sudo systemctl start docker
sudo systemctl enable docker

# 도커 컴포즈 설치
sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

# 도커를 sudo 없이 사용
sudo usermod -aG docker ${USER}
# 도커를 sudo 없이 사용하려면, putty 재시작 필수

 

2) 도커를 초기상태로 설정

# 컨테이너 삭제
docker rm -f $(docker ps -qa)

# 이미지 삭제
docker rmi -f $(docker images -qa)

# 안쓰는 네트워크 삭제
docker network prune -f

# 안쓰는 볼륨 삭제
docker volume prune -f

# 도커 프로젝트 삭제
sudo rm -rf /docker/projects
sudo rm -rf /docker_projects

 

3) 디렉토리 생성

# 디렉토리 생성
sudo mkdir -p /docker_projects/elk__1 \
  /docker_projects/elk__1/elasticsearch \
  /docker_projects/elk__1/elasticsearch/config \
  /docker_projects/elk__1/logstash \
  /docker_projects/elk__1/logstash/config \
  /docker_projects/elk__1/logstash/pipeline \
  /docker_projects/elk__1/logstash/drivers \
  /docker_projects/elk__1/kibana \
  /docker_projects/elk__1/kibana/config \
  /docker_projects/elk__1/filebeat/config \
  /docker_projects/elk__1/filebeat/data
  
  # data 파일은 생성하는지 모르겠음.

 

4) docker-compose.yml 파일 생성

# docker-compose.yml 파일 생성
sudo vim /docker_projects/elk__1/docker-compose.yml

# docker-compose.yml 파일 내용
version: '3'

services:
  elasticsearch:
    restart: unless-stopped
    build: ./elasticsearch
    container_name: elasticsearch ## 실제로 컨테이너 이름은 elk__1_elasticsearch 로 생성된다.
    volumes:
      - ./elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro,z
      - ./elasticsearch/config/dict.txt:/usr/share/elasticsearch/config/dict.txt
      - ./elasticsearch/data:/usr/share/elasticsearch/data
    environment:
      - TZ=Asia/Seoul
      - ELASTIC_PASSWORD=elasticpassword
      - node.name=elasticsearch ## 이 이름에 큰 의미 없음, 왜냐하면 싱글노드로 운영할 계획이기 때문에
      - bootstrap.memory_lock=true
      - discovery.type=single-node ## 단일노드모드로 사용하겠다는 뜻, 엘라스틱서치는 실제로는 멀티노드로 많이 사용한다.
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    ports:
      - 9200:9200 ## 엘라스틱 서치의 기본포트는 9200 이다.

  kibana:
    restart: unless-stopped
    build: ./kibana
    container_name: kibana
    environment:
      - TZ=Asia/Seoul
    volumes:
      - ./kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml:ro,z
    ports:
      - "5601:5601" ## 키바나의 기본포트는 5601 이다.
    depends_on:
      - elasticsearch

  logstash:
    restart: unless-stopped
    build: ./logstash
    container_name: logstash
    volumes:
      - ./logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml:ro,z
      - ./logstash/pipeline:/usr/share/logstash/pipeline:ro,z
      - ./logstash/drivers/:/opt/logstash/vendor/jar/jdbc/
    environment:
      - TZ=Asia/Seoul
      - "LS_JAVA_OPTS=-Xmx256m -Xms256m"
    depends_on:
      - elasticsearch
      
  filebeat:
    restart: unless-stopped
    build: ./filebeat
    container_name: filebeat
    volumes:
      - ./filebeat/config/filebeat.yml:/usr/share/filebeat/filebeat.yml:ro,z
      - ./filebeat/data:/usr/share/filebeat/data
      - /var/log:/logs/host/
    depends_on:
      - elasticsearch

 

5) 엘라스틱 환경설정파일 생성 (elasticsearch.yml)

# 엘라스틱 환경설정파일 생성
sudo vim /docker_projects/elk__1/elasticsearch/config/elasticsearch.yml

cluster.name: "docker-cluster"  ## 이 이름에 큰 의미 없음, 왜냐하면 싱글클러스터로 운영할 계획이기 때문에
network.host: 0.0.0.0 ## 외부에서 접근가능

# X-Pack 세팅, 보안설정
## 자세한 내용은 https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-xpack.html

xpack.license.self_generated.type: trial
xpack.security.enabled: true
xpack.monitoring.collection.enabled: true

 

7) 엘라스틱 신조어 사전 등록

# 엘라스틱 신조어 사전 등록 (쇼핑몰 기준임)
sudo vim /docker_projects/elk__1/elasticsearch/config/dict.txt

# 내용
인스타여신 인스타 여신
인스타
여신
셀럽
아이돌
코트
블라우스
숏스커트 숏 스커트
숏
롱스커트 롱 스커트
스커트
청치마 청 치마
청자켓 청 자켓
백
소녀시대
태왕사신기
드라마
권유리
김세희
유리
니트
완판
레드벨벳 레드 벨벳

 

8) 엘라스틱서치 도커파일 생성

# 엘라스틱서치 도커파일
sudo vim /docker_projects/elk__1/elasticsearch/Dockerfile

FROM elasticsearch:7.16.3
RUN bin/elasticsearch-plugin install --batch analysis-nori ## 한글 형태소 분석기

 

9) 키바나 환경설정파일 생성 (kibana.yml)

# 키바나 환경설정파일 생성
sudo vim /docker_projects/elk__1/kibana/config/kibana.yml

server.name: kibana
server.host: 0.0.0.0
elasticsearch.hosts: ["http://elasticsearch:9200"]
monitoring.ui.container.elasticsearch.enabled: true

## 엘라스틱 아이디와 비번을 키바나에게 알려주기
elasticsearch.username: elastic
elasticsearch.password: elasticpassword

 

10) 키바나 도커파일 생성

# 키바나 도커파일
sudo vim /docker_projects/elk__1/kibana/Dockerfile

FROM kibana:7.16.3

 

11) 로그스태시 환경설정파일 생성 (logstash.yml)

# 로그스태시 환경설정파일 생성
sudo vim /docker_projects/elk__1/logstash/config/logstash.yml

# logstash.yml
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: ["http://elasticsearch:9200"]

## 엘라스틱 아이디와 비번을 로그스태시에게 알려주기
xpack.monitoring.enabled: true
xpack.monitoring.elasticsearch.username: elastic
xpack.monitoring.elasticsearch.password: elasticpassword

## conf 변경시 재시작안해도 반영됨
config.reload.automatic: true

 

12) 로그스태시 도커파일 생성

# 로그스태시 도커파일 생성
sudo vim /docker_projects/elk__1/logstash/Dockerfile

FROM logstash:7.16.3

 

13) 로그스태시랑 연동할 DB 생성 

# matiadb
docker run \
  --name mariadb__1 \
  -d \
  --restart unless-stopped \
  -e MARIADB_ROOT_PASSWORD=1234 \
  -e TZ=Asia/Seoul \
  -p 3306:3306 \
  -v /docker_projects/mariadb__1/conf.d:/etc/mysql/conf.d \
  -v /docker_projects/mariadb__1/mysql:/var/lib/mysql \
  -v /docker_projects/mariadb__1/run/mysqld:/run/mysqld/ \
  mariadb:latest
  
# mariadb__1 컨테이너 안에서 ls 명령을 실행
docker exec mariadb__1 ls

# mariadb__1 컨테이너 안에서 mysql -u root -p 명령을 실행
# 복잡한 명령언 -it 옵션을 붙어야 한다.
docker exec -it mariadb__1 mysql -u root -p


# postgresql
docker run --name postgres__1 -d --restart unless-stopped \
  -p 5432:5432 -e POSTGRES_PASSWORD=1234 \
  -v ${PWD}/data:/var/lib/postgresql/data postgres:latest
  
docker run -p 5432:5432 --name postgres -e POSTGRES_PASSWORD=password -d postgres

 

14) 로그스태시 환경설정파일 (DB와의 연동) 생성

# 로그스태시 환경설정파일(DB와의 연동) 생성
sudo vim /docker_projects/elk__1/logstash/pipeline/logstash.conf

# logstash.conf => postgresql version
input {
    jdbc {
        jdbc_driver_library => "/opt/logstash/vendor/jar/jdbc/postgresql-42.3.5.jar"
        jdbc_driver_class => "org.postgresql.Driver"
        jdbc_connection_string => "jdbc:postgresql://172.17.0.1:5432/post"
        jdbc_validate_connection => true
        jdbc_user => "postgres"
        jdbc_password => "password"
        jdbc_validate_connection => true
        last_run_metadata_path => "/usr/share/logstash/.logstash_jdbc_last_run_1"
        schedule => "* * * * *"
        statement => "SELECT * from article"
        type => "elk_test"
    }
}
output {
    elasticsearch {
        hosts => [ "elasticsearch:9200" ]
        user => "elastic"
        password => "elasticpassword"
        index => "elk"
        document_id => "%{id}"
    }
}
    
 # mariaadb version
 input {
  jdbc {
    jdbc_driver_library => "/opt/logstash/vendor/jar/jdbc/mysql-connector-java-5.1.48.jar"
    jdbc_driver_class => "com.mysql.jdbc.Driver"
    jdbc_connection_string => "jdbc:mysql://34.64.142.109:3306/elk"
    jdbc_user => "dltmdals1620"
    jdbc_password => "1234"
    jdbc_paging_enabled => true
    tracking_column => "unix_ts_in_secs_1"
    use_column_value => true
    tracking_column_type => "numeric"
    last_run_metadata_path => "/usr/share/logstash/.logstash_jdbc_last_run_1"
    schedule => "* * * * *"
    jdbc_validate_connection => true
    statement => "SELECT P.*, UNIX_TIMESTAMP(P.update_date) AS unix_ts_in_secs_1 FROM products_product AS P WHERE P.update_date > FROM_UNIXTIME(:sql_last_value) ORDER BY P.update_date ASC"
    type => "elk___products_product_type_1___v1"
  }
  
output {
    elasticsearch {
      hosts => "elasticsearch:9200"
      user => "elastic"
      password => "elasticpassword"
      index => "elk___products_product_type_1___v1"
      document_id => "%{id}"
    }
  }

 

15) jdbc_driver 다운로드

# mariadb
# mysql-connector-java 파일 다운로드
sudo wget https://github.com/audgks5551/elk_2021_12_27/raw/master/drivers/mysql-connector-java-5.1.48.jar -O /docker_projects/elk__1/logstash/drivers/mysql-connector-java-5.1.48.jar

# postgresql
sudo wget https://github.com/SMin1620/jdbc_driver/blob/main/postgresql-42.2.12.jar -O /docker_projects/elk__1/logstash/drivers/postgresql-42.2.12.jar

# postgresql other version
sudo wget https://github.com/SMin1620/jdbc_driver/blob/main/postgresql-42.2.24.jar -O /docker_projects/elk__1/logstash/drivers/postgresql-42.2.24.jar

sudo wget https://github.com/SMin1620/jdbc_driver/blob/main/postgresql-9.4.1208.jre7.jar /docker_projects/elk__1/logstash/drivers/postgresql-9.4.1208.jre7.jar

 

16) 비츠 도커파일 생성

FROM docker.elastic.co/beats/filebeat:7.16.3

 

17) filebeat.yml 파일 생성

sudo vim /docker_projects/elk__1/filebeat/config/filebeat.yml

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /logs/host/messages*
  setup.kibana:
    host: "34.64.223.224:5601"
    protocol: "http"
setup.dashboards.enabled: true
output.elasticsearch:
  hosts: ["http://elasticsearch:9200"]
  username: "elastic"
  password: "elasticpassword"