본문 바로가기
IT

[Docker] Grafana, Prometheus를 활용한 API서버(Express) 모니터링

by js_world_blog 2024. 1. 29.
반응형

[Docker] Grafana, Prometheus를 활용한 API서버(Express) 모니터링

 

 

이전에 Grafana, Prometheus를 활용한 API서버(Express) 모니터링을 해보았습니다.

이번엔 Cloud에 올려 배포하기 위해 Docker를 활용해서 배포하는 방법과 설정을 알아봅시다.

 

이전 글 참고 링크

2024.01.10 - [분류 전체보기] - [Mac] Express API서버 모니터링 구축 (feat. Prometheus, Grafana)

 

[Mac] Express API서버 모니터링 구축 (feat. Prometheus, Grafana)

[Mac] Express API서버 모니터링 구축 (feat. Prometheus, Grafana) 개념을 간략히 설명하자면, api서버에서 Metric을 추출 하게 하고, 그것을 Prometheus로 시각화하여 Grafana에 필요한 요소들을 대시보드에 모아

johnnyseo.tistory.com

 

 

 

 

1. 개념 요약

 

개념요약

 

이전 글 처럼 서비스를 하나하나 배포하려면 시간도 많이 들고 복잡합니다.

실제로 배포를 하고 운영 할 때에는 docker 컨테이너로 관리해서 노력과 시간을 줄이게 되죠.

프로메테우스로 메트릭을 수집하고, 그라파나로 시각화하며, Express API 서버 배포까지 포함하여 도커로 배포하는 과정을 알아봅시다.

 

2. docker script 작성

 

우선 제가 작성한 docker-compose.yml 은 아래와 같습니다.

version: "3"

services:
  # Prometheus 서비스
  prometheus:
    image: prom/prometheus
    container_name: [Prometheus 서비스명]
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
    command:
      - "--config.file=/etc/prometheus/prometheus.yml"
      - "--web.enable-lifecycle"
    restart: always

  # Grafana 서비스
  grafana:
    image: grafana/grafana:10.0.0
    container_name: [Grafana 서비스명]
    ports:
      - "3001:3001"
    volumes:
      - ./grafana/defaults.ini:/etc/grafana/grafana.ini
    environment:
      - GF_SERVER_ROOT_URL=http://localhost:3001
      - GF_SECURITY_ADMIN_USER=admin
      - GF_SECURITY_ADMIN_PASSWORD=[패스워드]
      - GF_USERS_ALLOW_SIGN_UP=false
    depends_on:
      - prometheus
    restart: always

  # Express API server
   [Express API 서버 서비스명]:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: [Express API 서버 컨테이너명]
    volumes:
      - .:/usr/src/app
      - /home/imgs:/home/imgs
    working_dir: /usr/src/app
    environment:
      - TZ=Asia/Seoul
      - API_KEY=[API KEY설정]
    ports:
      - "3000:3000"
    labels:
      - "prometheus.io/scrape=true"
      - "prometheus.io/port=3000"
    command: node server.js

 

 

이 도커 컴포즈 설정은 프로메테우스로 모니터링하고, 그라파나로 시각화하며, Express API 서버를 포함한 세 가지 서비스로 구성됩니다. 이제 서비스를 하나하나 훑어보겠습니다.

 

* 프로메테우스 (Prometheus)

  • image: prom/prometheus
    프로메테우스 공식 이미지를 활용했습니다.  
  • container_name: [프로메테우스 서비스명] 
    도커에서 관리할 컨테이너 이름 입니다.
  • ports: 9090: 9090
    도커 내부의 포트와 외부의 포트를 의미합니다. (내부:외부)
    외부에서 접근하려면 외부에 해당하는 포트를 따로 설정해야 합니다.
  • volumes: - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
    로컬 디렉토리에서 마운트 된 프로메테우스 (로컬:컨테이너)
    즉, 로컬의 prometheus/prometheus.yml 이 컨테이너 내부에서 /etc/prometheus/promethus.yml 설정으로 마운트 되어 설정파일로 사용됩니다.
  • command:
    - "--config.file=/etc/prometheus/prometheus.yml"
      volumes에서 마운트 한 파일을 config 설정파일로 사용하기 위한 경로 지정 명령입니다.
    - "--web.enable-lifecycle"
     웹 라이프사이클 활성화 설정을 통해 로컬에서 설정파일이 변경되어도 컨테이너에서 자동으로 반영됩니다.
    (정확히는 재시작 없이 reload 합니다.)
  • restart: always
    재시작 정책을 항상 하도록 하여 서비스가 항상 재시작하도록 합니다.

 

* 그라파나 (Grafana)

*위에서 설명한 옵션은 생략합니다.

  • ports: 3001:3001
    그라파나의 기본 포트는 3000을 사용합니다. 저는 API서버를 3000 포트를 이용하기 때문에 그라파나를 3001 포트로 대체하였습니다.
이 부분에 대해서는 도커설정 만으로는 실제로 그라파나가 3001 포트를 사용하지 않아서 별도로 설정파일을 수정하는 작업이 필요했습니다.

 

  • volumes: - ./grafana/defaults.ini:/etc/grafana/grafana.ini
    default.ini 에서 grafana 기본포트를 3000에서 3001로도 변경해서 마운트 하였지만 도커 구동하고 확인해 보면 여전히 3000번 포트를 바라본다. 아직 이유를 찾지 못했다 ㅠㅠ
  • environment:
          - GF_SERVER_ROOT_URL=http://localhost:3001
          - GF_SECURITY_ADMIN_USER=admin
          - GF_SECURITY_ADMIN_PASSWORD=[패스워드]
          - GF_USERS_ALLOW_SIGN_UP=false
     환경 설정파일이다. 그라파나에서는 설정파일 마운트 외에도 environment 속성을 통해 GF_설정 키워드로 설정이 가능하도록 지원한다.
  • depends_on:
          - prometheus
    프로메테우스 서비스에 의존성을 추가해 준다.

 

 

* API서버 (Express API Server)

  • dockerfile: Dockerfile
    현재 디렉토리의 Dockerfile을 사용하여 이미지를 빌드합니다. Dockerfile 코드는 아래를 참고해 주세요.
    보통은 도커파일 내에서 packge.json 을 넘기고 의존성 설치까지 진행하지만, 저는 환경 문제 상 로컬에서 의존성 설치 후 통째로 카피하는 방식으로 작성하였습니다.
  •   environment:
          - TZ=Asia/Seoul
          - API_KEY=[API KEY 설정]
    환경 변수로 한국 시간대로 맞추고,  API 키 설정을 추가했습니다.
  • labels:
          - "prometheus.io/scrape=true"
          - "prometheus.io/port=3000"
    프로메테우스 스크레이핑을 구성하고, 3000번 포트를 사용합니다.
# Dockerfile

FROM node:18
RUN apt-get update \
    && apt-get install -y nano

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

COPY . .

# RUN npm install

EXPOSE 3000


CMD ["node", "server.js"]

 

위 도커파일에서는 npm install을 진행 한 뒤 도커를 구동하도록 하였다. 그래서 저 경로를 통째로 복사해서 Express를 실행하도록 한 도커파일이다. 

그 이유는 도커환경에서 npm install 실행 시 의존성 설치에 필요한 미러서버들 중 일부에 접속이 안 되는 문제가 있었기 때문이다.

클라우드 인스턴스의 설정 권한이 없는 관계로 요청은 했으나 해결이 되지 않아 부득이하게 이런 방식을 채택하게 되었다. 요청은 했으나 해결이 되지 않았다..

인스턴스에서 npm install은 잘 되는데 도커 컨테이너에서만 안 되는 경우는 처음 보는 듯 하다.. (같은 네트워크가 아닌가.. 접속이 안되는 이유가 뭘까? 나중에 이 부분도 알아봐야겠다.)

 

이 글을 보고 실습해 보는 분들을 위한 원래의 도커파일도 첨부한다.

 

# Dockerfile 

FROM node:21
RUN apt-get update \
    && apt-get install -y nano

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

COPY package*.json ./
RUN npm install

COPY . .

EXPOSE 3000


CMD ["node", "server.js"]

 

 

 

 

3. 배포

이제 docker-compose 명령어를 통해 서비스들을 실행한다.

docker compose up -d

 

api서버는 3000번 포트에서, Grafana는 3001번 포트에서 실행이 가능하다.

* api 서버 : http://localhost:3000

* Grafana : http://localhost:3001

 

 

 

다음 글

[Grafana Express] Grafana의 Express(node.js)를 위한 Metrics

 

반응형