Тест на вакансию

Установка Zabbix в Docker-контейнерах

9 сентября 2025 г.
336

Docker Compose файл

Напишем следующий docker-compose.yml:
services:
  zabbix-server:
    image: zabbix/zabbix-server-mysql:alpine-6.4-latest
    container_name: zabbix-server
    restart: unless-stopped
    ports:
      - "10051:10051"
    environment:
      - DB_SERVER_HOST=zabbix-mysql
      - MYSQL_DATABASE=zabbix
      - MYSQL_USER=zabbix
      - MYSQL_PASSWORD=zabbix_password
      - MYSQL_ROOT_PASSWORD=root_password
    volumes:
      - zabbix_export:/var/lib/zabbix/export
      - zabbix_snmptraps:/var/lib/zabbix/snmptraps
      - zabbix_ssh_keys:/var/lib/zabbix/ssh_keys
      - zabbix_ssl_certs:/var/lib/zabbix/ssl/certs
      - zabbix_ssl_keys:/var/lib/zabbix/ssl/keys
    depends_on:
      - zabbix-mysql
    networks:
      - zabbix-net
  zabbix-web:
    image: zabbix/zabbix-web-apache-mysql:alpine-6.4-latest
    container_name: zabbix-web
    restart: unless-stopped
    ports:
      - "580:8080"
      - "5443:8443"
    environment:
      - ZBX_SERVER_HOST=zabbix-server
      - DB_SERVER_HOST=zabbix-mysql
      - MYSQL_DATABASE=zabbix
      - MYSQL_USER=zabbix
      - MYSQL_PASSWORD=zabbix_password
      - MYSQL_ROOT_PASSWORD=root_password
      - PHP_TZ=Europe/Moscow
    depends_on:
      - zabbix-mysql
      - zabbix-server
    networks:
      - zabbix-net
  zabbix-mysql:
    image: mysql:8.0
    container_name: zabbix-mysql
    restart: unless-stopped
    environment:
      - MYSQL_DATABASE=zabbix
      - MYSQL_USER=zabbix
      - MYSQL_PASSWORD=zabbix_password
      - MYSQL_ROOT_PASSWORD=root_password
    command:
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
      - --default-authentication-plugin=mysql_native_password
    volumes:
      - zabbix_mysql_data:/var/lib/mysql
      - ./mysql-init:/docker-entrypoint-initdb.d
    networks:
      - zabbix-net
  zabbix-agent:
    image: zabbix/zabbix-agent2:alpine-6.4-latest
    container_name: zabbix-agent
    restart: unless-stopped
    ports:
      - "10050:10050"
    environment:
      - ZBX_HOSTNAME=zabbix-server
      - ZBX_SERVER_HOST=zabbix-server
    privileged: true
    pid: "host"
    volumes:
      - /:/rootfs
      - /var/run:/var/run
      - /sys:/sys
      - /proc:/proc
    depends_on:
      - zabbix-server
    networks:
      - zabbix-net
volumes:
  zabbix_mysql_data:
  zabbix_export:
  zabbix_snmptraps:
  zabbix_ssh_keys:
  zabbix_ssl_certs:
  zabbix_ssl_keys:
networks:
  zabbix-net:
    driver: bridge
Или вариант с PostgreSQL:
services:
  postgres:
    image: postgres:15-alpine
    container_name: zabbix-postgres
    environment:
      - POSTGRES_DB=zabbix
      - POSTGRES_USER=zabbix
      - POSTGRES_PASSWORD=zabbix
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U zabbix -d zabbix"]
      interval: 5s
      timeout: 10s
      retries: 20
    networks:
      - zabbix-net
    restart: unless-stopped
  zabbix-schema-importer:
    image: zabbix/zabbix-server-pgsql:alpine-6.4-latest
    container_name: zabbix-schema-importer
    depends_on:
      postgres:
        condition: service_healthy
    environment:
      - PGPASSWORD=zabbix
    command: >
      sh -c "
        echo 'Waiting for PostgreSQL to be fully ready...';
        sleep 10;
       
        echo 'Checking PostgreSQL connection...';
        until pg_isready -h postgres -U zabbix -d zabbix -t 30; do
          echo 'Waiting for PostgreSQL...';
          sleep 2;
        done;
       
        echo 'Searching for schema file...';
        # Ищем файл схемы
        SCHEMA_FILE=$$(find /usr -name '*.sql.gz' | grep -i postgres | head -1);
        echo 'Found schema file: '$$SCHEMA_FILE;
       
        if [ -f \"$$SCHEMA_FILE\" ]; then
          echo 'Importing Zabbix database schema...';
          zcat \"$$SCHEMA_FILE\" | psql -h postgres -U zabbix zabbix;
          echo 'Schema import completed!';
        else
          echo 'ERROR: Schema file not found!';
          echo 'Available files:';
          find /usr -name '*.sql.gz' 2>/dev/null;
          exit 1;
        fi;
       
        echo 'Verifying import...';
        # Проверяем наличие таблиц
        psql -h postgres -U zabbix zabbix -c '\dt' | head -10;
        psql -h postgres -U zabbix zabbix -c 'SELECT mandatory FROM dbversion';
        psql -h postgres -U zabbix zabbix -c 'SELECT COUNT(*) FROM users';
       
        echo 'Database schema imported successfully!';
        exit 0;
      "
    networks:
      - zabbix-net
    restart: "no"
  zabbix-server:
    image: zabbix/zabbix-server-pgsql:alpine-6.4-latest
    container_name: zabbix-server
    ports:
      - "10051:10051"
    environment:
      - DB_SERVER_HOST=postgres
      - POSTGRES_DB=zabbix
      - POSTGRES_USER=zabbix
      - POSTGRES_PASSWORD=zabbix
    depends_on:
      - zabbix-schema-importer
    networks:
      - zabbix-net
    restart: unless-stopped
  zabbix-web:
    image: zabbix/zabbix-web-nginx-pgsql:alpine-6.4-latest
    container_name: zabbix-web
    ports:
      - "580:8080"
    environment:
      - ZBX_SERVER_HOST=zabbix-server
      - DB_SERVER_HOST=postgres
      - POSTGRES_DB=zabbix
      - POSTGRES_USER=zabbix
      - POSTGRES_PASSWORD=zabbix
      - PHP_TZ=Europe/Moscow
    depends_on:
      - zabbix-server
    volumes:
      - ./zabbix.conf.php:/etc/zabbix/web/zabbix.conf.php
    networks:
      - zabbix-net
    restart: unless-stopped
  zabbix-agent:
    image: zabbix/zabbix-agent2:alpine-6.4-latest
    container_name: zabbix-agent
    restart: unless-stopped
    ports:
      - "10050:10050"
    environment:
      - ZBX_HOSTNAME=zabbix-server
      - ZBX_SERVER_HOST=zabbix-server
    privileged: true
    pid: "host"
    volumes:
      - /:/rootfs
      - /var/run:/var/run
      - /sys:/sys
      - /proc:/proc
    depends_on:
      - zabbix-server
    networks:
      - zabbix-net
volumes:
  postgres_data:
networks:
  zabbix-net:
    driver: bridge
Создадим конфигурационный файл Zabbix (zabbix.conf.php) там же где находится docker-compose.yml:
<?php

global $DB;

$DB['TYPE']     = 'POSTGRESQL';
$DB['SERVER']   = 'postgres';
$DB['PORT']     = '5432';
$DB['DATABASE'] = 'zabbix';
$DB['USER']     = 'zabbix';
$DB['PASSWORD'] = 'zabbix';

$DB['SCHEMA'] = '';

$ZBX_SERVER      = 'zabbix-server';
$ZBX_SERVER_PORT = '10051';
$ZBX_SERVER_NAME = 'Zabbix Server';
$IMAGE_FORMAT_DEFAULT = IMAGE_FORMAT_PNG;

Запуск Zabbix

Запуск контейнеров:
docker-compose up -d
Просмотр логов:
docker-compose logs -f
Проверка статуса:
docker-compose ps

Доступ к веб-интерфейсу

Откроем в браузере: http://localhost:580
  • Логин: Admin
  • Пароль: zabbix

Полезные команды Docker

Остановка всех контейнеров:
docker-compose down
Перезапуск конкретного сервиса:
docker-compose restart zabbix-server
Просмотр логов:
docker-compose logs zabbix-server
docker-compose logs -f  # в реальном времени
Проверка использования ресурсов:
docker stats
Вход в контейнер:
docker exec -it zabbix-server bash
Резервное копирование базы данных
docker exec zabbix-mysql mysqldump -u zabbix -pzabbix_password zabbix > backup.sql
Обновление образов:
docker-compose pull
docker-compose up -d
Поделиться: