이전에 프로메테우스에 대한 설정은 완료했으니, 이제 그라파나에 대한 도커 컴포즈를 작성해봅시다.
이전 게시글을 따라오셨다면, 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 -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
현재 스프링 부트 프로젝트와 모니터링 관련 툴이 같은 도커 컨테이너에서 실행되고 있기 때문에
서버가 죽으면 모니터링 자체를 할 수 없는 역설적인 이슈가 발생합니다.
서버가 죽어도 죽었는지 모니터링을 해야하기 때문입니다.
추후, 모니터링용 인스턴스를 따로 두어 해당 인스턴스에서 모니터링 툴을 실행시키는게 좋을 방법인 것 같습니다.