5 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, lo que puede resultar adecuado para usuarios que ya administran un entorno Docker existente.

Desde Zabbix 6.0, los triggers determinísticos 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 únicamente 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 esté instalado en su sistema. Si no lo está, siga la guía de instalación de Docker.

Algunos componentes de Zabbix requieren que puertos específicos 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. En 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 reconstruyen automáticamente cuando sus imágenes base se actualizan.

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> compatibles:

  • alpine - Alpine Linux
  • ubuntu - Ubuntu
  • ol - Oracle Linux
  • ltsc2019 - Windows 10 LTSC 2019 (solo Zabbix agent)
  • ltsc2022 - Windows 11 LTSC 2022 (solo Zabbix agent)

Valores <version> compatibles:

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

Ejemplos:

# Zabbix proxy (SQLite3) estable más reciente en Alpine Linux:
docker pull zabbix/zabbix-proxy-sqlite3:latest

# Zabbix proxy (SQLite3) estable más reciente 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

# Versión menor 7.4 más reciente de Zabbix server (MySQL) en Alpine Linux:
docker pull zabbix/zabbix-server-mysql:alpine-7.4-latest

# Versión 7.4.1 de Zabbix server (MySQL) en Alpine Linux:
docker pull zabbix/zabbix-server-mysql:alpine-7.4.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 de los Dockerfiles oficiales de Zabbix proporciona archivos Docker Compose listos para usar y un sistema de configuración basado en .env compatible con distintos sistemas operativos, backends de bases de datos y la configuración de componentes de Zabbix.

1. Clone el repositorio, acceda a él y cambie a la versión 7.4:

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

Si no tiene git instalado, consulte la guía de instalación de Git.

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

3. Despliegue la configuración predeterminada de Zabbix:

# 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

Esto inicia 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 (predeterminado). Una vez que los contenedores estén en funcionamiento (normalmente en 1–3 minutos), Zabbix server se iniciará y la interfaz web estará disponible en http://localhost.

Puede comprobar que todo funciona con el siguiente comando:

docker compose ps

Todos los contenedores deberían mostrar el estado running. Si alguno muestra exited, revise sus registros (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 usando 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-7.4-latest

Este comando:

  • Descarga la imagen de Docker zabbix/zabbix-proxy-sqlite3:alpine-7.4-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 el contenedor se elimina.

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.

Implementar Zabbix server (MySQL) con Java gateway

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 server 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.0-oracle \
  --character-set-server=utf8 --collation-server=utf8_bin \
  --default-authentication-plugin=mysql_native_password \
  --innodb-default-row-format=dynamic \
  --innodb-strict-mode=OFF

Si está utilizando una imagen Docker para MySQL 8.4 o posterior, reemplace --default-authentication-plugin=mysql_native_password por --default-authentication-plugin=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-7.4-latest

4. Ejecute un contenedor de Zabbix server y vincúlelo al contenedor de server 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-7.4-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 server 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-7.4-latest

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

Implementar Zabbix server (PostgreSQL) con traps SNMP

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 server 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-7.4-latest

4. Ejecute un contenedor de Zabbix server, vincúlelo al contenedor de server 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-7.4-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 server 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-7.4-latest

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

Implementar Zabbix server (MySQL) con Java gateway en RHEL 8

En Red Hat Enterprise Linux 8, 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-74:latest

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

mkdir -p ./mysql

4. Ejecute un contenedor de server 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.0 \
  --character-set-server=utf8 --collation-server=utf8_bin \
  --default-authentication-plugin=mysql_native_password \
  --innodb-default-row-format=dynamic \
  --innodb-strict-mode=OFF

Si está utilizando una imagen Docker para MySQL 8.4 o posterior, reemplace --default-authentication-plugin=mysql_native_password por --default-authentication-plugin=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-74

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

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

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