Instalación desde contenedores

Descripción general

Esta página describe cómo desplegar Zabbix usando Docker o Docker Compose.

Docker Compose es la forma más rápida de desplegar Zabbix. Lee un archivo de configuración e inicia automáticamente todos los contenedores que componen una instalación completa de Zabbix, en el orden correcto.

Docker (despliegue manual) logra el mismo resultado desplegando cada componente paso a paso.

Desde Zabbix 6.0, los triggers deterministas deben crearse durante la instalación. Si el registro binario está habilitado para MySQL/MariaDB, esto requiere privilegios de superusuario o establecer la variable/parámetro de configuración log_bin_trust_function_creators = 1. Consulte Scripts de creación de base de datos para obtener instrucciones sobre cómo establecer la variable.

Tenga en cuenta que, si se ejecuta desde una consola, la variable solo se establecerá temporalmente y se perderá cuando se reinicie Docker. En este caso, mantenga su servicio SQL en ejecución; detenga solo el servicio zabbix-server ejecutando docker compose down zabbix-server y luego docker compose up -d zabbix-server.

Como alternativa, puede establecer esta variable en el archivo de configuración.

Requisitos previos

Antes de comenzar, asegúrese de que Docker (1.12.0 o posterior) esté instalado en su sistema. Si no es así, siga la guía de instalación de Docker. Para la implementación con Docker Compose, también se requiere Docker Compose (2.24.0 o posterior).

Algunos componentes de Zabbix requieren que determinados puertos estén abiertos en el host que ejecuta Docker (por ejemplo, 10051/TCP para Zabbix server, 162/UDP para traps SNMP). Consulte Requisitos para ver una lista completa de los puertos utilizados por los componentes de Zabbix. Para Zabbix server y agent, el puerto predeterminado puede cambiarse configurando la variable de entorno ZBX_LISTENPORT en el contenedor correspondiente.

Imágenes Docker disponibles

Zabbix proporciona una imagen Docker para cada componente de Zabbix, todas publicadas en Docker Hub. Cada imagen se utiliza para crear un contenedor que ejecuta ese componente.

Componente de Zabbix Imagen Docker
agent zabbix/zabbix-agent
Agent 2 zabbix/zabbix-agent2
server (MySQL) zabbix/zabbix-server-mysql
server (PostgreSQL) zabbix/zabbix-server-pgsql
Interfaz web (Apache + MySQL) zabbix/zabbix-web-apache-mysql
Interfaz web (Apache + PostgreSQL) zabbix/zabbix-web-apache-pgsql
Interfaz web (Nginx + MySQL) zabbix/zabbix-web-nginx-mysql
Interfaz web (Nginx + PostgreSQL) zabbix/zabbix-web-nginx-pgsql
proxy (SQLite3) zabbix/zabbix-proxy-sqlite3
proxy (MySQL) zabbix/zabbix-proxy-mysql
Java gateway zabbix/zabbix-java-gateway
Servicio web zabbix/zabbix-web-service
Trampas SNMP zabbix/zabbix-snmptraps

Para utilizar trampas SNMP, el contenedor de trampas SNMP debe compartir un volumen con el contenedor de Zabbix server o proxy (consulte cómo usar esta imagen en Docker Hub y el ejemplo a continuación).

Todas las imágenes de componentes de Zabbix en Docker Hub se basan en las últimas versiones principales de los sistemas operativos compatibles. Estas imágenes se reconstruyen automáticamente cuando se actualizan las imágenes del sistema operativo subyacente.

Etiquetas de imagen

Cada imagen admite etiquetas para seleccionar el sistema operativo base y la versión de Zabbix:

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

Valores <os> admitidos:

  • alpine - Alpine Linux
  • ubuntu - Ubuntu
  • centos - CentOS Stream
  • ol - Oracle Linux
  • ltsc2022 - Windows 11 LTSC 2022 (solo Zabbix agent)

Valores <version> admitidos:

  • latest - La última versión estable de Zabbix en Alpine Linux
  • <os>-latest - La última versión estable de Zabbix en el SO seleccionado
  • <os>-trunk - La compilación de desarrollo (nightly) más reciente en el SO seleccionado
  • <os>-X.X-latest - La última versión menor de Zabbix de una versión mayor específica de Zabbix en el SO seleccionado
  • <os>-X.X.* - Una versión menor específica de Zabbix en el SO seleccionado

Ejemplos:

# Último Zabbix proxy estable (SQLite3) en Alpine Linux:
docker pull zabbix/zabbix-proxy-sqlite3:latest

# Último Zabbix proxy estable (SQLite3) en Ubuntu:
docker pull zabbix/zabbix-proxy-sqlite3:ubuntu-latest

# Compilación de desarrollo (nightly) más reciente de Zabbix server (MySQL) en Ubuntu:
docker pull zabbix/zabbix-server-mysql:ubuntu-trunk

# Última versión menor 8.0 de Zabbix server (MySQL) en Alpine Linux:
docker pull zabbix/zabbix-server-mysql:alpine-8.0-latest

# Versión 8.0.1 de Zabbix server (MySQL) en Alpine Linux:
docker pull zabbix/zabbix-server-mysql:alpine-8.0.1

Docker Compose

Docker Compose es la forma más rápida de desplegar Zabbix. Lee un archivo de configuración (archivo Compose) y gestiona toda la configuración: descarga las imágenes de Docker, crea una red interna entre contenedores, configura el almacenamiento, inicializa la base de datos e inicia todo en el orden correcto.

El repositorio official Zabbix Dockerfiles proporciona archivos Docker Compose listos para usar y un sistema de configuración basado en .env que admite distintos sistemas operativos, backends de base de datos y la configuración de componentes de Zabbix.

1. Clone el repositorio, navegue hasta él y cambie a la versión 8.0:

git clone https://github.com/zabbix/zabbix-docker.git
cd zabbix-docker
git checkout 8.0

2. (Opcional) Personalice el despliegue con variables de entorno. Este paso puede omitirse para una configuración predeterminada.

3. Despliegue la configuración predeterminada: Zabbix server, la interfaz web (ejecutándose en Nginx) y un backend de base de datos (MySQL o PostgreSQL), cada uno ejecutándose en su propio contenedor sobre Alpine Linux.

# Con MySQL como base de datos:
docker compose -f ./compose.yaml up -d

# Con PostgreSQL como base de datos:
docker compose -f ./compose_pgsql.yaml up -d

Una vez que los contenedores estén activos y en ejecución (normalmente en 1–3 minutos), Zabbix server se iniciará y la interfaz web estará disponible en http://localhost.

Use docker compose ps para comprobar el estado de los contenedores. Todos los contenedores (excepto el contenedor zabbix-docker-server-db-init-1) deberían tener el estado Up. Si alguno muestra Exited, revise sus registros con docker logs <container-name>.

Variables de entorno

Tanto el comportamiento de Docker Compose como la configuración de los componentes de Zabbix pueden personalizarse mediante variables de entorno.

Las variables a nivel de Compose (definidas en el archivo .env) controlan qué imágenes de Docker, puertos y rangos de IP de red se utilizan. Puede usar estas variables en línea antes del comando docker compose, o editar el archivo .env.

Por ejemplo, el siguiente comando despliega una configuración completa de Zabbix con varios contenedores utilizando una imagen basada en Ubuntu (en lugar de Alpine Linux, que es la predeterminada) y exponiendo la interfaz web mediante Nginx en puertos HTTP (8282) y HTTPS (8443) personalizados:

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

Las variables a nivel de componente (definidas en los archivos env_vars/.env_<component>) controlan la configuración de los componentes de Zabbix. Edite el archivo .env_<component> correspondiente antes de ejecutar el comando docker compose.

Por ejemplo, puede ajustar el número de pollers pasivos de Zabbix server y la configuración de caché, así como configurar la zona horaria de la interfaz web editando las siguientes variables:

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

# env_vars/.env_web
PHP_TZ=Europe/Paris

Las variables de entorno a nivel de componente corresponden a los parámetros de configuración de los componentes de Zabbix usando un estilo de nomenclatura diferente (por ejemplo, ZBX_STARTPOLLERS corresponde a StartPollers). Algunas variables son específicas de Docker, y algunos parámetros de configuración no pueden cambiarse (por ejemplo, PIDFile y LogType). Al usar variables de entorno, consulte la sección Variables de entorno en la descripción de la imagen de Docker de cada componente en Docker Hub.

Volúmenes

Docker Compose almacena los datos persistentes en el directorio zbx_env/, creado junto al archivo Compose. Este directorio conserva los datos de los componentes entre reinicios y actualizaciones de los contenedores.

El contenido de zbx_env/ está predefinido para la imagen de cada componente. Por ejemplo:

Para obtener más información sobre cada volumen, consulte la sección Allowed volumes en la descripción de la imagen de Docker de cada componente en Docker Hub.

Makefile

El repositorio de Dockerfiles de Zabbix también proporciona un Makefile como acceso directo para tareas comunes de Docker Compose. En lugar de usar el comando completo docker compose, puede usar comandos make más cortos (ejecute make help para ver las opciones disponibles):

# Despliegue predeterminado (Zabbix server, interfaz web, MySQL, todo en Alpine Linux)
make up

# Despliegue personalizado (Zabbix server, interfaz web con puertos Nginx personalizados, PostgreSQL, todo en Ubuntu)
make up \
  OS=ubuntu \
  DB=pgsql \
  ZABBIX_WEB_NGINX_HTTP_PORT=8282 \
  ZABBIX_WEB_NGINX_HTTPS_PORT=8443

Al detener o eliminar contenedores, especifique siempre el mismo tipo de base de datos que se desplegó (por ejemplo, make down DB=pgsql).

De forma predeterminada, make up inicia solo un conjunto mínimo de servicios (Zabbix server, interfaz web y base de datos). Esto mantiene la configuración ligera y evita iniciar componentes que pueden no ser necesarios. Para incluir componentes adicionales, puede usar los siguientes perfiles de Compose:

# Despliegue predeterminado + Zabbix agent, Java gateway, servicio web y traps SNMP:
make up COMPOSE_PROFILES=full

# COMPOSE_PROFILES=full + Zabbix proxy (MySQL y SQLite3):
make up COMPOSE_PROFILES=all

Docker (despliegue manual)

Utilice el despliegue manual cuando desee desplegar Zabbix paso a paso, ejecutar componentes individuales, integrarlos con un entorno existente o usar un entorno de ejecución de contenedores alternativo, como Podman.

Por ejemplo, para desplegar un proxy de Zabbix, ejecute el siguiente comando:

docker run --name zabbix-proxy-sqlite3 \
  -e ZBX_SERVER_HOST=192.0.2.0 \
  -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-8.0-latest

Este comando:

  • Descarga la imagen de Docker zabbix/zabbix-proxy-sqlite3:alpine-8.0-latest.

  • Crea e inicia un contenedor zabbix-proxy-sqlite3 basado en la imagen de Docker (con las opciones --init y -d).

  • Configura el parámetro Server del proxy de Zabbix mediante la variable de entorno ZBX_SERVER_HOST. Este parámetro especifica la dirección IP del server de Zabbix desde la que el proxy recuperará los datos de configuración y a la que enviará los datos recopilados. Tenga en cuenta que otras variables necesarias para el funcionamiento del proxy activo usan valores predeterminados y pueden omitirse.

Las variables de entorno corresponden a los parámetros de configuración de los componentes de Zabbix, pero usan un estilo de nomenclatura diferente (por ejemplo, ZBX_SERVER_HOST corresponde a Server). Algunas variables son específicas de Docker y algunos parámetros de configuración no pueden modificarse (por ejemplo, PIDFile y LogType). Al usar variables de entorno, consulte la sección Environment variables en la descripción de la imagen de Docker de cada componente en Docker Hub.

  • Conecta una ubicación de almacenamiento gestionada por Docker (por ejemplo, /var/lib/docker/volumes/zabbix-proxy-data/) al directorio /var/lib/zabbix del contenedor para que los datos del proxy de Zabbix se almacenen de forma permanente, incluso si se elimina el contenedor.

Para obtener más información sobre cada volumen, consulte la sección Allowed volumes en la descripción de la imagen de Docker de cada componente en Docker Hub.

Después de desplegar el contenedor del proxy de Zabbix, puede continuar con agregar el proxy en su frontend de Zabbix y configurar hosts para que sean monitorizados por este proxy.

Los ejemplos siguientes cubren tres escenarios de despliegue adicionales:

  • server de Zabbix (MySQL) con Java gateway
  • server de Zabbix (PostgreSQL) con traps SNMP
  • server de Zabbix (MySQL) con Java gateway en RHEL 8

Para ver más ejemplos, consulte la descripción de la imagen de Docker de cada componente en Docker Hub.

Desplegar Zabbix server (MySQL) con Java gateway

Este ejemplo muestra cómo desplegar un Zabbix server con un backend MySQL, un Java gateway para la monitorización JMX y una interfaz web basada en Nginx.

1. Cree una red Docker dedicada, para que todos los contenedores de componentes de Zabbix puedan comunicarse entre sí por nombre de contenedor:

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

2. Ejecute un contenedor de servidor MySQL vacío (reemplace zabbix_pwd y root_pwd por contraseñas seguras):

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.4-oracle \
  --character-set-server=utf8mb4 --collation-server=utf8mb4_bin \
  --authentication-policy=caching_sha2_password

MySQL debe estar completamente inicializado antes de ejecutar el contenedor de Zabbix server en el paso 4; de lo contrario, es posible que el esquema de Zabbix no se cargue correctamente. Para confirmar que MySQL está listo, ejecute docker logs mysql-server y continúe solo cuando vea /usr/sbin/mysqld: ready for connections.

3. Ejecute un contenedor de Zabbix Java gateway:

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

4. Ejecute un contenedor de Zabbix server y vincúlelo al contenedor del servidor MySQL (reemplace zabbix_pwd y root_pwd por las mismas contraseñas utilizadas en el paso 2):

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-8.0-latest

Después de ejecutar el contenedor de Zabbix server, espere a que Zabbix server termine de inicializar el esquema de la base de datos. Para confirmar que está listo, ejecute docker logs zabbix-server-mysql y continúe solo cuando ya no vea Creating 'zabbix' schema in MySQL.

5. Ejecute un contenedor de interfaz web de Zabbix y vincúlelo a los contenedores de Zabbix server y del servidor MySQL (reemplace zabbix_pwd y root_pwd por las mismas contraseñas utilizadas en el paso 2):

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-8.0-latest

Después de que los contenedores estén activos y en ejecución (normalmente en 1–3 minutos), Zabbix server se iniciará y la interfaz web estará disponible en http://localhost.

Desplegar Zabbix server (PostgreSQL) con traps SNMP

Este ejemplo muestra cómo desplegar un Zabbix server con un backend PostgreSQL, traps SNMP y una interfaz web basada en Nginx.

1. Cree una red Docker dedicada, para que todos los contenedores de componentes de Zabbix puedan comunicarse entre sí por nombre de contenedor:

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

2. Ejecute un contenedor de servidor PostgreSQL vacío (reemplace zabbix_pwd por una contraseña segura):

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. Ejecute un contenedor de traps SNMP de Zabbix:

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-8.0-latest

4. Ejecute un contenedor de Zabbix server, vincúlelo al contenedor del servidor PostgreSQL y al contenedor de traps SNMP (reemplace zabbix_pwd por la misma contraseña utilizada en el paso 2):

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-8.0-latest

Después de ejecutar el contenedor de Zabbix server, espere a que Zabbix server termine de inicializar el esquema de la base de datos. Para confirmar que está listo, ejecute docker logs zabbix-server-pgsql y continúe solo cuando ya no vea Creating 'zabbix' schema in PostgreSQL.

5. Ejecute un contenedor de interfaz web de Zabbix y vincúlelo a los contenedores de Zabbix server y del servidor PostgreSQL (reemplace zabbix_pwd por la misma contraseña utilizada en el paso 2):

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-8.0-latest

Después de que los contenedores estén activos y en ejecución (normalmente en 1–3 minutos), Zabbix server se iniciará y la interfaz web estará disponible en http://localhost.

Desplegar Zabbix server (MySQL) con Java gateway en RHEL 8–10

Este ejemplo muestra cómo desplegar un Zabbix server con un backend MySQL, un Java gateway para la monitorización JMX y una interfaz web basada en Nginx, todo ello ejecutándose en Red Hat Enterprise Linux 8, 9 o 10.

En Red Hat Enterprise Linux, el entorno de ejecución de contenedores recomendado es Podman en lugar de Docker. Podman funciona de forma similar a Docker, pero no requiere un servicio en segundo plano ejecutándose como root, lo que lo hace más adecuado para entornos Red Hat.

1. Cree un nuevo pod con el nombre zabbix y puertos expuestos para la interfaz web de Zabbix y el trapper de Zabbix server:

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

2. (Opcional) Ejecute un contenedor de Zabbix agent en la ubicación del pod zabbix:

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-80:latest

3. Cree un directorio ./mysql/ en el host RHEL:

mkdir -p ./mysql

4. Ejecute un contenedor de servidor MySQL vacío (reemplace zabbix_pwd y root_pwd por contraseñas seguras):

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.4 \
  --character-set-server=utf8mb4 --collation-server=utf8mb4_bin \
  --authentication-policy=caching_sha2_password

MySQL debe estar completamente inicializado antes de ejecutar el contenedor de Zabbix server en el paso 6; de lo contrario, es posible que el esquema de Zabbix no se cargue correctamente. Para confirmar que MySQL está listo, ejecute podman logs mysql-server y continúe solo cuando vea /usr/sbin/mysqld: ready for connections.

5. Ejecute un contenedor de Zabbix Java gateway:

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

6. Ejecute un contenedor de Zabbix server (reemplace zabbix_pwd y root_pwd por las mismas contraseñas utilizadas en el paso 4):

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-80

7. Ejecute un contenedor de interfaz web de Zabbix (reemplace zabbix_pwd y root_pwd por las mismas contraseñas utilizadas en el paso 4):

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-80

El pod zabbix expone el puerto 80/TCP (HTTP) a la máquina host desde el 8080/TCP del contenedor zabbix-web-mysql.