9 сентября 2025 г.
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