閱讀本文需要一定的Linux, Docker與MySQL知識, 例如: 會啟動容器, 進入容器; 會建立表, 會使用INSERT語句, 會使用SELECT語句...
grafana是一個資料視覺化程式, 可通過瀏覽器檢視資料圖表. 本文將以MySQL為資料來源, 介紹如何通過Docker部署grafana與MySQL.
既然grafana需要使用MySQL作為資料來源, 那麼grafana就需要存取MySQL所在的容器. 為了使容器間互通互聯, 這裡我們建立一個名為my-bridge
的橋接網路, grafana和MySQL都部署在my-bridge
上, 兩個容器就可以互聯互通了.
# 建立my-bridge網路
$ docker network create --driver bridge --subnet 172.12.0.0/16 --gateway 172.12.0.1 my-bridge
如果伺服器設定了防火牆, 需要將相應埠開啟. MySQL的預設埠為3306, grafana的預設埠為3000.
使用以下命令, 開放3000和3306埠. Debian系可使用ufw設定防火牆.
$ sudo firewall-cmd --add-port=3000/tcp --permanent
$ sudo firewall-cmd --add-port=3306/tcp --permanent
$ sudo firewall-cmd --reload
$ sudo firewall-cmd --list-all
通過以下命令啟動MySQL, 啟動時, 需要注意以下選項
MYSQL_ROOT_PASSWORD=xxxxxx
中的xxxxxx
為MySQL密碼, 自行修改--network my-bridge
中的my-bridge
為剛剛建立的網路的名稱, 二者必須要一致--name mysql
中的mysql
為容器名字, 後面會用到$ docker run -d \
-p 3306:3306 \
-v $HOME/docker/mysql/conf:/etc/mysql/conf.d \
-v $HOME/docker/mysql/data:/var/lib/mysql \
-e 'MYSQL_ROOT_PASSWORD=xxxxxx' \
--network my-bridge \
-h mysql \
--name mysql \
mysql:5.7
為了使MySQL支援中文, 需設定MySQL的編碼為UTF-8
. 進入容器後, 新增或修改/etc/mysql/conf.d/my.cnf
檔案, 新增如下內容, 並重啟容器使設定生效.
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
因為Grafana並不會檢查SQL語句是否安全, 比如DROP TABLE user
, 所以為了安全起見, 我們需要建立一個只擁有讀許可權的使用者, 供Grafana查詢資料用.
-- 建立使用者前, 先建立一個名為 health 的資料庫
CREATE DATABASE health DEFAULT CHARACTER SET utf8;
-- 建立名為 grafana 的使用者, 密碼為xxxxxx
CREATE USER "grafana"@"%" IDENTIFIED BY 'xxxxxx';
-- 給予 grafana 使用者 health 資料庫的讀許可權
GRANT SELECT ON health.* TO 'grafana'@'%';
FLUSH PRIVILEGES;
本文在health資料庫建立一個測試表: thyroid 甲狀腺功能. 表設計的不是很合理, 但是本文主要講述的是通過docker部署grafana和mysql, MySQL僅作為一個資料來源.
通過以下sql語句, 建立表以及插入測試資料, MySQL部分就完結了.
CREATE TABLE thyroid
(
check_time DATETIME NOT NULL COMMENT '檢查時間',
norm_name VARCHAR(100) NOT NULL COMMENT '指標名稱',
norm_value DECIMAL(15,5) NOT NULL COMMENT '指標值',
norm_range_low DECIMAL(15,5) COMMENT '指標正常範圍',
norm_range_high DECIMAL(15,5) COMMENT '指標正常範圍',
PRIMARY KEY(norm_name, check_time)
) ENGINE=innodb DEFAULT CHARSET=utf8;
INSERT INTO thyroid VALUES
('2022-01-01 08:00:00', 1,'甲狀腺球蛋白抗體', 63.64, '', 0, 115),
('2022-01-01 08:00:00', 1,'甲狀腺過氧化物酶抗體', 81.26, '', 0, 34),
('2022-01-01 08:00:00', 1,'甲狀腺球蛋白', 48.80, '', 3.5, 77),
('2022-01-01 08:00:00', 1,'TSH受體抗體', 8.14, '', 0, 1.58),
('2022-01-02 09:00:00', 1,'甲狀腺球蛋白抗體', 70.59, '', 0, 115),
('2022-01-02 09:00:00', 1,'甲狀腺過氧化物酶抗體', 71.26, '', 0, 34),
('2022-01-02 09:00:00', 1,'甲狀腺球蛋白', 58.80, '', 3.5, 77),
('2022-01-02 09:00:00', 1,'TSH受體抗體', 9.14, '', 0, 1.58),
('2022-01-03 09:30:00', 1,'甲狀腺球蛋白抗體', 73.59, '', 0, 115),
('2022-01-03 09:30:00', 1,'甲狀腺過氧化物酶抗體', 70.26, '', 0, 34),
('2022-01-03 09:30:00', 1,'甲狀腺球蛋白', 62.80, '', 3.5, 77),
('2022-01-03 09:30:00', 1,'TSH受體抗體', 4.14, '', 0, 1.58);
通過以下命令啟動, 啟動Grafana時, 也需要注意以下選項
--network my-bridge
中的my-bridge
為剛剛建立的網路的名稱, 二者必須要一致$ docker run -d \
--user root \
-p 30001:3000 \
-v $HOME/docker/grafana/data:/var/lib/grafana \
--network my-bridge \
-h grafana \
--name grafana \
grafana/grafana
啟動後, 瀏覽器資料伺服器IP:3000
進入Grafana介面, 預設使用者為admin
, 預設密碼為admin
.
進入介面的第一件事, 就是設定資料來源, 告訴Grafana從哪裡讀取資料. 點選 頁面左邊的設定按鈕
-> Data sources
-> Add data source
進入資料來源設定介面. 詳細設定如下:
Name
表示資料來源的名字, 可以隨便取, 自己認識就可以, 因為可能存在多個資料來源的情況Host
是IP:埠
的格式, 這裡想要MySQL, MySQL的IP就是建立MySQL時指定的容器名字, 此處我的設定是mysql:3306
Database
表示使用哪個資料庫User
表示MySQL使用者名稱Password
為MySQL的密碼設定完成後, 點選下方的Save & test
按鈕即可.
Grafana中兩個比較重要的概念就是dashboard與panel. 通俗來說, 一個panel就是一個表格; 一個dashboard可以顯示一個或多個panel, dashboard是panel的集合; 一個Grafana範例包含一個或多個dashboard.
點選頁面左邊的田
字形按鈕, 選擇New dashboard
, 再點選add a new panel
即可新增一個面板, 新增之後, 會進入的到下圖所示的panel設定介面.
設定好之後, 一定要點選save
按鈕, Grafana不會自動儲存任何設定!!!
儲存後會回到dashboard介面, 會顯示我們剛剛設定好的panel. 點選下圖中藍色線條所在位置, 即可自定義panel中線條的顏色; 點選下圖中綠色線條所在位置, 即可隱藏其他線條, 再次點選恢復顯示其他線條.