มา monitor docker ด้วย grafana กัน

Prawit Tangmanopeanchai
5 min readNov 30, 2024

--

30 November 2024

#บันทึกกันลืม

การจะ monitor docker ด้วย grafana เพื่อจะได้มี dashboard และสามารถแจ้ง alert เวลามีปัญหาขึ้นได้

โดยจะมีขั้นตอนที่ต้องทำอยู่ 4 ขั้นตอน คือ

  1. แก้ไข config ของ docker ให้สามารถดึงค่า metric ออกมาได้
  2. ติดตั้ง และ config node-exporter ให้ไปดึงค่ามาจาก docker metric
  3. ติดตั้ง และ config prometheus ให้ไปดึงค่ามาจาก node exporter
  4. ติดตั้ง และ config grafana ให้ไปอ่านข้อมูลจาก prometheus

ขั้นตอนแรก
ให้ทำการ config docker เพื่อให้คนอื่นสามารถมาดึงข้อมูล metric ออกไปดูได้ โดยให้แก้ไข file “/etc/docker/daemon.json” ตามนี้ (ถ้าไม่มี file นี้ก็ให้สร้างใหม่ได้เลย)

{
"metrics-addr": "0.0.0.0:9323",
"experimental": true
}

เสร็จแล้วให้ทำการ restart docker โดยใช้คำสั่ง

sudo systemctl restart docker

จากนั้นให้ลองทดสอบเรียกข้อมูล metric ของ docker ออกมาดูโดยใช้คำสั่ง

curl localhost:9323/metrics

ถ้าทุกอย่างถูกต้องเราได้จะ output ออกมาประมาณนี้ ซึ่งเป็นข้อมูลที่ตัว node exporter จะมาเรียกใช้อีกที

ขั้นตอนที่สอง
ที่เครื่อง docker host ให้ทำการติดตั้ง และ config node-exporter ให้ไปดึงค่ามาจาก docker metric โดยให้สร้าง file “docker-compose.yml” ตามนี้

services:
node-exporter:
image: prom/node-exporter:latest
container_name: node-exporter
ports:
- "9100:9100"

เสร็จแล้วให้ทำการ start service ของ node-exporter โดยใช้คำสั่ง

docker-compose up -d

หลังจาก node-exporter start ขึ้นมาเรียบร้อยแล้วให้ทดสอบด้วยคำสั่ง

curl localhost:9100/metrics

จะได้ output ออกมาหน้าตาประมาณนี้

ขั้นตอนที่สาม
ขั้นตอนนี้จะทำที่เครื่องที่ทำหน้าที่เป็น prometheus server หากเป็นเครื่องเดียวกันกับ node-exporter ก็ให้แก้ไขที่ file “docker-compose.yml” ตัวเดียวกันได้เลย แต่เพื่อให้สามารถรองรับ docker host ได้หลาย ๆ ตัวในอนาคตเลยแยกเครื่องที่ทำหน้าที่เป็น prometheus ออกมาต่างหาก โดยใน file “docker-compose.yml” ให้ใส่ตามนี้

services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
ports:
- "9090:9090"
command:
- '--config.file=/etc/prometheus/prometheus.yml'

จากนั้นให้สร้าง file “prometheus.yml” โดยให้ใส่ตามนี้

global:
scrape_interval: 15s # ตั้งค่า interval สำหรับการดึง metrics

scrape_configs:
- job_name: "node-exporter"
static_configs:
- targets: ["<ip ของเครื่อง node-exporter>:9100"] # ชี้ไปที่ node-exporter
- job_name: "docker"
static_configs:
- targets: ["<ip ของเครื่อง docker host>:9323"] # Metrics จาก Docker

ทำการ start prometheus ด้วยคำสั่ง

docker-compose up -d

เมื่อ start เสร็จแล้ว ให้ลองเปิด internet browser เข้าไปที่เครื่อง prometheus server ตามด้วย port 9090 จะขึ้นตามภาพนี้

ให้ลองเลือกไปที่ status > Target health

จะเห็นว่า prometheus สามารถคุยกับเครื่อง docker host ได้แล้ว

ขั้นตอนสุดท้าย
ให้ติดตั้ง grafana โดยเราสามารถแยกเครื่องที่ทำหน้าที่เป็น grafana server แยกต่างหากได้ แต่ใน blog นี้เราจะติดตั้ง grafana ไว้ที่เครื่องเดียวกันกับ prometheus server โดยให้ทำการแก้ไข file docker-compose.yml ตามนี้

services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
ports:
- "9090:9090"
command:
- '--config.file=/etc/prometheus/prometheus.yml'

grafana:
image: grafana/grafana:latest
container_name: grafana
ports:
- "3000:3000"
volumes:
- grafana-data:/var/lib/grafana
environment:
- GF_SECURITY_ADMIN_USER=admin # ตั้ง username
- GF_SECURITY_ADMIN_PASSWORD=admin # ตั้ง password

volumes:
grafana-data:

จากนั้นให้ทำการ stop และ start ใหม่โดยให้คำสั่ง

docker-compose down

แล้ว start ใหม่

docker-compose up -d

ก็จะได้ service grafana start ขึ้นมาด้วย

ด้วย config นี้ grafana จะให้บริการอยู่ที่ port “3000” และมี user ชื่อ “admin” password เป็น “admin”

จากนั้นให้เปิด internet browser แล้วเรียกไปที่ grafana server

http://<ip ของ grafana server>:3000"

จะได้หน้า login ของ grafana ขึ้นมา

ให้ใส่ user/password (admin/admin) เข้าไป

เมื่อ login ผ่านแล้ว grafana จะให้เปลี่ยน password ใหม่ ซึ่งถ้าเราไม่เปลี่ยนก็สามารถกดปุ่ม skip เพื่อข้ามไปได้

ถึงตอนนี้ grafana server เราก็พร้อมให้บริการแล้ว

ยัง ๆ ๆ ยังไม่เสร็จ เราต้องการให้ grafana ไปอ่านค่าจาก docker host ของเราโดยเรียกผ่านจากตัว prometheus ดังนั้น ให้เราทำการเพิ่ม data source ที่

Connections > Data sources

กดปุ่ม Add data source

จะเห็นว่าตัว grafana เองรองรับ data source ได้หลายประเภทเลย ตอนนี้ให้เราเลือก prometheus

ตรง Connection ให้เราใส่ url ของเครื่อง prometheus server เข้าไป อย่าลืมใส่ port 9090 ด้วย

เสร็จแล้วให้กดปุ่ม Save & test

ถ้าไม่มีปัญหาเราจะได้ข้อความ Successfully ขึ้นมาตามภาพ

คราวนี้ลองมาดูว่า grafana สามารถอ่านข้อมูลจาก prometheus ได้หรือไม่ โดยให้เลือก menu “Explorer” ในช่อง metric ให้เลือกเป็นค่า “engine_daemon_container_states_containers” แล้วกดปุ่ม Run query (จริง ๆ เมื่อเราเห็น list ในช่อง metric ก็รู้แล้วว่า grafana อ่านค่ามาจาก prometheus ได้แล้ว)

จะได้ output ดังนี้

จะเห็นว่ามีเส้นสีเหลือคือจำนวน container ที่อยู่ในสถานะ “running” มีอยู่ 1 ตัว เพราะที่ docker host เรามี container run อยู่แค่ 1 ตัว

ให้ลองทำการ run container เพิ่มให้มีหลาย ๆ ตัว หลาย ๆ สถานะดู

จากภาพจะเห็นว่าตอนนี้ที่ docker host เรามี container run อยู่ 2 ตัว และมี exited อยู่ 2 ตัว คราวนี้ลองเข้าไปดูจาก grafana อีกครั้ง

จะเห็นว่าตอนนี้ graph เปลี่ยนไปแล้ว โดยเส้นสีเหลือง คือ running อยู่ที่ 2

และสีฟ้า คือ stopped อยู่ที่ 2

ถึงตอนนี้เราก็สามารถ monitor docker ของเราด้วย grafana ได้แล้ว

ตัวอย่าง dashboard

*** เพิ่มเติม ***

มีบาง dashboard ที่เขาทำแจกกัน จะใช้ข้อมูล metric จาก cAdvisor หากว่าเราต้องการก็ให้เพิ่มเข้าไปที่ docker-compose.yml ของเครื่อง docker host ดังนี้

  cadvisor:
image: gcr.io/cadvisor/cadvisor:latest
container_name: cadvisor
ports:
- "8080:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /sys:/sys
- /var/lib/docker:/var/lib/docker

และที่เครื่อง prometheus server ให้แก้ไข file prometheus.yml ดังนี้

  - job_name: "cadvisor"
static_configs:
- targets: ["<ip ของเครื่อง cAdvisor>:8080"]

--

--

Prawit Tangmanopeanchai
Prawit Tangmanopeanchai

Written by Prawit Tangmanopeanchai

Head of Cloud Implementation Unit at gosoft (Thailand)

Responses (1)