[comment]: # ({e62e1497-e62e1497})
# 5 从容器安装

[comment]: # ({/e62e1497-e62e1497})

[comment]: # ({5f71f243-a3ac452e})
### 概述

本页面介绍如何使用 Docker 或 Docker Compose 部署 Zabbix。

[Docker Compose](#docker-compose) 是部署 Zabbix 的最快方式。
它会读取配置文件，并按正确顺序自动启动构成完整 Zabbix 环境的所有容器。

[Docker（手动部署）](#docker-manual-deployment) 通过逐步部署每个组件来实现相同的结果。

[comment]: # ({/5f71f243-a3ac452e})

[comment]: # ({b13b686a-fba82ded})
### 前提条件

在开始之前，请确保系统上已安装 Docker（1.12.0 或更高版本）。
如果尚未安装，请参阅 [Docker 安装指南](https://docs.docker.com/engine/install/)。
对于 Docker Compose 部署，还需要 Docker Compose（2.24.0 或更高版本）。

某些 Zabbix 组件要求运行 Docker 的主机上开放特定端口（例如，Zabbix 服务器使用 10051/TCP，SNMP trap 使用 162/UDP）。
有关 Zabbix 组件使用的端口完整列表，请参阅 [Requirements](/manual/installation/requirements#default-port-numbers)。
对于 Zabbix 服务器和 agent，可通过在相应容器上设置 `ZBX_LISTENPORT` 环境变量来更改默认端口。

[comment]: # ({/b13b686a-fba82ded})

[comment]: # ({6c7779eb-f9acea87})
### 可用的 Docker 镜像

Zabbix 为每个 Zabbix 组件都提供了一个 Docker 镜像，全部发布在 [Docker Hub](https://hub.docker.com/u/zabbix) 上。  
每个镜像用于创建一个运行相应组件的容器。

|Zabbix component|Docker image|
|--|--------|
|Agent|[zabbix/zabbix-agent](https://hub.docker.com/r/zabbix/zabbix-agent/)|
|Agent 2|[zabbix/zabbix-agent2](https://hub.docker.com/r/zabbix/zabbix-agent2)|
|服务器 (MySQL)|[zabbix/zabbix-server-mysql](https://hub.docker.com/r/zabbix/zabbix-server-mysql/)|
|服务器 (PostgreSQL)|[zabbix/zabbix-server-pgsql](https://hub.docker.com/r/zabbix/zabbix-server-pgsql/)|
|前端 (Apache + MySQL)|[zabbix/zabbix-web-apache-mysql](https://hub.docker.com/r/zabbix/zabbix-web-apache-mysql/)|
|前端 (Apache + PostgreSQL)|[zabbix/zabbix-web-apache-pgsql](https://hub.docker.com/r/zabbix/zabbix-web-apache-pgsql/)|
|前端 (Nginx + MySQL)|[zabbix/zabbix-web-nginx-mysql](https://hub.docker.com/r/zabbix/zabbix-web-nginx-mysql/)|
|前端 (Nginx + PostgreSQL)|[zabbix/zabbix-web-nginx-pgsql](https://hub.docker.com/r/zabbix/zabbix-web-nginx-pgsql/)|
|proxy (SQLite3)|[zabbix/zabbix-proxy-sqlite3](https://hub.docker.com/r/zabbix/zabbix-proxy-sqlite3/)|
|proxy (MySQL)|[zabbix/zabbix-proxy-mysql](https://hub.docker.com/r/zabbix/zabbix-proxy-mysql/)|
|Java 网关|[zabbix/zabbix-java-gateway](https://hub.docker.com/r/zabbix/zabbix-java-gateway/)|
|Web service|[zabbix/zabbix-web-service](https://hub.docker.com/r/zabbix/zabbix-web-service)|
|SNMP traps|[zabbix/zabbix-snmptraps](https://hub.docker.com/r/zabbix/zabbix-snmptraps/)|

::: noteclassic
要使用 [SNMP traps](/manual/config/items/itemtypes/snmptrap)，SNMP traps 容器必须与 Zabbix 服务器或 proxy 容器共享一个卷（请参见 Docker Hub 上的 [how to use this image](https://hub.docker.com/r/zabbix/zabbix-snmptraps#how-to-use-this-image) 以及下面的 [示例](#deploy-zabbix-server-postgresql-with-snmp-traps)）。
:::

Docker Hub 上所有 Zabbix 组件镜像都基于 [受支持操作系统](#image-tags) 的最新主版本。  
当底层操作系统镜像更新时，这些镜像会自动重新构建。

[comment]: # ({/6c7779eb-f9acea87})

[comment]: # ({c6474561-e498c2aa})
#### 镜像标签

每个镜像都支持使用标签来选择基础操作系统和 Zabbix 版本：

```default
zabbix/<image>:<os>-<version>
```

支持的 `<os>` 值：

-   `alpine` - Alpine Linux
-   `ubuntu` - Ubuntu
-   `centos` - CentOS Stream
-   `ol` - Oracle Linux
-   `ltsc2022` - Windows 11 LTSC 2022（仅适用于 Zabbix agent）

支持的 `<version>` 值：

-   `latest` - Alpine Linux 上最新的稳定版 Zabbix 版本
-   `<os>-latest` - 所选操作系统上最新的稳定版 Zabbix 版本
-   `<os>-trunk` - 所选操作系统上最新的开发版（nightly）构建
-   `<os>-X.X-latest` - 所选操作系统上某个特定 Zabbix 主版本的最新 Zabbix 次版本
-   `<os>-X.X.*` - 所选操作系统上某个特定的 Zabbix 次版本

示例：

```bash
# Alpine Linux 上最新的稳定版 Zabbix proxy (SQLite3):
docker pull zabbix/zabbix-proxy-sqlite3:latest

# Ubuntu 上最新的稳定版 Zabbix proxy (SQLite3):
docker pull zabbix/zabbix-proxy-sqlite3:ubuntu-latest

# Ubuntu 上最新的 Zabbix 服务器 (MySQL) 开发版（nightly）构建：
docker pull zabbix/zabbix-server-mysql:ubuntu-trunk

# Alpine Linux 上最新的 7.4 次版本 Zabbix 服务器 (MySQL)：
docker pull zabbix/zabbix-server-mysql:alpine-7.4-latest

# Alpine Linux 上 Zabbix 服务器 (MySQL) 的 7.4.1 版本：
docker pull zabbix/zabbix-server-mysql:alpine-7.4.1
```

[comment]: # ({/c6474561-e498c2aa})

[comment]: # ({4682295f-c443c22e})
### Docker Compose

Docker Compose 是部署 Zabbix 的最快方式。
它会读取配置文件（Compose 文件），并处理整个部署流程——拉取 Docker 镜像、在容器之间创建内部网络、设置存储、初始化数据库，以及按正确顺序启动所有组件。

[官方 Zabbix Dockerfiles](https://github.com/zabbix/zabbix-docker) 仓库提供了可直接使用的 Docker Compose 文件，以及基于 `.env` 的配置系统，支持不同的操作系统、数据库后端和 Zabbix 组件配置。

1\. 克隆仓库，进入该目录，并切换到 7.4 版本：

```bash
git clone https://github.com/zabbix/zabbix-docker.git
cd zabbix-docker
git checkout 7.4
```

2\. （可选）使用[环境变量](#environment-variables)自定义部署。
默认安装可以跳过此步骤。

3\. 部署默认安装——Zabbix 服务器、web 界面（运行在 Nginx 上）以及数据库后端（MySQL 或 PostgreSQL），它们分别运行在 Alpine Linux 上的独立容器中。

```bash
# 使用 MySQL 作为数据库：
docker compose -f ./compose.yaml up -d

# 使用 PostgreSQL 作为数据库：
docker compose -f ./compose_pgsql.yaml up -d
```

在容器启动并运行后（通常需要 1–3 分钟），Zabbix 服务器将启动，web 界面可通过 `http://localhost` 访问。

::: noteclassic
使用 `docker compose ps` 检查容器状态。
除 `zabbix-docker-server-db-init-1` 容器外，所有容器都应显示为 `Up` 状态。
如果有任何容器显示为 `Exited`，请使用 `docker logs -f <container-name>` 查看其日志以排查错误。
:::

[comment]: # ({/4682295f-c443c22e})

[comment]: # ({8b4e2b4d-de9f41d4})
#### 环境变量

Docker Compose 的行为和 Zabbix 组件配置都可以通过环境变量进行自定义。

**Compose 级变量**（在 [`.env` 文件](https://github.com/zabbix/zabbix-docker/blob/7.4/.env) 中定义）控制使用哪些 Docker 镜像、端口和网络 IP 范围。  
你可以在 `docker compose` 命令前直接内联使用这些变量，或者编辑 `.env` 文件。

例如，下面的命令使用基于 Ubuntu 的镜像（而不是默认的 Alpine Linux）部署一个完整的多容器 Zabbix 环境，并通过 Nginx 以自定义 HTTP（8282）和 HTTPS（8443）端口暴露 web 前端：

```bash
OS=ubuntu \
ZABBIX_WEB_NGINX_HTTP_PORT=8282 \
ZABBIX_WEB_NGINX_HTTPS_PORT=8443 \
docker compose -f ./compose.yaml up -d
```

**组件级变量**（在 [`env_vars/.env_<component>`](https://github.com/zabbix/zabbix-docker/blob/7.4/env_vars/) 文件中定义）控制 Zabbix 组件配置。  
在运行 `docker compose` 命令之前，请编辑相应的 `.env_<component>` 文件。

例如，你可以通过编辑以下变量来调整 Zabbix 服务器被动轮询器数量和缓存设置，以及配置 web 前端时区：

```ini
# env_vars/.env_srv
ZBX_STARTPOLLERS=20
ZBX_CACHESIZE=64M
ZBX_HISTORYCACHESIZE=32M

# env_vars/.env_web
PHP_TZ=Europe/Paris
```

::: noteclassic
组件级环境变量使用不同的命名方式，对应 Zabbix 组件配置参数（例如，`ZBX_STARTPOLLERS` 对应 [`StartPollers`](/manual/appendix/config/zabbix_server#startpollers)）。  
有些变量是 Docker 特有的，有些配置参数无法更改（例如 `PIDFile` 和 `LogType`）。  
使用环境变量时，请参阅 Docker Hub 上每个组件 [Docker 镜像](#available-docker-images) 说明中的 *Environment variables* 部分。
:::

[comment]: # ({/8b4e2b4d-de9f41d4})

[comment]: # ({15680aeb-7d10f7dc})
#### 卷

Docker Compose 将持久数据存储在与 Compose 文件并列创建的 `zbx_env/` 目录中。
该目录可在容器重启和更新期间保留各组件的数据。

`zbx_env/` 的内容针对每个组件的镜像预先定义。例如：

-   `zbx_env/etc/` - 供 [Zabbix web interface container](https://hub.docker.com/r/zabbix/zabbix-web-nginx-mysql#allowed-volumes-for-the-zabbix-web-interface-container) 使用
-   `zbx_env/usr/` 和 `zbx_env/var/` - 供 [Zabbix 服务器容器](https://hub.docker.com/r/zabbix/zabbix-server-mysql#allowed-volumes-for-the-zabbix-server-container) 使用

有关每个卷的更多信息，请参阅 Docker Hub 上各组件 [Docker 镜像](#available-docker-images) 描述中的 *Allowed volumes* 部分。

[comment]: # ({/15680aeb-7d10f7dc})

[comment]: # ({d348b483-fb9850d6})
#### Makefile

Zabbix Dockerfiles 仓库还提供了一个 [Makefile](https://github.com/zabbix/zabbix-docker/blob/7.4/Makefile)，可作为常见 Docker Compose 任务的快捷方式。  
你可以使用更简短的 `make` 命令，而不是完整的 `docker compose` 命令（运行 `make help` 查看可用选项）：

```bash
# 默认部署（Zabbix 服务器、web 界面、MySQL，全部基于 Alpine Linux）
make up

# 自定义部署（Zabbix 服务器、带自定义 Nginx 端口的 web 界面、PostgreSQL，全部基于 Ubuntu）
make up \
  OS=ubuntu \
  DB=pgsql \
  ZABBIX_WEB_NGINX_HTTP_PORT=8282 \
  ZABBIX_WEB_NGINX_HTTPS_PORT=8443
```

::: noteimportant
在停止或删除容器时，务必指定与已部署环境相同的数据库类型（例如，`make down DB=pgsql`）。
:::

默认情况下，`make up` 只启动最少的一组服务（Zabbix 服务器、web 界面和数据库）。  
这样可以保持部署轻量，并避免启动可能不需要的组件。  
如需包含其他组件，可以使用以下 [Compose 配置文件](https://docs.docker.com/compose/how-tos/profiles/)：

```bash
# 默认部署 + Zabbix agent、Java 网关、web 服务和 SNMP traps：
make up COMPOSE_PROFILES=full

# COMPOSE_PROFILES=full + Zabbix proxy（MySQL 和 SQLite3）：
make up COMPOSE_PROFILES=all
```

[comment]: # ({/d348b483-fb9850d6})

[comment]: # ({1e7c08b2-0b4b68c7})
### Docker（手动部署）

当你希望逐步部署 Zabbix、运行各个独立组件、将其与现有环境集成，或使用其他容器运行时（例如 Podman）时，请使用手动部署。

例如，要部署一个 Zabbix proxy，请运行以下命令：

```bash
docker run --name zabbix-proxy-sqlite3 \
  -e ZBX_SERVER_HOST=192.0.2.1 \
  -e ZBX_PROXYMODE=0 \
  -e ZBX_HOSTNAME=zabbix-proxy-sqlite3 \
  -v zabbix-proxy-data:/var/lib/zabbix/db_data \
  --init \
  -d \
  zabbix/zabbix-proxy-sqlite3:alpine-7.4-latest
```

此命令会：

-   拉取 `zabbix/zabbix-proxy-sqlite3:alpine-7.4-latest` [Docker 镜像](#available-docker-images)。

-   基于该 Docker 镜像创建并启动一个 `zabbix-proxy-sqlite3` 容器（使用 [`--init`](https://docs.docker.com/reference/cli/docker/container/run/#init) 和 [`-d`](https://docs.docker.com/reference/cli/docker/container/run/#detach) 标志）。

-   通过 `ZBX_SERVER_HOST` 环境变量配置 Zabbix proxy 的 [`Server`](/manual/appendix/config/zabbix_proxy#server) 参数。
    该参数指定 Zabbix 服务器的 IP 地址，proxy 将从该服务器获取配置数据，并向其发送收集到的数据。
    请注意，主动 proxy 运行所需的其他变量使用默认值，因此可以省略。

::: noteclassic
环境变量通过不同的命名方式对应 Zabbix 组件的配置参数（例如，`ZBX_SERVER_HOST` 对应 [`Server`](/manual/appendix/config/zabbix_proxy#server)）。
其中一些变量是 Docker 特有的，而某些配置参数无法更改（例如，`PIDFile` 和 `LogType`）。
使用环境变量时，请参阅 Docker Hub 上各组件 [Docker 镜像](#available-docker-images)说明中的 *Environment variables* 部分。
:::

-   将 Docker 管理的存储位置（例如 `/var/lib/docker/volumes/zabbix-proxy-data/`）连接到容器的 `/var/lib/zabbix` 目录，以便即使容器被移除，Zabbix proxy 数据也能永久保存。

::: noteclassic
有关每个卷的更多信息，请参阅 Docker Hub 上各组件 [Docker 镜像](#available-docker-images)说明中的 *Allowed volumes* 部分。
:::

部署 Zabbix proxy 容器后，你可以继续在 Zabbix 前端中[添加 proxy](/manual/distributed_monitoring/proxies#configuration)，并[配置主机](/manual/config/hosts/host#configuration)由该 proxy 进行监控。

下面的示例涵盖另外三种部署场景：

-   Zabbix 服务器（MySQL）与 Java 网关
-   Zabbix 服务器（PostgreSQL）与 SNMP traps
-   Zabbix 服务器（MySQL）与运行在 RHEL 8–10 上的 Java 网关

更多示例，请参阅 Docker Hub 上各组件的 [Docker 镜像](#available-docker-images)说明。

[comment]: # ({/1e7c08b2-0b4b68c7})

[comment]: # ({94c6ca20-492bd3ba})
#### 使用 Java 网关部署 Zabbix 服务器（MySQL）

此示例展示了如何部署一个带有 MySQL 后端、用于 [JMX 监控](/manual/config/items/itemtypes/jmx_monitoring) 的 Java 网关，以及基于 Nginx 的 web 界面的 Zabbix 服务器。

1\. 创建一个专用的 Docker 网络，以便所有 Zabbix 组件容器都可以通过容器名相互访问：

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

2\. 运行一个空的 MySQL 服务器容器（将 `zabbix_pwd` 和 `root_pwd` 替换为强密码，并在后续步骤中使用这些值）：

```bash
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-oracle \
  --character-set-server=utf8mb4 --collation-server=utf8mb4_bin
```

3\. 查看 MySQL 日志，等待 MySQL 准备好接受连接（使用 `Ctrl+C` 退出日志）：

```bash
docker logs -f mysql-server

# ... [Server] /usr/sbin/mysqld: ready for connections. ...
```

4\. 运行一个 Zabbix Java 网关容器：

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

5\. 在 MySQL 服务器容器中启用 `log_bin_trust_function_creators`。
这会临时放宽对存储函数的安全限制；该设置会在后续步骤中禁用。
它允许 Zabbix 数据库用户在未授予 `SUPER` 权限的情况下创建存储函数，而在启用 [二进制日志](https://dev.mysql.com/doc/refman/8.0/en/stored-programs-logging.html) 时，MySQL 需要该权限（MySQL 8.0 起默认启用）。
运行以下命令：

```bash
docker exec -it mysql-server mysql -u root -p'root_pwd' \
  -e "SET GLOBAL log_bin_trust_function_creators = 1;"
```

6\. 运行一个 Zabbix 服务器容器，并将其连接到 Java 网关和 MySQL 服务器容器：

```bash
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 ZBX_JAVAGATEWAY="zabbix-java-gateway" \
  --network=zabbix-net \
  -p 10051:10051 \
  --restart unless-stopped \
  --init \
  -d zabbix/zabbix-server-mysql:alpine-7.4-latest
```

7\. 查看 Zabbix 服务器日志，等待 Zabbix 服务器完成数据库模式初始化（使用 `Ctrl+C` 退出日志）：

```bash
docker logs -f zabbix-server-mysql

# ... [info]: ** Creating 'zabbix' schema in MySQL
# ... [info]: ** Database schema successfully created!
```

8\. 在 MySQL 服务器容器中禁用 `log_bin_trust_function_creators`。
这会重新启用安全限制，阻止非 SUPER 用户创建存储函数。
运行以下命令：

```bash
docker exec -it mysql-server mysql -u root -p'root_pwd' \
  -e "SET GLOBAL log_bin_trust_function_creators = 0;"
```

9\. 运行一个 Zabbix web 界面容器，并将其连接到 Zabbix 服务器和 MySQL 服务器容器：

```bash
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 PHP_TZ="Europe/Riga" \
  --network=zabbix-net \
  -p 80:8080 \
  --restart unless-stopped \
  -d zabbix/zabbix-web-nginx-mysql:alpine-7.4-latest
```

容器启动并运行后，Zabbix 服务器将启动，web 界面可通过 `http://localhost` 访问。

::: noteclassic
使用 `docker ps` 检查容器状态。
所有容器都应处于 `Up` 状态。
如果有任何容器显示为 `Exited`，请使用 `docker logs -f <container-name>` 检查其日志中的错误。
:::

#### 使用 SNMP trap 部署 Zabbix 服务器（PostgreSQL）

此示例展示了如何部署一个带有 PostgreSQL 后端、[SNMP trap](/manual/config/items/itemtypes/snmptrap) 和基于 Nginx 的 web 界面的 Zabbix 服务器。

1\. 创建一个专用的 Docker 网络，以便所有 Zabbix 组件容器都可以通过容器名相互访问：

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

2\. 运行一个空的 PostgreSQL 服务器容器（将 `zabbix_pwd` 替换为强密码，并在后续步骤中使用该值）：

```bash
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 SNMP trap 容器：

```bash
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-7.4-latest
```

4\. 运行一个 Zabbix 服务器容器，并将其连接到 PostgreSQL 服务器和 SNMP trap 容器：

```bash
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 \
  --init \
  -d zabbix/zabbix-server-pgsql:alpine-7.4-latest
```

5\. 查看 Zabbix 服务器日志，等待 Zabbix 服务器完成数据库模式初始化（使用 `Ctrl+C` 退出日志）：

```bash
docker logs -f zabbix-server-pgsql

# ... [info]: ** Creating 'zabbix' schema in PostgreSQL
# ... [info]: ** Database schema successfully created!
```

6\. 运行一个 Zabbix web 界面容器，并将其连接到 Zabbix 服务器和 PostgreSQL 服务器容器：

```bash
docker run --name zabbix-web-nginx-pgsql -t \
  -e ZBX_SERVER_HOST="zabbix-server-pgsql" \
  -e DB_SERVER_HOST="postgres-server" \
  -e POSTGRES_DB="zabbix" \
  -e POSTGRES_USER="zabbix" \
  -e POSTGRES_PASSWORD="zabbix_pwd" \
  -e PHP_TZ="Europe/Riga" \
  --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-7.4-latest
```

容器启动并运行后，Zabbix 服务器将启动，web 界面可通过 `http://localhost` 访问。

::: noteclassic
使用 `docker ps` 检查容器状态。
所有容器都应处于 `Up` 状态。
如果有任何容器显示为 `Exited`，请使用 `docker logs -f <container-name>` 检查其日志中的错误。
:::

#### 在 RHEL 8–10 上使用 Java 网关部署 Zabbix 服务器（MySQL）

此示例展示了如何在 Red Hat Enterprise Linux 8、9 或 10 上部署一个带有 MySQL 后端、用于 [JMX 监控](/manual/config/items/itemtypes/jmx_monitoring) 的 Java 网关，以及基于 Nginx 的 web 界面的 Zabbix 服务器。

在 Red Hat Enterprise Linux 上，推荐使用 Podman 作为容器运行时，而不是 Docker。
Podman 的工作方式与 Docker 类似，但不需要以 root 身份运行后台服务，因此更适合 Red Hat 环境。

1\. 创建一个名为 `zabbix` 的新 pod，并为 Zabbix web 界面和 Zabbix 服务器 trapper 暴露端口：

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

2\. （可选）在 `zabbix` pod 中运行一个 Zabbix agent 容器：

```bash
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-74:latest
```

3\. 在 RHEL 主机上创建 `./mysql/` 目录：

```bash
mkdir -p ./mysql
```

4\. 运行一个空的 MySQL 服务器容器（将 `zabbix_pwd` 和 `root_pwd` 替换为强密码，并在后续步骤中使用这些值）：

```bash
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=utf8mb4 --collation-server=utf8mb4_bin
```

5\. 查看 MySQL 日志，等待 MySQL 准备好接受连接（使用 `Ctrl+C` 退出日志）：

```bash
podman logs -f mysql-server

# ... [Server] /usr/sbin/mysqld: ready for connections. ...
```

6\. 运行一个 Zabbix Java 网关容器：

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

7\. 在 MySQL 服务器容器中启用 `log_bin_trust_function_creators`。
这会临时放宽对存储函数的安全限制；该设置会在后续步骤中禁用。
它允许 Zabbix 数据库用户在未授予 `SUPER` 权限的情况下创建存储函数，而在启用 [二进制日志](https://dev.mysql.com/doc/refman/8.0/en/stored-programs-logging.html) 时，MySQL 需要该权限（MySQL 8.0 起默认启用）。
运行以下命令：

```bash
podman exec -it mysql-server mysql -u root -p'root_pwd' \
  -e "SET GLOBAL log_bin_trust_function_creators = 1;"
```

8\. 运行一个 Zabbix 服务器容器，并将其连接到 Java 网关和 MySQL 服务器容器：

```bash
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 ZBX_JAVAGATEWAY="127.0.0.1" \
  --restart=always \
  --init \
  --pod=zabbix \
  -d registry.connect.redhat.com/zabbix/zabbix-server-mysql-74
```

9\. 查看 Zabbix 服务器日志，等待 Zabbix 服务器完成数据库模式初始化（使用 `Ctrl+C` 退出日志）：

```bash
podman logs -f zabbix-server-mysql

# ... [info]: ** Creating 'zabbix' schema in MySQL
# ... [info]: ** Database schema successfully created!
```

10\. 在 MySQL 服务器容器中禁用 `log_bin_trust_function_creators`。
这会重新启用安全限制，阻止非 SUPER 用户创建存储函数。
运行以下命令：

```bash
podman exec -it mysql-server mysql -u root -p'root_pwd' \
  -e "SET GLOBAL log_bin_trust_function_creators = 0;"
```

11\. 运行一个 Zabbix web 界面容器，并将其连接到 Zabbix 服务器和 MySQL 服务器容器：

```bash
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 PHP_TZ="Europe/Riga" \
  --restart=always \
  --pod=zabbix \
  -d registry.connect.redhat.com/zabbix/zabbix-web-mysql-74
```

::: noteclassic
pod `zabbix` 会将 `zabbix-web-mysql` 容器的 `8080/TCP` 端口映射到主机上的 `80/TCP` 端口（HTTP）。
:::

容器启动并运行后，Zabbix 服务器将启动，web 界面可通过 `http://localhost` 访问。

::: noteclassic
使用 `docker ps` 检查容器状态。
所有容器都应处于 `Up` 状态。
如果有任何容器显示为 `Exited`，请使用 `docker logs -f <container-name>` 检查其日志中的错误。
:::

[comment]: # ({/94c6ca20-492bd3ba})
