通過docker部署grafana和mysql

2022-11-19 06:00:31

閱讀本文需要一定的Linux, Docker與MySQL知識, 例如: 會啟動容器, 進入容器; 會建立表, 會使用INSERT語句, 會使用SELECT語句...

1. 簡介

grafana是一個資料視覺化程式, 可通過瀏覽器檢視資料圖表. 本文將以MySQL為資料來源, 介紹如何通過Docker部署grafana與MySQL.

2. 網路設定

2.1 docker網路設定

既然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

2.2 防火牆設定

如果伺服器設定了防火牆, 需要將相應埠開啟. 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

3. MySQL

3.1 啟動MySQL

通過以下命令啟動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

3.2 設定mysql

為了使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

3.3 建立唯讀使用者

因為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;

3.4 建立資料庫

本文在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);

4. Grafana

4.1 啟動Grafana

通過以下命令啟動, 啟動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

4.2 設定資料來源

啟動後, 瀏覽器資料伺服器IP:3000進入Grafana介面, 預設使用者為admin, 預設密碼為admin.

進入介面的第一件事, 就是設定資料來源, 告訴Grafana從哪裡讀取資料. 點選 頁面左邊的設定按鈕 -> Data sources -> Add data source進入資料來源設定介面. 詳細設定如下:

  • Name表示資料來源的名字, 可以隨便取, 自己認識就可以, 因為可能存在多個資料來源的情況
  • HostIP:埠的格式, 這裡想要MySQL, MySQL的IP就是建立MySQL時指定的容器名字, 此處我的設定是mysql:3306
  • Database表示使用哪個資料庫
  • User表示MySQL使用者名稱
  • Password為MySQL的密碼

設定完成後, 點選下方的Save & test按鈕即可.

4.3 dashboard與panel

Grafana中兩個比較重要的概念就是dashboard與panel. 通俗來說, 一個panel就是一個表格; 一個dashboard可以顯示一個或多個panel, dashboard是panel的集合; 一個Grafana範例包含一個或多個dashboard.

點選頁面左邊的字形按鈕, 選擇New dashboard, 再點選add a new panel即可新增一個面板, 新增之後, 會進入的到下圖所示的panel設定介面.

  • 紅色標識處選擇之前設定好的Datasource
  • 藍色標識處選擇 Builder/Code 模式: Code模式是直接寫SQL語句查詢資料; Builder是通過圖形化介面選擇表與過濾條件, 二者效果一樣, 可以互相轉換
  • 藍色標識處設定panel名字, 與一些其他設定

設定好之後, 一定要點選save按鈕, Grafana不會自動儲存任何設定!!!

儲存後會回到dashboard介面, 會顯示我們剛剛設定好的panel. 點選下圖中藍色線條所在位置, 即可自定義panel中線條的顏色; 點選下圖中綠色線條所在位置, 即可隱藏其他線條, 再次點選恢復顯示其他線條.

5. 參考