首頁 > 軟體

基於docker安裝zabbix的詳細教學

2022-06-02 18:01:11

基於docker安裝zabbix

1、zabbix設定

用途ip賬戶
zabbix伺服器端192.168.1.1賬戶:Admin 密碼:zabbix
zabbix-mysql資料庫192.168.1.2資料庫:zabbix,使用者:zabbix 密碼:123456

2、儲存設定

儲存規劃

docker映象檔案預設儲存路徑:/var/lib/docker
為避免系統磁碟空間不足影響docker服務正常執行,需要調整docker預設儲存路徑。

通用儲存建議:
1、目錄/data:用於儲存資料檔案;
2、目錄/app:用於儲存應用檔案;
3、資料盤建議使用卷管理模式,便於後期擴容

綜上,對應zabbix服務安裝,建議:
1、目錄/data/docker用於儲存docker檔案;
1、目錄/data/zabbix用於儲存zabbix相關組態檔;

格式化磁碟

[root@s01 ~]# fdisk -l

Disk /dev/vda: 64.4 GB, 64424509440 bytes, 125829120 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x0001598a

   Device Boot      Start         End      Blocks   Id  System
/dev/vda1            2048     8390655     4194304   82  Linux swap / Solaris
/dev/vda2   *     8390656   125829086    58719215+  83  Linux

Disk /dev/vdb: 107.4 GB, 107374182400 bytes, 209715200 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

[root@s01 ~]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
vda    253:0    0   60G  0 disk
├─vda1 253:1    0    4G  0 part [SWAP]
└─vda2 253:2    0   56G  0 part /
vdb    253:16   0  100G  0 disk
[root@s01 ~]# fdisk /dev/vdb
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x4dee972c.

Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p):
Using default response p
Partition number (1-4, default 1):
First sector (2048-209715199, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-209715199, default 209715199):
Using default value 209715199
Partition 1 of type Linux and of size 100 GiB is set

Command (m for help): p

Disk /dev/vdb: 107.4 GB, 107374182400 bytes, 209715200 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x4dee972c

   Device Boot      Start         End      Blocks   Id  System
/dev/vdb1            2048   209715199   104856576   83  Linux

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.
[root@s01 ~]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
vda    253:0    0   60G  0 disk
├─vda1 253:1    0    4G  0 part [SWAP]
└─vda2 253:2    0   56G  0 part /
vdb    253:16   0  100G  0 disk
└─vdb1 253:17   0  100G  0 part

建立pv

[root@s01 ~]# pvcreate /dev/vdb1
  Physical volume "/dev/vdb1" successfully created.
[root@s01 ~]# pvs
  PV         VG Fmt  Attr PSize    PFree
  /dev/vdb1     lvm2 ---  <100.00g <100.00g

建立vg

[root@s01 ~]# vgcreate vg0 /dev/vdb1
  Volume group "vg0" successfully created
[root@s01 ~]# vgs
  VG  #PV #LV #SN Attr   VSize    VFree
  vg0   1   0   0 wz--n- <100.00g <100.00g

建立lv

[root@s01 ~]# lvcreate -l 100%VG -n lv_1 vg0
  Logical volume "lv_1" created.
[root@s01 ~]# lvs
  LV   VG  Attr       LSize    Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  lv_1 vg0 -wi-a----- <100.00g

建立檔案系統

[root@s01 ~]# mkfs.xfs /dev/vg0/lv_1
meta-data=/dev/vg0/lv_1          isize=512    agcount=4, agsize=6553344 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=26213376, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=12799, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

建立掛載目錄

[root@s01 ~]# mkdir /data

掛載分割區

[root@s01 ~]# mount /dev/vg0/lv_1 /data

[root@s01 ~]# df -Th
Filesystem           Type      Size  Used Avail Use% Mounted on
devtmpfs             devtmpfs  7.8G     0  7.8G   0% /dev
tmpfs                tmpfs     7.8G     0  7.8G   0% /dev/shm
tmpfs                tmpfs     7.8G  8.7M  7.8G   1% /run
tmpfs                tmpfs     7.8G     0  7.8G   0% /sys/fs/cgroup
/dev/vda2            ext3       55G  2.7G   50G   6% /
/dev/mapper/vg0-lv_1 xfs       100G   33M  100G   1% /data
tmpfs                tmpfs     1.6G     0  1.6G   0% /run/user/0

寫入啟動項

# vi /etc/fstab
# 新增內容:
/dev/vg0/lv_1  /data xfs    defaults        1 2

3、安裝docker

# 檢視作業系統版本
$ cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core)
# 安裝docker
$ yum install -y docker
# 檢視docker版本
$ docker -v
Docker version 1.13.1, build 7d71120/1.13.1

4、修改docker儲存路徑

docker預設儲存路徑:/var/lib/docker
新儲存路徑:/data/docker

$ docker -v
Docker version 1.13.1, build 7d71120/1.13.1

# 停止docker
$ systemctl stop docker
# 設定docker新儲存路徑
$ mv /var/lib/docker /data/docker

# 修改docker路徑
$ vim /etc/docker/daemon.json
{
    "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
    "graph": "/data/docker"
}
# 啟動docker
$ systemctl start docker

# 檢視docker程序資訊
$ docker info

5、建立專用於 Zabbix 元件容器的網路:

# 1.bridge模式
docker預設網路模式。此模式將容器連線到一個docker0虛擬網橋,通過docker0網橋以及Iptables nat表設定與宿主機通訊。開啟的容器會自動分配和IP在一個網段的ip地址,並且開啟的容器的ip以IP為基礎遞增關閉容器之後,ip會自動釋放。bridge模式只有宿主機才能與執行在其上面的容器進行通訊。
# 2.host模式
容器將不會虛擬出自己的網路卡,設定自己的IP等,而是直接與宿主機的共用P和埠。
如果啟動容器的時候使用host模式,那麼這個容器將不會獲得一個獨立的Network Namespace,而是和宿主機共用一個Network Namespace。容器將不會虛擬出自己的網路卡,設定自己的IP等,而是使用宿主機的IP和埠。但是,容器的其他方面,如檔案系統、程序列表等還是和宿主機隔離的。
使用host模式的容器可以直接使用宿主機的IP地址與外界通訊,容器內部的伺服器埠也可以使用宿主機的埠,不需要進行NAT,host最大的優勢就是網路效能比較好,但是docker host上已經使用的埠就不能再用了,網路的隔離性不好,網路的安全性變差。
# 3.none模式
該模式關閉了容器的網路功能。
使用none模式,Docker容器擁有自己的Network Namespace,但是,並不為Docker容器進行任何網路設定。也就是說,這個Docker容器沒有網路卡、IP、路由等資訊。需要我們自己為Docker容器新增網路卡、設定IP等。
這種網路模式下容器只有lo迴環網路,沒有其他網路卡。none模式可以在容器建立時通過–network=none來指定。這種型別的網路沒有辦法聯網,封閉的網路能很好的保證容器的安全性。

# 建立專用於 Zabbix 元件容器的網路
$ docker network create --subnet 172.20.0.0/16 --ip-range 172.20.240.0/20 zabbix-net

# 檢視的docker network
$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
14c25119dd06        bridge              bridge              local
4e2782140647        host                host                local
b25888b8c26a        none                null                local
cfc3bf2124af        zabbix-net          bridge              local

# 檢視新增的網路
$ ip a
5: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:31:ce:6a:ce brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 scope global docker0
       valid_lft forever preferred_lft forever

6: br-cfc3bf2124af: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:cd:35:b7:4c brd ff:ff:ff:ff:ff:ff
    inet 172.20.240.0/16 scope global br-cfc3bf2124af
       valid_lft forever preferred_lft forever

6、建立mysql庫

如果生產環境已有mysql範例,僅需建立資料庫。

$ mysql -uroot -p -h 192.168.1.2
password  root_pwd
mysql> create database zabbix character set utf8 collate utf8_bin;
mysql> create user zabbix@192.168.1.1 identified by '123456';
mysql> grant all privileges on zabbix.* to zabbix@192.168.1.1;
mysql> quit;

[廢棄]6、docker安裝mysql

建議使用平臺提供mysql範例。

拉取mysql映象

$ docker pull mysql

建立mysql容器

# -----------------------------------------------
# 建立mysql伺服器範例
# 注意:此命令用於建立mysql容器範例後提取組態檔,如果已有組態檔,可直接進入下一步:
$ docker run --name mysql-server -t 
-e MYSQL_DATABASE="zabbix" 
-e MYSQL_USER="zabbix" 
-e MYSQL_PASSWORD="123456" 
-e MYSQL_ROOT_PASSWORD="root_pwd" 
-e TZ=Asia/Shanghai 
--network=zabbix-net 
--ip=172.20.240.1 
-p 3306:3306 
-d mysql:latest 
--character-set-server=utf8 --collation-server=utf8_bin 
--default-authentication-plugin=mysql_native_password

# -----------------------------------------------
# 建立mysql設定與資料儲存路徑
$ mkdir -p /app/mysql/conf
$ mkdir -p /app/mysql/data
# 拷貝已有mysql組態檔到宿主機目錄
$ docker cp mysql-server:/etc/mysql/ /app/mysql/conf/

# 使用新路徑建立mysql-server
$ docker run --name mysql-server -t 
-e MYSQL_DATABASE="zabbix" 
-e MYSQL_USER="zabbix" 
-e MYSQL_PASSWORD="123456" 
-e MYSQL_ROOT_PASSWORD="root_pwd" 
-e TZ=Asia/Shanghai 
-v /app/mysql/conf:/etc/mysql 
-v /app/mysql/data:/var/lib/mysql 
--network=zabbix-net 
--ip=172.20.240.1 
-p 3306:3306 
-d mysql:latest 
--character-set-server=utf8 --collation-server=utf8_bin 
--default-authentication-plugin=mysql_native_password

# 關於mysql容器重啟策略
問題描述:
如果建立mysql容器時指定--restart引數,則無法啟動容器
--restart unless-stopped 
解決辦法:
需要建立後,手工更新容器重啟策略:
$ docker update --restart=unless-stopped mysql-server

# 檢視啟動紀錄檔
$ docker logs mysql-server
2022-04-15 05:43:59+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.28-1debian10 started.
2022-04-15 05:43:59+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
2022-04-15 05:43:59+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.28-1debian10 started.
2022-04-15T05:44:00.942337Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.28) starting as process 1

# 檢視程序
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
28c91f44958a        mysql:latest        "docker-entrypoint..."   22 hours ago        Up 5 minutes        0.0.0.0:3306->3306/tcp, 33060/tcp   mysql-server

# 連線mysql
$ docker exec -it mysql-server /bin/bash
root@28c91f44958a:/# whereis mysql
mysql: /usr/bin/mysql /usr/lib/mysql /etc/mysql
root@28c91f44958a:/# mysql -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 8
Server version: 8.0.28 MySQL Community Server - GPL

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.01 sec)

新增防火牆埠

firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload
firewall-cmd --zone=public --list-ports

7、安裝zabbix-java-gateway

Zabbix Java gateway 的守護行程是用 Java 編寫。為了在特定主機上找到 JMX 計數器的值,Zabbix server 向 Zabbix Java gateway 傳送請求,後者使用 JMX 管理 API 來遠端查詢相關的應用。該應用不需要安裝額外的軟體。只需要在啟動時,命令列新增-Dcom.sun.management.jmxremote選項即可。

# 執行zabbix-java-gateway
$ docker run --name zabbix-java-gateway -t 
-e TZ=Asia/Shanghai 
--network=zabbix-net 
--ip=172.20.240.2 
--restart unless-stopped 
-d zabbix/zabbix-java-gateway:latest

# 檢視程序
$ docker ps
CONTAINER ID        IMAGE                               COMMAND                  CREATED             STATUS              PORTS               NAMES
85a594ad32d9        zabbix/zabbix-java-gateway:latest   "docker-entrypoint..."   9 seconds ago       Up 9 seconds        10052/tcp           zabbix-java-gateway

# 檢視紀錄檔
$ docker logs zabbix-java-gateway
** Preparing Zabbix Java Gateway
** Preparing Zabbix Java Gateway log configuration file
Updating /etc/zabbix/zabbix_java_gateway_logback.xml 'DebugLevel' parameter: 'info'... updated
2022-04-15 06:43:36.232 [main] INFO  com.zabbix.gateway.JavaGateway - Zabbix Java Gateway 6.0.3 (revision 506e2b5) has started
2022-04-15 06:43:36.247 [main] INFO  com.zabbix.gateway.JavaGateway - listening on 0.0.0.0/0.0.0.0:10052

8、安裝zabbix-server

安裝zabbix-server(基於Alphine)

# ------------------------------------------------
# 安裝zabbix-server(latest版本基於Alphine Linux)
$ docker run --name zabbix-server-mysql -t 
-e DB_SERVER_HOST="192.168.1.2" 
-e MYSQL_DATABASE="zabbix" 
-e MYSQL_USER="zabbix" 
-e MYSQL_PASSWORD="123456" 
-e MYSQL_ROOT_PASSWORD="root_pwd" 
-e ZBX_JAVAGATEWAY="zabbix-java-gateway" 
-e TZ=Asia/Shanghai 
--network=zabbix-net 
--ip=172.20.240.3 
-p 10051:10051 
--restart unless-stopped 
-d zabbix/zabbix-server-mysql:latest

# 不需要的引數
# --link mysql-server:mysql 
# --link zabbix-java-gateway 

# ------------------------------------------------
# 使用外部儲存目錄
# 建立zabbix-server設定目錄
$ mkdir -p /data/zabbix/conf
$ mkdir -p /data/zabbix/alertscripts
# 拷貝zabbix組態檔
$ docker cp zabbix-server-mysql:/etc/zabbix/zabbix_server.conf /data/zabbix/conf
$ ll /data/zabbix/conf
total 28
-rw-rw-r-- 1 root root 24804 May 30 15:14 zabbix_server.conf

# 移除容器
$ docker stop zabbix-server-mysql
$ docker rm zabbix-server-mysql
# 重新建立容器
$ docker run --name zabbix-server-mysql -t 
-e DB_SERVER_HOST="192.168.1.2" 
-e MYSQL_DATABASE="zabbix" 
-e MYSQL_USER="zabbix" 
-e MYSQL_PASSWORD="123456" 
-e MYSQL_ROOT_PASSWORD="root_pwd" 
-e ZBX_JAVAGATEWAY="zabbix-java-gateway" 
-e TZ=Asia/Shanghai 
-v /data/zabbix/conf/zabbix_server.conf:/etc/zabbix/zabbix_server.conf 
-v /data/zabbix/alertscripts:/usr/lib/zabbix/alertscripts 
--network=zabbix-net 
--ip=172.20.240.3 
-p 10051:10051 
--restart unless-stopped 
-d zabbix/zabbix-server-mysql:latest

# 檢視紀錄檔,此版本是:5.4.9
$ docker logs zabbix-server-mysql
Starting Zabbix Server. Zabbix 5.4.9 (revision d81e506).

設定企業微信指令碼

# 將企業微信傳送指令碼:pyweixin.py,儲存到目錄:alertscripts
$ cd /data/zabbix/alertscripts
$ vim pyweixin.py
$ chmod +x pyweixin.py

# 修改python3地址
# 微信指令碼預設的python3地址為與實際不符:
#!/usr/local/python3/bin/python3.5
# 需要修改為以下地址:
#!/usr/bin/python3

安裝python環境

傳送企業微信需要python環境支援。

# 使用root使用者進入容器安裝python
$ docker exec --privileged -u root -it zabbix-server-mysql /bin/bash
$ cat /etc/issue
Welcome to Alpine Linux 3.14
Kernel r on an m (l)

# 修改Alpine映象源
$ sed -i s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g /etc/apk/repositories
# 安裝python
$ apk add --update --no-cache curl jq py3-configobj py3-pip py3-setuptools python3 python3-dev
# 驗證python3版本
$ python3 -V
Python 3.9.5

新增防火牆埠

# 開啟防火牆
$ systemctl enable firewalld
$ systemctl start firewalld

# 新增防火牆埠
firewall-cmd --zone=public --add-port=10051/tcp --permanent
firewall-cmd --reload
firewall-cmd --zone=public --list-ports

9、安裝zabbix-web-nginx-mysql 建立容器

# 建立容器
$ docker run --name zabbix-web-nginx-mysql -t 
-e ZBX_SERVER_HOST="zabbix-server-mysql" 
-e DB_SERVER_HOST="192.168.1.2" 
-e MYSQL_DATABASE="zabbix" 
-e MYSQL_USER="zabbix" 
-e MYSQL_PASSWORD="123456" 
-e MYSQL_ROOT_PASSWORD="root_pwd" 
-e PHP_TZ=Asia/Shanghai 
-e TZ=Asia/Shanghai 
--network=zabbix-net 
--ip=172.20.240.4 
-p 80:8080 
--restart unless-stopped 
-d zabbix/zabbix-web-nginx-mysql:latest

# 取消以下引數
# --link mysql-server:mysql 
# --link zabbix-server-mysql:zabbix-server 

# 檢視紀錄檔
$ docker logs zabbix-web-nginx-mysql
** Deploying Zabbix web-interface (Nginx) with MySQL database
** Using MYSQL_USER variable from ENV
** Using MYSQL_PASSWORD variable from ENV
********************
* DB_SERVER_HOST: mysql-server
* DB_SERVER_PORT: 3306
* DB_SERVER_DBNAME: zabbix
********************
** Adding Zabbix virtual host (HTTP)
**** Impossible to enable SSL support for Nginx. Certificates are missed.
** Preparing Zabbix frontend configuration file

# 程序列表
$ docker ps
CONTAINER ID        IMAGE                                  COMMAND                  CREATED             STATUS              PORTS                               NAMES
a707c1ff30c9        zabbix/zabbix-web-nginx-mysql:latest   "docker-entrypoint.sh"   6 minutes ago       Up 6 minutes        8443/tcp, 0.0.0.0:80->8080/tcp      zabbix-web-nginx-mysql
27f3c4948691        zabbix/zabbix-server-mysql:latest      "/sbin/tini -- /us..."   24 hours ago        Up About an hour    0.0.0.0:10051->10051/tcp            zabbix-server-mysql
fa0a386f2459        zabbix/zabbix-java-gateway:latest      "docker-entrypoint..."   25 hours ago        Up About an hour    10052/tcp                           zabbix-java-gateway

新增防火牆埠

firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload
firewall-cmd --zone=public --list-ports

存取zabbix服務

# 經過上述設定後,Zabbix 前端已準備就緒! 預設使用者名稱是Admin,密碼zabbix。
http://192.168.1.1
# 存取zabbix-web服務時,發現監控首頁提示錯誤:
Zabbix agent is not available (for 3m)
需要安裝zabbix-agent,並設定zabbix-agent的ip,詳見下面小結:

10、安裝zabbix-agent(yum安裝)

由於zabbix-agent用於監控伺服器狀態,建議直接安裝在伺服器上,不要使用docker安裝。

a. 安裝Zabbix資源庫

產品手冊

$ rpm -Uvh https://repo.zabbix.com/zabbix/5.4/rhel/7/x86_64/zabbix-release-5.4-1.el7.noarch.rpm
$ yum clean all

b. 安裝 Zabbix agent

$ yum install -y zabbix-agent

# 設定agent,設定伺服器端地址
$ vim /etc/zabbix/zabbix_agentd.conf
# 如果在zabbix-server上安裝agent,需要設定zabbix-server的docker地址:
Server=172.20.240.3
ServerActive=172.20.240.3
# 如果在被監控伺服器上安裝agent,需要設定zabbix-server的宿主機地址:
Server=192.168.1.1
ServerActive=192.168.1.1

# 註釋掉Hostname設定,讓agent自動解析
# Hostname=****
# 如果作業系統不允許建立zabbix使用者,需要使用root執行agent,修改設定:
AllowRoot=1

c. 啟動 Zabbix agent

設定開機zabbix-agent開機啟動

$ systemctl enable zabbix-agent
$ systemctl restart zabbix-agent
$ systemctl status zabbix-agent

d.root使用者啟動

啟動agent服務時,提示以下錯誤:

# 問題描述:
Failed at step USER spawning /usr/sbin/zabbix_agentd: No such process
zabbix-agent.service: control process exited, code=exited status=217
Failed to start Zabbix Agent.
Unit zabbix-agent.service entered failed state.

# 問題分析
此問題主要是因為作業系統限制不允許建立使用者導致的,需要使用root賬戶啟動服務。

# 解決辦法
修改啟動使用者:
vim /usr/lib/systemd/system/zabbix-agent.service
修改預設使用者zabbix為root,
修改前:
User=zabbix
Group=zabbix
修改後:
User=root
Group=root

# 然後過載服務設定,並啟動服務
systemctl daemon-reload
systemctl start zabbix-agent.service

e.設定防火牆

firewall-cmd --zone=public --add-port=10050/tcp --permanent
firewall-cmd --reload
firewall-cmd --zone=public --list-ports

到此這篇關於基於docker安裝zabbix的文章就介紹到這了,更多相關docker安裝zabbix內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com