5 从容器安装

Docker

Zabbix为每个组件提供Docker镜像作为便携且自包含的容器,以加速部署和update流程。

Zabbix组件支持MySQL和PostgreSQL数据库,以及Apache2和nginx网页服务器。这些镜像被划分为不同的独立镜像。

自Zabbix 6.0起,安装过程中必须创建确定性触发器。若MySQL/mariadb启用了二进制日志功能,这需要超级用户权限或设置变量/配置参数log_bin_trust_function_creators = 1。具体设置方法请参阅mysql
注意:若通过控制台执行,该变量仅为临时设置,Docker重启后将失效。
此时请保持SQL服务运行,仅通过执行'docker compose down zabbix-server'和'docker compose up -d zabbix-server'来重启zabbix-server服务。
或者,您可以在配置file中永久设置该变量。

Docker 基础镜像

Zabbix组件提供基于Ubuntu、Alpine Linux和CentOS的基础镜像:

镜像 版本
alpine 3.16
ubuntu 22.04 (jammy)
centos 8

所有镜像都配置为在基础镜像更新时自动重建最新镜像。

Docker 文件源

任何人都可以通过Zabbix official repositorygithub.com上追踪Docker file的变更。您可以fork该项目或基于官方Docker文件构建自己的镜像。

结构

所有Zabbix组件均可在以下Docker仓库中获取:

此外还提供SNMP trap支持。该功能作为附加仓库 (zabbix/zabbix-snmptraps) 仅基于Ubuntu Trusty提供。可与Zabbix server和 Zabbix proxy进行关联。

版本

每个Zabbix组件仓库包含以下标签:

  • latest - 基于Alpine Linux镜像的Zabbix组件最新稳定version
  • alpine-latest - 基于Alpine Linux镜像的Zabbix组件最新稳定version
  • ubuntu-latest - 基于Ubuntu镜像的Zabbix组件最新稳定version
  • alpine-6.0-latest - 基于Alpine Linux镜像的Zabbix 6.0组件最新次要version
  • ubuntu-6.0-latest - 基于Ubuntu镜像的Zabbix 6.0组件最新次要version
  • alpine-6.0.* - 基于Alpine Linux镜像的Zabbix 6.0组件不同次要版本,其中*表示Zabbix组件的次要version
  • ubuntu-6.0.* - 基于Ubuntu镜像的Zabbix 6.0组件不同次要版本,其中*表示Zabbix组件的次要version

初始配置

下载镜像后,通过执行docker run命令启动容器,后接指定所需环境变量和/或挂载点的附加参数。下方提供了一些配置示例

Zabbix不得在容器中作为PID1/初始化进程run运行。

环境变量

所有Zabbix组件镜像都提供用于控制配置的环境变量。这些环境变量在每个组件仓库中均有列出。这些环境变量源自Zabbix配置文件选项,但采用不同的命名方式。例如,ZBX_LOGSLOWQUERIES等同于LogSlowQueries,后者来自Zabbix server和Zabbix proxy配置文件。

部分配置选项不允许修改。例如,PIDFileLogType

某些组件具有特定的环境变量,这些变量在官方Zabbix配置文件中不存在:

变量 组件 描述
DB_SERVER_HOST Server
Proxy
Web界面
该变量为MySQL或PostgreSQL服务器的IP或DNS名称。
默认值为MySQL的mysql-server或PostgreSQL的postgres-server
DB_SERVER_PORT Server
Proxy
Web界面
该变量为MySQL或PostgreSQL服务器的端口号。
默认值分别为'3306'或'5432'。
MYSQL_USER Server
Proxy
Web界面
MySQL数据库用户。
默认值为'zabbix'。
MYSQL_PASSWORD Server
Proxy
Web界面
MySQL数据库密码。
默认值为'zabbix'。
MYSQL_DATABASE Server
Proxy
Web界面
Zabbix数据库名称。
默认值对Zabbix server为'zabbix',对Zabbix proxy为'zabbix_proxy'。
POSTGRES_USER Server
Web界面
PostgreSQL数据库用户。
默认值为'zabbix'。
POSTGRES_PASSWORD Server
Web界面
PostgreSQL数据库密码。
默认值为'zabbix'。
POSTGRES_DB Server
Web界面
Zabbix数据库名称。
默认值为'zabbix'。
PHP_TZ Web界面 PHP格式的时区设置。支持的完整时区列表见php.net
默认值为'Europe/Riga'。
ZBX_SERVER_NAME Web界面 在Web界面右上角Top显示的Zabbix安装名称。
默认值为'Zabbix Docker'
ZBX_JAVAGATEWAY_ENABLE Server
Proxy
启用与Zabbix Java网关的通信以收集Java相关检查项。
默认值为"false"
ZBX_ENABLE_SNMP_TRAPS Server
Proxy
启用SNMP trap功能。此功能需要zabbix-snmptraps实例以及共享卷/var/lib/zabbix/snmptraps挂载至Zabbix server或Zabbix proxy。

这些镜像允许使用某些挂载点。这些挂载点根据Zabbix组件类型不同而有所差异:

描述
Zabbix agent
/etc/zabbix/zabbix_agentd.d 该卷允许包含*.conf文件,并通过UserParameter功能扩展Zabbix agent
/var/lib/zabbix/modules 该卷允许加载额外模块,并通过LoadModule功能扩展Zabbix agent
/var/lib/zabbix/enc 该卷用于存储TLS相关文件。这些file名称通过ZBX_TLSCAFILEZBX_TLSCRLFILEZBX_TLSKEY_FILEZBX_TLSPSKFILE环境变量指定
Zabbix server
/usr/lib/zabbix/alertscripts 该卷用于自定义告警脚本。对应zabbix_server.conf中的AlertScriptsPath参数
/usr/lib/zabbix/externalscripts 该卷被external checks使用。对应zabbix_server.conf中的ExternalScripts参数
/var/lib/zabbix/modules 该卷允许加载额外模块,并通过LoadModule功能扩展Zabbix server
/var/lib/zabbix/enc 该卷用于存储TLS相关文件。这些file名称通过ZBX_TLSCAFILEZBX_TLSCRLFILEZBX_TLSKEY_FILEZBX_TLSPSKFILE环境变量指定
/var/lib/zabbix/ssl/certs 该卷用作SSL客户端证书文件的存储位置。对应zabbix_server.conf中的SSLCertLocation参数
/var/lib/zabbix/ssl/keys 该卷用作SSL私钥文件的存储位置。对应zabbix_server.conf中的SSLKeyLocation参数
/var/lib/zabbix/ssl/ssl_ca 该卷用作SSL服务器证书验证的CA文件存储位置。对应zabbix_server.conf中的SSLCALocation参数
/var/lib/zabbix/snmptraps 该卷用作snmptraps.logfile的存储位置。可与zabbix-snmptraps容器共享,并通过volumes_from Docker选项在创建新Zabbix server实例时继承。通过共享卷并将ZBX_ENABLE_SNMP_TRAPS环境变量设为'true'可启用SNMP trap处理功能
/var/lib/zabbix/mibs 该卷允许添加新MIB文件。不支持子目录,所有MIB必须放在/var/lib/zabbix/mibs目录下
Zabbix proxy
/usr/lib/zabbix/externalscripts 该卷被external checks使用。对应zabbix_proxy.conf中的ExternalScripts参数
/var/lib/zabbix/db_data/ 该卷允许将数据库文件存储在外置设备上。仅支持使用SQLite3的Zabbix proxy
/var/lib/zabbix/modules 该卷允许加载额外模块,并通过LoadModule功能扩展Zabbix server
/var/lib/zabbix/enc 该卷用于存储TLS相关文件。这些file名称通过ZBX_TLSCAFILEZBX_TLSCRLFILEZBX_TLSKEY_FILEZBX_TLSPSKFILE环境变量指定
/var/lib/zabbix/ssl/certs 该卷用作SSL客户端证书文件的存储位置。对应zabbix_proxy.conf中的SSLCertLocation参数
/var/lib/zabbix/ssl/keys 该卷用作SSL私钥文件的存储位置。对应zabbix_proxy.conf中的SSLKeyLocation参数
/var/lib/zabbix/ssl/ssl_ca 该卷用作SSL服务器证书验证的CA文件存储位置。对应zabbix_proxy.conf中的SSLCALocation参数
/var/lib/zabbix/snmptraps 该卷用作snmptraps.logfile的存储位置。可与zabbix-snmptraps容器共享,并通过volumes_from Docker选项在创建新Zabbix server实例时继承。通过共享卷并将ZBX_ENABLE_SNMP_TRAPS环境变量设为'true'可启用SNMP trap处理功能
/var/lib/zabbix/mibs 该卷允许添加新MIB文件。不支持子目录,所有MIB必须放在/var/lib/zabbix/mibs目录下
基于Apache2的Zabbix web界面
/etc/ssl/apache2 该卷允许为Zabbix web界面启用HTTPS。必须包含为Apache2 SSL连接准备的ssl.crtssl.key两个文件
基于nginx的Zabbix web界面
/etc/ssl/nginx 该卷允许为Zabbix web界面启用HTTPS。必须包含为nginx SSL连接准备的ssl.crtssl.key文件和dhparam.pem
Zabbix snmptraps
/var/lib/zabbix/snmptraps 该卷包含接收SNMP trap生成的snmptraps.log日志file
/var/lib/zabbix/mibs 该卷允许添加新MIB文件。不支持子目录,所有MIB必须放在/var/lib/zabbix/mibs目录下

更多信息请参考Docker Hub上的Zabbix官方仓库。

示例

示例1

该示例演示如何run支持MySQL数据库的Zabbix server,基于nginx网页服务器的Zabbix网页界面以及Zabbix Java网关。

1. 创建专用于Zabbix组件容器的网络:

docker network create --subnet 172.20.0.0/16 --ip-range 172.20.240.0/20 zabbix-net

2. 启动空的MySQL服务器实例

docker run --name mysql-server -t \
             -e MYSQL_DATABASE="zabbix" \
             -e MYSQL_USER="zabbix" \
             -e MYSQL_PASSWORD="zabbix_pwd" \
             -e MYSQL_ROOT_PASSWORD="root_pwd" \
             --network=zabbix-net \
             --restart unless-stopped \
             -d mysql:8.0 \
             --character-set-server=utf8 --collation-server=utf8_bin \
             --default-authentication-plugin=mysql_native_password

3. 启动Zabbix Java网关实例

docker run --name zabbix-java-gateway -t \
             --network=zabbix-net \
             --restart unless-stopped \
             -d zabbix/zabbix-java-gateway:alpine-6.0-latest

4. 启动Zabbix server实例并将其与已创建的MySQL服务器实例链接

docker run --name zabbix-server-mysql -t \
             -e DB_SERVER_HOST="mysql-server" \
             -e MYSQL_DATABASE="zabbix" \
             -e MYSQL_USER="zabbix" \
             -e MYSQL_PASSWORD="zabbix_pwd" \
             -e MYSQL_ROOT_PASSWORD="root_pwd" \
             -e ZBX_JAVAGATEWAY="zabbix-java-gateway" \
             --network=zabbix-net \
             -p 10051:10051 \
             --restart unless-stopped \
             -d zabbix/zabbix-server-mysql:alpine-6.0-latest

Zabbix server实例向主机机器暴露10051/TCP端口(Zabbix trapper)。

5. 启动Zabbix网页界面并将其与已创建的MySQL服务器和Zabbix server实例链接

docker run --name zabbix-web-nginx-mysql -t \
             -e ZBX_SERVER_HOST="zabbix-server-mysql" \
             -e DB_SERVER_HOST="mysql-server" \
             -e MYSQL_DATABASE="zabbix" \
             -e MYSQL_USER="zabbix" \
             -e MYSQL_PASSWORD="zabbix_pwd" \
             -e MYSQL_ROOT_PASSWORD="root_pwd" \
             --network=zabbix-net \
             -p 80:8080 \
             --restart unless-stopped \
             -d zabbix/zabbix-web-nginx-mysql:alpine-6.0-latest

Zabbix网页界面实例向主机机器暴露80/TCP端口(HTTP)。

示例2

该示例演示如何run支持PostgreSQL数据库的Zabbix server,基于nginx网页服务器的Zabbix网页界面以及SNMP trap功能。

1. 创建专用于Zabbix组件容器的网络:

docker network create --subnet 172.20.0.0/16 --ip-range 172.20.240.0/20 zabbix-net

2. 启动空的PostgreSQL服务器实例

docker run --name postgres-server -t \
             -e POSTGRES_USER="zabbix" \
             -e POSTGRES_PASSWORD="zabbix_pwd" \
             -e POSTGRES_DB="zabbix" \
             --network=zabbix-net \
             --restart unless-stopped \
             -d postgres:latest

3. 启动Zabbix snmptraps实例

docker run --name zabbix-snmptraps -t \
             -v /zbx_instance/snmptraps:/var/lib/zabbix/snmptraps:rw \
             -v /var/lib/zabbix/mibs:/usr/share/snmp/mibs:ro \
             --network=zabbix-net \
             -p 162:1162/udp \
             --restart unless-stopped \
             -d zabbix/zabbix-snmptraps:alpine-6.0-latest

Zabbix snmptrap实例向主机机器暴露162/UDP端口(SNMP traps)。

4. 启动Zabbix server实例并将其与已创建的PostgreSQL服务器实例链接

docker run --name zabbix-server-pgsql -t \
             -e DB_SERVER_HOST="postgres-server" \
             -e POSTGRES_USER="zabbix" \
             -e POSTGRES_PASSWORD="zabbix_pwd" \
             -e POSTGRES_DB="zabbix" \
             -e ZBX_ENABLE_SNMP_TRAPS="true" \
             --network=zabbix-net \
             -p 10051:10051 \
             --volumes-from zabbix-snmptraps \
             --restart unless-stopped \
             -d zabbix/zabbix-server-pgsql:alpine-6.0-latest

Zabbix server实例向主机机器暴露10051/TCP端口(Zabbix trapper)。

5. 启动Zabbix网页界面并将其与已创建的PostgreSQL服务器和Zabbix server实例链接

docker run --name zabbix-web-nginx-pgsql -t \
             -e ZBX_SERVER_HOST="zabbix-server-pgsql" \
             -e DB_SERVER_HOST="postgres-server" \
             -e POSTGRES_USER="zabbix" \
             -e POSTGRES_PASSWORD="zabbix_pwd" \
             -e POSTGRES_DB="zabbix" \
             --network=zabbix-net \
             -p 443:8443 \
             -p 80:8080 \
             -v /etc/ssl/nginx:/etc/ssl/nginx:ro \
             --restart unless-stopped \
             -d zabbix/zabbix-web-nginx-pgsql:alpine-6.0-latest

Zabbix网页界面实例向主机机器暴露443/TCP端口(HTTPS)。
目录/etc/ssl/nginx必须包含所需名称的证书。

示例3

该示例演示如何在Red Hat 8上使用podman来run支持MySQL数据库的Zabbix server,基于nginx网页服务器的Zabbix网页界面以及Zabbix Java网关。

1. 创建名为zabbix的新pod并暴露端口(网页界面、Zabbix server trapper):

podman pod create --name zabbix -p 80:8080 -p 10051:10051

2. (可选)在zabbix pod位置启动Zabbix agent容器:

podman run --name zabbix-agent \
           -e ZBX_SERVER_HOST="127.0.0.1,localhost" \
           --restart=always \
           --pod=zabbix \
           -d registry.connect.redhat.com/zabbix/zabbix-agent-60:latest

3. 在主机上创建./mysql/目录并启动Oracle MySQL服务器8.0:

podman run --name mysql-server -t \
             -e MYSQL_DATABASE="zabbix" \
             -e MYSQL_USER="zabbix" \
             -e MYSQL_PASSWORD="zabbix_pwd" \
             -e MYSQL_ROOT_PASSWORD="root_pwd" \
             -v ./mysql/:/var/lib/mysql/:Z \
             --restart=always \
             --pod=zabbix \
             -d mysql:8.0 \
             --character-set-server=utf8 --collation-server=utf8_bin \
             --default-authentication-plugin=mysql_native_password

4. 启动Zabbix server容器:

podman run --name zabbix-server-mysql -t \
                         -e DB_SERVER_HOST="127.0.0.1" \
                         -e MYSQL_DATABASE="zabbix" \
                         -e MYSQL_USER="zabbix" \
                         -e MYSQL_PASSWORD="zabbix_pwd" \
                         -e MYSQL_ROOT_PASSWORD="root_pwd" \
                         -e ZBX_JAVAGATEWAY="127.0.0.1" \
                         --restart=always \
                         --pod=zabbix \
                         -d registry.connect.redhat.com/zabbix/zabbix-server-mysql-60

5. 启动Zabbix Java网关容器:

podman run --name zabbix-java-gateway -t \
             --restart=always \
             --pod=zabbix \
             -d registry.connect.redhat.com/zabbix/zabbix-java-gateway-60

6. 启动Zabbix网页界面容器:

podman run --name zabbix-web-mysql -t \
                         -e ZBX_SERVER_HOST="127.0.0.1" \
                         -e DB_SERVER_HOST="127.0.0.1" \
                         -e MYSQL_DATABASE="zabbix" \
                         -e MYSQL_USER="zabbix" \
                         -e MYSQL_PASSWORD="zabbix_pwd" \
                         -e MYSQL_ROOT_PASSWORD="root_pwd" \
                         --restart=always \
                         --pod=zabbix \
                         -d registry.connect.redhat.com/zabbix/zabbix-web-mysql-60

Pod zabbixzabbix-web-mysql容器的8080/TCP向主机机器暴露80/TCP端口(HTTP)。

Docker Compose

Zabbix 还提供了用于在Docker中定义和运行多容器Zabbix组件的compose文件。这些compose文件可在github.com上的Zabbix官方docker仓库获取: https://github.com/zabbix/zabbix-docker。这些compose文件作为示例提供,它们是经过重载的。例如,它们包含同时支持MySQL和SQLite3的proxies。

存在几种不同版本的compose文件:

文件名 描述
docker-compose_v3_alpine_mysql_latest.yaml 该composefile在Alpine Linux上运行支持MySQL数据库的Zabbix 6.0组件最新version。
docker-compose_v3_alpine_mysql_local.yaml 该composefile本地构建Zabbix 6.0最新version并在Alpine Linux上运行支持MySQL数据库的Zabbix组件。
docker-compose_v3_alpine_pgsql_latest.yaml 该composefile在Alpine Linux上运行支持PostgreSQL数据库的Zabbix 6.0组件最新version。
docker-compose_v3_alpine_pgsql_local.yaml 该composefile本地构建Zabbix 6.0最新version并在Alpine Linux上运行支持PostgreSQL数据库的Zabbix组件。
docker-compose_v3_centos_mysql_latest.yaml 该composefile在CentOS 8上运行支持MySQL数据库的Zabbix 6.0组件最新version。
docker-compose_v3_centos_mysql_local.yaml 该composefile本地构建Zabbix 6.0最新version并在CentOS 8上运行支持MySQL数据库的Zabbix组件。
docker-compose_v3_centos_pgsql_latest.yaml 该composefile在CentOS 8上运行支持PostgreSQL数据库的Zabbix 6.0组件最新version。
docker-compose_v3_centos_pgsql_local.yaml 该composefile本地构建Zabbix 6.0最新version并在CentOS 8上运行支持PostgreSQL数据库的Zabbix组件。
docker-compose_v3_ubuntu_mysql_latest.yaml 该composefile在Ubuntu 20.04上运行支持MySQL数据库的Zabbix 6.0组件最新version。
docker-compose_v3_ubuntu_mysql_local.yaml 该composefile本地构建Zabbix 6.0最新version并在Ubuntu 20.04上运行支持MySQL数据库的Zabbix组件。
docker-compose_v3_ubuntu_pgsql_latest.yaml 该composefile在Ubuntu 20.04上运行支持PostgreSQL数据库的Zabbix 6.0组件最新version。
docker-compose_v3_ubuntu_pgsql_local.yaml 该composefile本地构建Zabbix 6.0最新version并在Ubuntu 20.04上运行支持PostgreSQL数据库的Zabbix组件。

可用的Docker compose文件支持Docker Compose的version 3版本。

存储

Compose文件配置为支持在一个主机机器上的本地存储 Docker Compose将在文件夹中create一个zbx_env目录 compose file 当您 run Zabbix组件时使用compose file。 目录将包含与上述相同的结构 部分及数据库存储目录

/etc/localtime 也存在只读模式的卷 /etc/timezone 文件

环境文件

在github.com上包含compose文件的同一目录中,您可以找到 每个compose组件file的默认环境变量文件。 这些环境文件命名格式为.env_<type of component>

示例

以下列出的命令适用于Docker Compose V2. 若您使用Docker Compose V1,请将docker compose -f替换为docker-compose -f

示例1

# git checkout 6.0
       # docker compose -f ./docker-compose_v3_alpine_mysql_latest.yaml up -d

该命令将下载Zabbix 6.0各组件的最新镜像,并以守护进程模式run它们。

请勿忘记从github.com官方Zabbix仓库下载包含compose文件的 .env_<type of component>文件。

示例2

# git checkout 6.0
       # docker compose -f ./docker-compose_v3_ubuntu_mysql_local.yaml up -d

该命令将下载Ubuntu 20.04 (focal)基础镜像,然后在本地构建Zabbix 6.0组件并以守护进程模式run它们。