Docker LibreNMS安裝記錄(含MariaDB、PhpMyAdmin)

在Ubuntu 20.04 LTS 上安裝Docker 版LibreNms+Mariadb+phpMyAdmin,未使用Docker-Compose

筆記如下(單引號不可以忽略):
###Ubuntu Docker安裝###
Ubuntu Docker 安裝,我是參考這篇flynncanfly大的文章「Docker獸 究極進化」來安裝的(https://ithelp.ithome.com.tw/articles/10239123)。結論是快又有效!讚!
#安裝所需基本套件
sudo apt-get install apt-transport-https
sudo apt-get install ca-certificates
sudo apt-get install curl
sudo apt-get install gnupg-agent
sudo apt-get install software-properties-common

#安裝官方 GPG 金鑰
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

#驗證指紋金鑰(應為:9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88)
sudo apt-key fingerprint 0EBFCD88

#將 Docker 安裝網址加入套件庫來源
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

#安裝Docker社群版
sudo apt-get install docker-ce docker-ce-cli containerd.io

###安裝MariaDB###(mariadb_root_password 是指定Docker啟動後,這個MariaDB root帳號的密碼)
sudo docker run -d -e 'MYSQL_ROOT_PASSWORD=mariadb_root_password' -e 'TZ=Asia/Taipei' -v '/home/myusername/database/mariadb':'/var/lib/mysql' -v '/home/myusername/mariadbcustom.cnf':'/etc/mysql/conf.d/custom.cnf' -p 3306:3306 --restart=always --name mariadb mariadb:latest

參數說明:

run :執行指定的Docker Image (本地沒有就自動下載)
-d  :以背景方式執行
-e 'MYSQL_ROOT_PASSWORD=mariadb_root_password'  :設定環境變數,在此為設定MariaDB啟動後的root密碼
-e 'TZ=Asia/Taipei'  :指定MariaDB 時間(跟LibreNms配合)
-v '/home/myusername/database/mariadb':'/var/lib/mysql'   :將外部的/home/myusername/database/mariadb 資料夾(需事先建立空資料夾),映射到容器內部的/var/lib/mysql 資料夾。容器對資料夾的讀寫,實際是讀寫外部資料夾。容器刪除後,外部資料夾仍存在。
-v '/home/myusername/mariadbcustom.cnf':'/etc/mysql/conf.d/custom.cnf'   :將外部的/home/myusername/mariadbcustom.cnf檔案,映射到容器內部的/etc/mysql/conf.d/custom.cnf。此處是以此檔設定MariaDB的語系為UTF8,以此方式方便啟動新容器時可以直接套用。
-p 3306:3306  :將容器Listen 的3306 Port直接對應到外部的3306 Port,也就是當連線外部機的3306 Port時,實際會連到此容器內Listen的3306 Port
--restart=always  :設定如果外部主機重啟了,會自動將本容器帶起來
--name mariadb   :命名本容器執行後的名稱,不命名的話,有時會自動命名成沒想到的名稱
mariadb:latest  :要執行的Image檔,因為本地若沒有會自動下載,所以指定最新版
mariadbcustom.cnf的內容(用來設定MariaDB 語系使用UTF8):
[mysqld]
character-set-server = utf8
collation-server = utf8_unicode_ci
skip-character-set-client-handshake

#連線Container mariadb
sudo docker exec -it mariadb bash

#登入root
mysql -u root -p

##MariaDB設定LibreNMS會用到的帳密(登入MariaDB內設定)
#新增LibreNMS要用的DB,名稱librenms ,並指定LibreNMS指定的編碼
CREATE DATABASE librenms CHARACTER SET utf8 COLLATE utf8_unicode_ci;

#新增LibreNMS要用的USER: librenms,並允許從任何主機登入
CREATE USER 'librenms'@'%' IDENTIFIED BY 'user_librenms_password';

#授權librenms對 librenms 資料庫何做任何操作,並刷新權限
GRANT ALL PRIVILEGES on librenms.* TO 'librenms'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;

#檢視User權限
show grants for librenms;

#檢視User清單
select user,host from mysql.user;

#查看MariaDB版本
select version();

#查看MariaDB 語系
select * from INFORMATION_SCHEMA.SCHEMATA;

#停止、移除mariadb、清空外掛檔案區(方便不斷重新安裝測試用到)
sudo docker stop mariadb; sudo docker rm mariadb; sudo rm /home/myusername/database/mariadb/* -f -r;

###安裝PhpMyAdmin### (視個人需求安裝,我裝好後就又沒用它了)
#以外部主機方式連線MariaDB(即指定主機IP,這裡以Docker分配的IP 172.17.0.2為例)
sudo docker run --name phpmyadmin -d -e PMA_HOST=172.17.0.2 -p 8080:80 phpmyadmin/phpmyadmin

#以Docker Container方式連線MariaDB(「mariadb」是MariaDB的Container名稱,名稱後面的「:db」不能省略)
sudo docker run --name phpmyadmin -d --link mariadb:db -p 8080:80 phpmyadmin/phpmyadmin

###安裝LibreNMS官方版及初始設定### (https://hub.docker.com/r/librenms/librenms/)
##安裝LibreNMS(安裝完成預設帳密是librenms/librenms)
sudo docker run --name librenms -d -e 'DB_HOST=172.17.0.2' -e 'DB_PORT=3306' -e 'DB_NAME=librenms' -e 'DB_USER=librenms' -e 'DB_PASSWORD=user_librenms_password' -e 'DB_TIMEOUT=10' -e 'LIBRENMS_SNMP_COMMUNITY=mycommunityname' -e 'TZ=Asia/Taipei' -p '80:8000' -v '/home/myusername/librenmsdata/21.3.0/data':'/data' --restart=always librenms/librenms su - librenms -c "/opt/librenms/librenms-service.py -v"

參數說明():

run :執行指定的Docker Image (本地沒有就自動下載)
--name librenms   :命名本容器的名稱
-d   :以背景執行本容器,LibreNms不指定背景的話,可以看到執行中的訊息
-e 'DB_HOST=172.17.0.2'   :指定要使用的DB主機,在這裡是用Docker分配給MariaDB的IP,這裡是用容器對容器的連線,所以IP不是外部機的IP (也許MariaDB不需要將3306映射到外部機)
-e 'DB_PORT=3306'   :MariaDB的Listen Port
-e 'DB_NAME=librenms'   :要給LibreNMS使用的資料庫名(已在MariaDB建好一個空的)
-e 'DB_USER=librenms'   :要給LibreNMS連線資料庫的帳號
-e 'DB_PASSWORD=user_librenms_password'   :LibreNms連線資料庫的密碼
-e 'DB_TIMEOUT=10'   :LibreNms連線資料庫的Timeout時間,因為都在同一實體機了,所以從預設值60降到10,如果連不上,應該就是連不上
-e 'LIBRENMS_SNMP_COMMUNITY=mycommunityname'   :這個參數不太確定,應該不是監控主機的community,也許是讀snmpd 設定檔區段用的
-e 'TZ=Asia/Taipei'   :  指定時區
-p '80:8000'   :將LibreNMS內部的8000 Port 映射到外部機的80 Port,這裡看個人需求,容器內還是Listen 8000是不變的
-v '/home/myusername/librenmsdata/21.3.0/data':'/data'  :將外部機的/home/myusername/librenmsdata/21.3.0/data目錄(需事件建立),掛載到容器內的/data目錄,以將記錄資料寫到實體機
--restart=always   :外部機重啟後,自動帶起本容器
librenms/librenms  :執行的Image名稱
su - librenms -c "/opt/librenms/librenms-service.py -v"  :指定容器啟動後,以librenms身份執行poller的新版控制程式(僅poller功能)。librenms身份是確保/data/rrd下新建的Device目錄是用librenms建立,如果移除Device時才有權限刪rrd。此選項依個人需要使用。

##後置作業設定MariaDB:librenms
#連線Container mariadb
sudo docker exec -it mariadb bash

#登入librenms
mysql -u librenms -p

#設定librenms 資料庫(登入LibreNMS後,右上的Validata Config內指出必需修正的內容)
use librenms; 
ALTER TABLE `notifications` CHANGE `datetime` `datetime` timestamp NOT NULL DEFAULT '1970-01-02 00:00:00' ; 
ALTER TABLE `users` CHANGE `created_at` `created_at` timestamp NOT NULL DEFAULT '1970-01-02 00:00:01' ;

##後置作業,設定librenms 系統設定(登入LibreNMS後,右上的Validata Config內指出必需修正的內容)
#連線Container librenms
sudo docker exec -it librenms bash

#執行以下指令,以複制及建立連結
ln -s /opt/librenms/lnms /usr/bin/lnms; 
cp /opt/librenms/misc/librenms.logrotate /etc/logrotate.d/librenms

##後置作業,啟動librenms-service已整合到容器建置指令中
#(上述的安裝完成後,發現一直不會更新加入的設備資訊,一直停留在Generic Device,也不會收集數據。研究了很久,舊版的是用cron排程執行poller.php,新版的似乎可以用librenms-service.py完成所有原本cron做的事。)
#(還不知道怎麼讓它整合進Ctainer 比較好,目前是先用背景方式執行(就是加上 &),但訊息還是會一直冒出來就是了。) 
/opt/librenms/librenms-service.py -v &

##重新啟動librenms 容器
sudo docker restart librenms

##批次移除本安裝的LibreNMS
#停止、移除librenms、清空外掛檔案區(方便不斷重新安裝測試用到)
sudo docker stop librenms; sudo docker rm librenms; sudo rm /home/myusername/librenmsdata/21.3.0/data -r -f

###LibreNMS設定###
#登人librenms web後,右上齒輪→Global Settings 有多項設定可以使用,但若/opt/librenms/config.php有設定,在這裡就會變成唯讀。
##Email寄件設定
Global Settings→Alerting→Email Options

##自動通知設定
Alerts→Alert Transports→Create alert transport  :設定各種通知方式,其中Api可以支援呼叫WebApi,Email一個設定只有一個接收人。
Alerts→Alert Transports→Create transport group  :將transport群組化,例如通知多個Email跟Api。

##允許設備名稱重覆(有時候就是會發生,或需要)
Global Settings→Discovery→General Discovery Settings 

##設定要執行的Poller Modules
Global Settings→Poller Modules

###Docker 基本指令###
#確認Docker版本
sudo docker -v

#查看本機的Image
docker images

#列出Container(看全部: -a )
sudo docker ps -a

#登入Container(有bash的例子,如本例的mariadb)
sudo docker exec -it <container_name> bash

#啟動Container(container_Name 或 container_id)
docker start <container_name>

#停止Container(container_Name 或 container_id)
docker stop <container_name>

#強制停止Container(container_Name 或 container_id)
docker kill <container_name)

#移除Conteriner(container_Name 或 container_id)
docker rm  <container_name>

#查看Container IP (container_Name 或 container_id)(底下兩行都可以,中間的式子,只是從資料中撈出IP那一行)
sudo docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container_name>
sudo docker inspect <container_name>|grep '"IPAddress"'|head -n 1