[Docker] Grafana, Prometheus를 활용한 API서버(Express) 모니터링
이전에 Grafana, Prometheus를 활용한 API서버(Express) 모니터링을 해보았습니다.
이번엔 Cloud에 올려 배포하기 위해 Docker를 활용해서 배포하는 방법과 설정을 알아봅시다.
이전 글 참고 링크
2024.01.10 - [분류 전체보기] - [Mac] Express API서버 모니터링 구축 (feat. Prometheus, Grafana)
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
'IT' 카테고리의 다른 글
[Grafana Express] Grafana의 Express(node.js)를 위한 Metrics (0) | 2024.01.29 |
---|---|
[Mac] 터미널에서 Putty처럼 사용하기 (0) | 2023.09.27 |
[Mac] Homebrew 설치 (0) | 2023.09.27 |
[Express Node] api 서버에 api key 도입하기 (0) | 2023.08.10 |