๐Ÿ’พ.knwldg

docker-ELK, Filebeat, ๊ทธ๋ฆฌ๊ณ  docker compose - #2

Morgenmuffel 2021. 7. 26. 02:04

์•„๋ž˜ ๊ธ€์— ์ด์–ด์ง€๋Š” ๊ธ€์ž…๋‹ˆ๋‹ค๐Ÿณ

 

docker-ELK, Filebeat, ๊ทธ๋ฆฌ๊ณ  docker compose - #1

์˜ค๋Š˜๋„ ์ƒˆ๋กœ์šด ๊ฑธ ๊ฑด๋“œ๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ์นœ๊ตฌ๋“ค๊ณผ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ๋Š” ํ”„๋กœ์ ํŠธ์—์„œ ๋‚œ์ƒ ์ฒ˜์Œ ELK ์Šคํƒ๊ณผ docker๋ฅผ ์จ๋ณด๊ฒŒ ์ƒ๊ฒผ๋„ค์š”๐Ÿณ๐Ÿณ ์›Œ๋‚™ ์ด๊ฒƒ์ €๊ฒƒ ๋งŽ์ด ๊ธ์–ด๋ชจ์œผ๋ฉด์„œ ์ง„ํ–‰ํ•˜๋Š” ์ค‘์ด๋ผ

morgenmuffel.tistory.com

 

์˜ค๋Š˜์€ Filebeat๋ฅผ log ํŒŒ์ผ์— ์—ฐ๊ฒฐํ•˜๊ณ , ์ฝ์–ด์˜จ ๊ฐ’์„ Logstash๋กœ ๋ณด๋‚ด๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ๊นŒ์ง€ ํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค!

์ผ๋‹จ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ์–ด์ œ ์ƒˆ๋ฒฝ๊นŒ์ง€ log ๊ด€๋ จ ์ž‘์—…ํ•˜๋ฉด์„œ ํ‘ธ๋…ํ–ˆ๋˜ ๋‚ด์šฉ์„

ํŒŒ์ด์ฌ ์ „๋ฌธ๊ฐ€ ์นœ๊ตฌ๊ฐ€ ์•„์นจ์— ์ผ์–ด๋‚˜์„œ ์ฝ๊ณ  ์ฝ”๋ฉ˜ํŠธ๋ฅผ ์คฌ๋Š”๋ฐ

- logger๊ฐ€ ์›น ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์ž˜ ๋งŒ๋“ค์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— file writer ๋Œ€์‹  logger๋ฅผ ์“ฐ๋Š”๊ฒŒ ์ข‹๋‹ค

- ํŒŒ์ด์ฌ logging์ด ์›๋ž˜ ๋ณต์žกํ•ด์„œ ์‹ฌ์ง€์–ด ์ฑ…๋„ ์žˆ๋Š” ์ˆ˜์ค€์ด๋‹ค

- ํŒŒ์ด์ฌ์€ ์–ด๋–ค ๋†ˆ์ด ์‹คํ–‰์‹œํ‚ค๋Š”์ง€์— ๋”ฐ๋ผ ๋ฉ”์ธ ์—”ํŠธ๋ฆฌ๊ฐ€ ๋ฐ”๋€๋‹ค(__name__ ๊ด€๋ จ)

- werkzeug๋Š” Flask ๋‚ด๋ถ€์— ์žˆ๋Š” ์•„์ด๋ผ์„œ ๊ฒ€์ƒ‰ํ•  ๋•Œ ํŒŒ์ด์ฌ logging ๋ง๊ณ  Flask logging์œผ๋กœ ๊ฒ€์ƒ‰ํ•ด์•ผ ํ–ˆ์„ ๊ฒƒ์ด๋‹ค

๋“ฑ๋“ฑ.... ํ•˜ํ•„ ์ด ์นœ๊ตฌ๊ฐ€ ๊ทธ ๋‚  ์ƒˆ๋ฒฝ 3์‹œ๋ฐ˜์— ์ž ๋“ค์—ˆ๋Œ€์„œใ… ใ… 

๊ทธ๋ž˜๋„ ์“ธ๋ชจ์žˆ๋Š” ๋‚œ๋ฆฌ๋ฅผ ์นœ ๊ฒƒ ๊ฐ™์•„์„œ ๋‚˜๋ฆ„ ๋งŒ์กฑ์Šค๋Ÿฌ์› ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ํด๋” ๊ตฌ์กฐ ๊ด€๋ จํ•ด์„œ ๋‹ค ์„œ๋ฒ„์ธ๋ฐ ๊ตณ์ด -server๋ฅผ ๋ถ™์ด์ง€ ์•Š์•„๋„ ๋  ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ฝ”๋ฉ˜ํŠธ์™€

docker ํŒŒ์ผ๋“ค์€ docker/ ํด๋”์— ๋‹ค ๋ชจ์•„๋‘๋ฉด ์ข‹๊ฒ ๋‹ค๋Š” ์–˜๊ธฐ๊ฐ€ ์žˆ์–ด์„œ ํด๋” ๊ตฌ์กฐ๋ฅผ ์ˆ˜์ •ํ–ˆ๊ตฌ์š”.

์ด๊ฑด ์ด๋ฒˆ์— ์ ์šฉํ•  ๋‚ด์šฉ์€ ์•„๋‹ˆ์ง€๋งŒ

 

Docker Hub

 

hub.docker.com

์ด ์นœ๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Dockerfile์„ ๊ตณ์ด ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ํŒŒ์ด์ฌ์œผ๋กœ ์„œ๋ฒ„๋ฅผ ๋„์šธ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•˜๋„ค์š”.

์ด๊ฑด ๋‚˜์ค‘์— ์“ธ ์ผ์ด ์žˆ์„๊นŒ ์‹ถ์–ด ์˜ฌ๋ ค๋‘ก๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ง€๋‚œ๋ฒˆ์— ๋ณด์…จ๋‹ค์‹œํ”ผ ์›Œ๋‚™ ์ค‘๊ฐ„์ค‘๊ฐ„ ์‚ฝ์งˆ์ด ๋งŽ์•„์„œ

์ง€๋‚œ๋ฒˆ์—๋Š” ์ž‘์—…ํ•œ ์ˆœ์„œ๋Œ€๋กœ ์ญ‰ ์ ์—ˆ๋Š”๋ฐ ๊ทธ๋Ÿฌ๊ธฐ์—” ๊ณ ์นœ ๋‚ด์šฉ์ด ๋„ˆ๋ฌด ๋งŽ์•„ ์ด์ œ๋ถ€ํ„ฐ๋Š” ์„ฑ๊ณตํ•œ ๋‚ด์šฉ๋งŒ ์ ์œผ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค!

์ œ๊ฐ€ ๊ณ ์ƒํ•œ๊ฑธ ๋‹ค๊ฐ™์ด ๋ณผ ํ•„์š”๋Š” ์—†์œผ๋‹ˆ๊นŒ์š”๐Ÿคฃ

 

3. Filebeat ์„ค์ •

์›Œ๋‚™ ๋˜‘๋˜‘ํ•œ ๋งŽ์€ ๋ถ„๋“ค์ด Filebeat ์„ค์ •์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด์ฃผ์…”์„œ ์ฐธ๊ณ ํ•œ ๊ธ€์ด ๋งŽ๋„ค์š”!

์ผ๋‹จ Filebeat ์„ค์ • ๊ด€๋ จ๋œ ๋‚ด์šฉ๋„ ์ œ๊ฐ€ ์ž‘์—…ํ•˜๊ณ  ์žˆ๋Š” ํด๋”์—์„œ ์ง„ํ–‰ํ•˜๋Š”๊ฒŒ ๋งž๋Š” ๊ฒƒ ๊ฐ™์•„์„œ

๊ธฐ์กด ํด๋”๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์ˆ˜์ •ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

morgen-muffel
โ”œโ”€docker
โ”‚  โ””โ”€docker-compose-test.yml
โ”œโ”€test
โ”‚  โ””โ”€... (๊ธฐ์กด๊ณผ ๋™์ผ)
โ”œโ”€log
โ”‚  โ”œโ”€elasticsearch/
โ”‚  โ”œโ”€kibana/
โ”‚  โ”œโ”€logstash/
โ”‚  โ”œโ”€filebeat
โ”‚    โ””โ”€config
โ”‚      โ””โ”€filebeat-test.yml
โ”‚    โ”œโ”€test.Dockerfile
โ”‚  โ””โ”€docker-compose.yml

์ผ๋‹จ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์œผ๋กœ test.Dockerfile์„ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ฐธ๊ณ ํ•œ ๋‚ด์šฉ์€ ์ด๊ฑฐ๊ตฌ์š”.

 

Run Filebeat on Docker | Filebeat Reference [7.13] | Elastic

Run Filebeat on Dockeredit Docker images for Filebeat are available from the Elastic Docker registry. The base image is centos:7. A list of all published Docker images and tags is available at www.docker.elastic.co. These images are free to use under the E

www.elastic.co

FROM docker.elastic.co/beats/filebeat:7.13.4
COPY /config/filebeat-test.yml /usr/share/filebeat/filebeat.yml
USER root
RUN chown root:filebeat /usr/share/filebeat/filebeat.yml
USER filebeat

USER ๊ถŒํ•œ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ํ•„์š”ํ•œ์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ ์ผ๋‹จ ๋„ฃ์–ด๋‘์—ˆ์Šต๋‹ˆ๋‹ค. ํ•„์š”์—†์œผ๋ฉด ๋‚˜์ค‘์— ๋นผ์•ผ์ฃ  ๋ญ ใ…Žใ…Ž

 

๊ทธ๋ฆฌ๊ณ  filebeat-test.yml ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„œ

 

Configure Filebeat | Filebeat Reference [7.13] | Elastic

See the Config File Format for more about the structure of the config file.

www.elastic.co

์ด ๋‚ด์šฉ์„ ์ฐธ๊ณ ํ•ด ์—ฌ๊ธฐ์„œ input๊ณผ ouput๋งŒ ์ ์–ด์ฃผ๋Š” ์‹์œผ๋กœ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

input์—๋Š” test-server๊ฐ€ ๋กœ๊ทธ๋ฅผ ๋–จ๊ถˆ์ฃผ๋Š” ์œ„์น˜๋ฅผ ์ ์œผ๋ฉด ๋˜๋Š”๋ฐ, ์•„๋ž˜ docker compose์—์„œ ์ ์€ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณผ๋ฅจ์„ ๊ณต์œ ํ•˜๊ฒŒ๋” ํ•ด์ค€ ๋’ค ๊ทธ ์œ„์น˜๋ฅผ ์ง€์ •ํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

output์€ docker-elk ๋‚ด์šฉ๋ฌผ์„ ๋ณด๋‹ˆ 5044 ํฌํŠธ๋กœ ๋ฐ›๊ณ  ์žˆ์–ด์„œ ์ด๋ฅผ ์ฐธ๊ณ ํ•ด ์ž‘์„ฑํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

# ============================== Filebeat inputs ===============================

filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /usr/share/filebeat/test_logs/test.log

# ================================== Outputs ===================================

# ------------------------------ Logstash Output -------------------------------

output.logstash:
  hosts: ["logstash:5044"]

์—ฌ๊ธฐ์„œ logstash์— 127.0.0.1:5044 ์ฒ˜๋Ÿผ ์ ์–ด์ฃผ์ง€ ์•Š์€ ์ด์œ ๋Š” ๊ทธ๋ ‡๊ฒŒ ํ•ด์„œ ์ œ๋Œ€๋กœ ๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค..

์ด์œ ๋Š” ๋ชจ๋ฅด๊ฒ ๋Š”๋ฐ ๊ณ„์† tcp connection refused๊ฐ€ ๋– ์„œ

์•„๋ž˜ docker compose ์ฒ˜๋Ÿผ elk docker compose์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” network์— ๋ถ™๋Š” ์‹์œผ๋กœ ์„ธํŒ…ํ–ˆ๊ณ ,

๊ทธ๋ž˜์„œ logstash:5044๋กœ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

์œˆ๋„์šฐ์—์„œ WSL2๋กœ ๋„์ปค๋ฅผ ๋„์›Œ์„œ ๊ทธ๋Ÿฐ๊ฑด์ง€... ์ฐ์ฐํ•˜์ง€๋งŒ ์ผ๋‹จ์€ ํ…Œ์ŠคํŠธ์šฉ์ด๋‹ˆ๊นŒ ๋„˜์–ด๊ฐ”์Šต๋‹ˆ๋‹ค.

 

4. docker compose ์ˆ˜์ •

์ผ๋‹จ์€ ์ง€๋‚œ๋ฒˆ์— ์ž‘์„ฑํ•œ docker compose ํŒŒ์ผ์„ ์ˆ˜์ •ํ•ด์ฃผ๋„๋ก ํ•ฉ์‹œ๋‹ค.

์ง€๊ธˆ์€ flask๋ฅผ ๋„์šฐ๋Š” ๊ฒƒ๋งŒ ๋˜์–ด์žˆ๋Š”๋ฐ, ์—ฌ๊ธฐ์— Filebeat๋„ ๋„์šด๋‹ค๊ณ  ์ ์–ด์ค˜์•ผ ํ•˜๊ฒ ์ฃ .

๊ทธ๋ฆฌ๊ณ  ๋ฐ”๋€ ํด๋” ๊ตฌ์กฐ๋ฅผ ์ฐธ๊ณ ํ•ด์„œ ๋นŒ๋“œ ๊ฒฝ๋กœ ๋“ฑ๋„ ์ˆ˜์ •ํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ด€๋ จ๋œ ๋‚ด์šฉ์€ ์•„๋ž˜ ๋‚ด์šฉ๊ณผ ์ง€์ธ์˜ ์กฐ์–ธ์„ ์ฐธ๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

Compose file version 3 reference

 

docs.docker.com

version: "3.9"
services:
  web:
    build: ../test
    ports:
      - "8000:8000"
    volumes:
      - test_log:/code/logs
  filebeat:
    build:
     context: ../log/filebeat/
     dockerfile: test.Dockerfile
    container_name: testfilebeat
    volumes:
      - test_log:/usr/share/filebeat/test_logs
    networks:
      - log_elk
volumes:
  test_log:
networks:
  log_elk:
    external: true

์ € volumes ๋ถ€๋ถ„์ด ์ƒ๋‹นํžˆ ํ—ท๊ฐˆ๋ ธ๋Š”๋ฐ

๋‘ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” volume์„ ์ƒ์„ฑํ•˜๊ณ , ๊ฐ ์ปจํ…Œ์ด๋„ˆ์˜ ๋‚ด๋ถ€ ํด๋”์— mount ํ•ด์ฃผ๋Š” ํ˜•์‹์œผ๋กœ ์ดํ•ดํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ฐ ์ปจํ…Œ์ด๋„ˆ์— "app-volume:location_in_the_container" ๊ฐ™์€ ์‹์œผ๋กœ ์ ์–ด์ฃผ๋Š” ๊ฒƒ์ด๊ตฌ์š”.

ํฌํŠธ๋Š” 5000 ํฌํŠธ๊ฐ€ docker-elk์—์„œ ์ ์œ ํ•˜๊ณ  ์žˆ์–ด์„œ 8000์œผ๋กœ ๋ฐ”๊ฟ”์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด์™€ ๊ด€๋ จํ•ด์„œ Flask์˜ Dockerfile๋„ ์•„๋ž˜์™€ ๊ฐ™์ด ์ˆ˜์ •ํ•ด ์ฃผ์—ˆ๋Š”๋ฐ

FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 8000
COPY . .
CMD ["flask", "run", "--port=8000"]

์•„์ง EXPOSE์™€ CMD์—์„œ ๋„˜๊ฒจ์ฃผ๋Š” --port parameter์™€ docker compose์˜ ports๋ž‘ ์–ด๋–ป๊ฒŒ ์—ฐ๊ด€๋˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ๊ตฐ์š”...

์ด๊ฑด ์ฐจ์ฐจ ์•Œ์•„๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค....

๋งˆ์ง€๋ง‰์— ์žˆ๋Š” networks๊ฐ€ 3๋ฒˆ์—์„œ ์–ธ๊ธ‰ํ•œ ๋‚ด์šฉ์ด๊ตฌ์š”.

์ƒˆ๋กœ ๋งŒ๋“œ๋Š”๊ฒŒ ์•„๋‹ˆ๋‹ˆ๊นŒ external: true๋กœ ํ•ด์ค๋‹ˆ๋‹ค.

 

์ด๋ ‡๊ฒŒ ํ•˜๊ณ ๋‚˜๋ฉด kibana์—์„œ ๋กœ๊ทธ๊ฐ€ ๋ณด์ž…๋‹ˆ๋‹ค!

๋Œ€์‹  ์ง€๋‚œ๋ฒˆ์— ๋„ˆ๋ฌด ์‹ ๋‚˜๊ฒŒ formattingํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋กœ๊ทธ๊ฐ€ ํ•œ์ค„ ํ•œ์ค„ ์ชผ๊ฐœ์ ธ์„œ ๋ณด์ž…๋‹ˆ๋‹ค

์ง€๊ธˆ ๋„ˆ๋ฌด ์ง€์ณ์„œ ์ปจํ…Œ์ด๋„ˆ ๋ณผ๋ฅจ ์ด๋ฏธ์ง€ ๋‹ค ์‚ญ์ œํ•œ ์ƒํƒœ๋ผ์„œ

๋‹ค์Œ ๊ธ€์—์„œ kibana์—์„œ ์กฐํšŒํ•˜๋Š” ๋‚ด์šฉ์„ ๋‹ค๋ฃฐ๊ฒŒ์š”!