개발일기
docker-compose ELK 설치 본문
우선 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만으로도 정상적으로 실행된다.
'취준생 프로젝트' 카테고리의 다른 글
1부 itzip 프로젝트 이력서에 테스트 코드 TDD 적용기 (3) | 2024.11.27 |
---|---|
ElasticSearch을 사용한 학교 정보 검색어 자동완성 (2) | 2024.08.28 |
WebClient를 사용한 커리어넷 학교 정보 API가져오기 (0) | 2024.08.08 |
Sping boot AWS bucket 업로드, 수정 , 삭제하기 (4) | 2024.07.23 |
SpringBoot AWS 설정하는 방법 (0) | 2024.07.16 |