Home 도커 컴포즈로 그라파나+프로메테우스 실행시키기(2/2)
Post
Cancel

도커 컴포즈로 그라파나+프로메테우스 실행시키기(2/2)

이전에 프로메테우스에 대한 설정은 완료했으니, 이제 그라파나에 대한 도커 컴포즈를 작성해봅시다.

이전 게시글을 따라오셨다면, docker-compose.yml 파일은 아래와 같을 것입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
version: '3.7'

services:
  prometheus: 
  	image: prom/prometheus #도커 이미지 명
  	container_name: prometheus #원하는 컨테이너 명을 입력해줍니다.
  	volumes:
  	  - ~/prometheus/config/:/etc/prometheus/
  	  - ~/prometheus/prometheus-volume:/prometheus
  	ports:
  	  - '9090:9090'
  	command:
  	  - '--web.enable-lifecycle'
  	  - '--config.file=/etc/prometheus/prometheus.yml'
  	restart: always
  	networks:
  	  - monitor-network

이제 services 섹터에 그라파나도 실행시키도록 추가해주어야합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
grafana:
    image: grafana/grafana
    container_name: grafana
    depends_on:
      - prometheus
    ports:
      - "3000:3000"
    volumes:
      - ./grafana/grafana-volume:/var/lib/grafana
      - ./grafana/config/grafana-init.ini:/etc/grafana/grafana.ini
    restart: always
    networks:
      - goodjob-network
        
networks:
  goodjob-network:
    driver: bridge

이 중, 윗부분은 프로메테우스와 같으니 새로운 파트만 설명하면,

  • depends_on: 그라파나가 프로메테우스에 의존한다는 것입니다. 즉 같은 도커 컴포즈 파일에서 관리될 때, 프로메테우스 컨테이너가 먼저 실행되고 그라파나가 실행되도록 합니다.

프로메테우스와 마찬가지로 볼륨을 정해주어야하는데, docker-compose.yml파일이 존재하는 디렉토리 (저는 monitor)에 grafana/config, grafana/grafana-volume 폴더를 각각 생성해줍니다.

그럼 이제 docker-compose.yml이 존재하는 폴더에서 ls 명령어를 실행하면,

docker-compose.yml grafana prometheus 이렇게 세가지 컨텐츠가 나오게 됩니다.

프로메테우스 설정 정보를 정의했던 prometheus.yml처럼, 그라파나의 설정 정보를 정의하기 위해 grafana-init.ini라는 파일을 config 폴더 내에 만들어줍니다.

저는 간단하게 아래와 같이 작성했습니다.

1
2
3
4
5
[server]
http_port = 3000
protocol = http
domain = 인스턴스 IP
root_url = %(protocol)s://%(domain)s:%(http_port)s/

https를 사용하게 되면 SSL 인증에 관련된 작성을 해야한다고 합니다.

이제 그라파나에 관련된 설정도 모두 끝났습니다.

docker-compose.yml

이제 모든 서비스를 실행할 docker-compose.yml 파일은 아래와 같습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
version: "3.7"

services:

  prometheus:
      image: prom/prometheus
      ports:
        - "9090:9090"
      volumes:
        - ./prometheus/config/:/etc/prometheus/
        - ./prometheus/prometheus-volume:/prometheus
      command:
        - '--web.enable-lifecycle'
        - '--config.file=/etc/prometheus/prometheus.yml'
      restart: always
      networks:
        - goodjob-network
  grafana:
    image: grafana/grafana
    container_name: grafana
    depends_on:
      - prometheus
    ports:
      - "3000:3000"
    volumes:
      - ./grafana/grafana-volume:/var/lib/grafana
      - ./grafana/config/grafana-init.ini:/etc/grafana/grafana.ini
    restart: always
    user: "$UID:$GID"
    networks:
      - goodjob-network
        
networks:
  goodjob-network:
    driver: bridge

도커라이징

이제 docker-compose up -d 로 도커 컴포즈 파일로 컨테이너를 실행시켜봅시다.

그리고 docker ps 명령어로 실행중인 컨테이너를 확인했을 때,

docker ps

위와 같이 나온다면 성공한 것입니다. (docker ps -a 를 하면 종료된 컨테이너도 모두 출력됩니다.)

트러블 슈팅

프로메테우스 폴더 이슈

저는 프로메테우스를 실행시킬 때, /data/queries.active를 찾지 못했다는 오류가 발생했습니다.

prometheus.yml파일도 정상적으로 작성되었기 때문에 도커로 실행시키는 중 발생한 이슈인 것 같아서 볼륨을 설정했던 폴더로 들어가보았습니다.

그러나 프로메테우스를 실행시켰음에도 불구하고 볼륨으로 설정했던 /prometheus/prometheus-volume 는 빈 폴더였습니다.

그래서 이는 쓰기 권한이 없기떄문에 도커에서 파일을 생성하지 못하는 것으로 판단해서

1
sudo chown -R 0:0 prometheus/

명령어로 폴더에 대한 소유자를 root 권한으로 설정합니다.

1
sudo chmod -R 777 prometheus/

그리고 디렉토리의 쓰기, 읽기, 실행 권한을 모든 사용자에게 부여합니다.

그 결과 해결되었습니다.

그라파나 실행 파일 이슈

grafana-init.ini 파일 내의 내용을 작성할 때 마주한 이슈입니다.

저는 인스턴스 IP를 직접적으로 사용하지 않고, Nginx 프록시 매니저를 통해 https://www.waveofmymind.shop/ 이라는 경로로 프록시 설정을 해두었습니다.

그러나 protocol을 https로, domain을 www.waveofmymind.shop으로 했지만 그라파나가 실행되지 않았는데요.

protocol을 https로 사용할 경우에는 SSL 보안 문서에 대한 작업을 grafana-init.ini에 설정해야한다는 문제가 있었습니다.

그래서 저는 어차피 프록시 매니저에 의해 그라파나 url을 http://인스턴스IP:3000/로 설정하더라도 https://grafana.waveofmymind.shop/으로 변경해서 접속할 수 있기 때문에

protocol을 http로 변경하고, domain에 인스턴스 IP로 변경했습니다.

그라파나 권한 이슈

그라파나를 도커에서 실행시켰지만, 포트가 정상적으로 연결되지 않았습니다.

그래서 저는 docker logs -f 그라파나ID로 로그를 찍어보았고,

grafana 설정 파일을 찾지 못한다는 이슈가 있었습니다. 그래서 저는 user: “$UID:$GID” 를 그라파나 실행 yml에 추가했습니다.

현재 사용자와 그룹을 참조하는 환경변수를 추가함으로써, 프로세스가 사용자 권한을 가질 수 있도록 하는 것입니다.

TO-BE

현재 스프링 부트 프로젝트와 모니터링 관련 툴이 같은 도커 컨테이너에서 실행되고 있기 때문에

서버가 죽으면 모니터링 자체를 할 수 없는 역설적인 이슈가 발생합니다.

서버가 죽어도 죽었는지 모니터링을 해야하기 때문입니다.

추후, 모니터링용 인스턴스를 따로 두어 해당 인스턴스에서 모니터링 툴을 실행시키는게 좋을 방법인 것 같습니다.

This post is licensed under CC BY 4.0 by the author.

도커 컴포즈로 그라파나+프로메테우스 실행시키기(1/2)

TDD, 클린 코드 with Kotlin - 1주차