Docker Compose & ELK

홍현기·2025년 4월 8일

1. Docker & Docker Compose 설치 (macOS 기준)

Docker Desktop 설치 (Compose 포함)

brew install --cask docker
  • 설치 후 Docker 앱 실행 → 상태바에 고래 아이콘(🐳) 떠야 정상
  • 최신 버전은 docker compose 명령이 내장되어 있음 (docker-compose는 구버전)

설치 확인

docker --version
docker compose version

2. ELK Stack 소개

구성 요소역할 설명
Elasticsearch로그 저장, 검색, 색인 처리
Logstash로그 수집, 파싱, 전처리
Kibana로그 데이터 시각화 UI, 분석 대시보드

3. 프로젝트 디렉토리 구성

mkdir elk-study && cd elk-study
touch docker-compose.yml
touch logstash.conf

4. docker-compose.yml 설정

# ELK Stack 구성: Elasticsearch + Logstash + Kibana

services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.17.10
    container_name: elasticsearch
    environment:
      - discovery.type=single-node
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    ports:
      - "9200:9200"
    volumes:
      - esdata:/usr/share/elasticsearch/data

  logstash:
    image: docker.elastic.co/logstash/logstash:7.17.10
    container_name: logstash
    volumes:
      - ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf
    ports:
      - "5001:5000"  # 포트 충돌 방지를 위해 호스트 포트를 5001로 설정

  kibana:
    image: docker.elastic.co/kibana/kibana:7.17.10
    container_name: kibana
    ports:
      - "5601:5601"
    environment:
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200

volumes:
  esdata:

version: 항목은 Docker Compose v2 기준으로 생략 권장


5. logstash.conf 설정

input {
  tcp {
    port => 5000  # TCP 5000번 포트에서 로그를 수신
  }
}

filter {
  grok {
    match => {
      "message" => "%{COMBINEDAPACHELOG}"  # Apache의 combined 로그 포맷에 맞춰 파싱
    }
  }

  date {
    match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
    target => "@timestamp"  # Elasticsearch용 타임스탬프 필드 지정
  }
}

output {
  elasticsearch {
    hosts => ["http://elasticsearch:9200"]
    index => "apache-logs"  # 저장될 인덱스 이름
  }

  stdout { codec => rubydebug }  # 콘솔 출력 (디버깅용)
}

6. ELK Stack 실행

docker compose up -d

7. 테스트 로그 전송 (호스트 포트 5001 기준)

echo '127.0.0.1 - - [08/Apr/2025:14:32:00 +0000] "GET /index.html HTTP/1.1" 200 2326' | nc localhost 5001

8. Elasticsearch 인덱스 확인

curl http://localhost:9200/_cat/indices?v

apache-logs 인덱스가 생성되어 있어야 함


9. Kibana 접속 및 Index Pattern 등록

접속

Index Pattern 등록

  1. 좌측 메뉴 → "Stack Management > Index Patterns"
  2. "Create index pattern" 클릭
  3. 입력: apache-logs*
  4. Time field 선택: @timestamp
  5. Discover 탭에서 로그 확인

에러/경고 해결 요약

문제해결 방법
version is obsoleteversion: 항목 삭제
bind: address already in use (port 5000)포트 변경 (5001:5000) 또는 해당 포트 사용 중인 프로세스 종료
docker compose: unknown commandDocker Desktop 실행 또는 Compose 플러그인 수동 설치
로그가 안 들어옴logstash.conf 설정 확인 + 로그 포맷 점검 + docker compose logs -f logstash 로 디버깅

다음 확장 가능성

아이디어설명
Spring Boot 로그 연동Filebeat 또는 파일 input으로 Spring 로그 수집
Nginx 로그 수집Nginx access.log를 Logstash로 전송
에러 알림 연동특정 로그 발생 시 Slack, Email 등 알림
Kibana 대시보드IP별 요청 수, 상태코드 비율 등 시각화
머신러닝 연동로그 기반 이상 징후 탐지 및 자동 알림

0개의 댓글