Развертывание Zabbix 4 с nginx, php-fpm и MySQL в Docker

Last updated on 27.06.2019

В данной заметке будет рассмотрена быстрая установка Zabbix 4.2.1 в контейнере и его последующая небольшая настройка.

Вообще, есть готовые образы 3 в 1: сам Zabbix, веб-сервер и БД. Но я решил использовать всё по отдельности для более гибкого управления в будущем.

Итого понадобится 3 контейнера:

  • Zabbix server
  • nginx +php-fpm
  • mysql

Nginx выбран как популярный и современный веб-сервер на замену apache, а php-fpm – как быстрый и легковесный обработчик php.

Установка простая для тех, кто знаком со всеми технологиями. Тем не менее, буду расписывать пошагово.

Предположим, что Docker уже установлен на сервере. Для удобства и разграничения, я создаю отдельную сеть для использования её в будущих контейнерах:

docker network create --subnet=10.6.0.0/24 --driver=bridge zabbix-net

После создания сеть должна появиться в списке:

[root@dc ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
6099e52a26b2        bridge              bridge              local
a6b8eae2ae56        host                host                local
92b885e99d1f        none                null                local
e6da2c1df745        zabbix-net          bridge              local

Контейнеры, созданные в рамках данной сети, смогу видеть друг друга. Проверить это можно позднее, создав контейнеры и попинговав из одного другой по имени.

Далее с Dockerhub стягиваются образы с явным указанием версий:

docker pull zabbix/zabbix-server-mysql:centos-4.2.1
docker pull zabbix/zabbix-web-nginx-mysql:centos-4.2.1
docker pull mysql:5.7.26

Начнём с настройки и запуска контейнера с MySQL. Предварительно опять же для удобства будут созданы директории для хранения конфигов и данных БД:

container_name=zab-mysql
mkdir -p /storage/${container_name}/data && mkdir /storage/${container_name}/config

В директорию /storage/${container_name}/config необходимо положить файл с конфигом для будущей БД и для удобства сразу базу с Zabbix для дальнейшего раздампа (хотя это можно положить куда угодно):

vim /storage/zab-mysql/config/zabbix-mysql.cnf

[client]
port            = 3306
socket          = /var/lib/mysql/mysql.sock
default-character-set=utf8

[mysqld]
port            = 3306
socket          = /var/lib/mysql/mysql.sock

innodb_file_per_table=1
innodb_buffer_pool_size = 768M # Значение зависит от ОЗУ, доп-но можно почитать оф. докуменатацию. Рекомендуется выставлять не более 50-70% от ОЗУ. Если на сервере 2 Гб, то рекомендуемое значение будет 1Gb или 768М.
innodb_buffer_pool_instances=1 # Значение увеличивать с каждым новым гигабайтом innodb_buffer_pool_size
innodb_buffer_pool_size
innodb_flush_log_at_trx_commit = 0
innodb_log_file_size = 512M

# Character

character-set-server = utf8
collation-server = utf8_unicode_ci
init_connect="SET collation_connection = utf8_unicode_ci"

log_error=/var/log/mysql/mysql_error.log

И непосредственно сам запуск контейнера с указанием всех логинов и паролей к базе Zabbix:

docker run --name ${container_name} -t --network=zabbix-net -e MYSQL_DATABASE="zabbix" -e MYSQL_USER="zabbix" -e MYSQL_PASSWORD="zabbix" -e MYSQL_ROOT_PASSWORD="root" -v /storage/${container_name}/data:/var/lib/mysql -v /storage/${container_name}/config:/etc/mysql -d mysql:5.7.26 --character-set-server=utf8 --collation-server=utf8_unicode_ci

После уже в самом контейнере надо раздампить базу Zabbix:

 zcat /etc/mysql/create.sql.gz | mysql -u root -p zabbix

Пароль берётся из переменной при запуске контейнера, т.е. root. В продакшн, конечно же, лучше установить что-то посерьезней.

Контейнер запущен и работает с нужной базой, проверить это можно, залогинившись в консоль MySQL:

mysql -uroot -proot

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| zabbix             |
+--------------------+

Далее запускается контейнер с zabbix server: переменной присваивается новое значение и происходит запуск с указанием данным уже запущенного контейнера с MySQL:

container_name=zab-server

docker run --name ${container_name} --network=zabbix-net -e DB_SERVER_HOST="zab-mysql" -e MYSQL_USER="zabbix" -e MYSQL_PASSWORD="zabbix" -d zabbix/zabbix-server-mysql:centos-4.2.1

После запуска можно проверить, что всё успешно завелось, для этого надо открыть логи:

docker logs zab-server

И осталось запустить фронт с nginx и php-fpm:

container_name=zab-front
docker run --name ${container_name} --network=zabbix-net -e DB_SERVER_HOST="zab-mysql" -e MYSQL_USER="zabbix" -e MYSQL_PASSWORD="zabbix" -e ZBX_SERVER_HOST="zab-server" -e PHP_TZ="Europe/Moscow" -p 80:80 -p 443:443 -d zabbix/zabbix-web-nginx-mysql:centos-4.2.1

Из команды выше можно заметить, что здесь пробрасываются порты на докер-хост – 80 и 443, непосредственно уже для доступа из браузера.

На этом всё, можно проверять доступ с логином и паролем по дефолту – Admin/zabbix

2 комментария

  1. Алексей писал:

    Спасибо за статью.

    А почему вы в настройках сервера используете один collation-server
    collation-server = utf8_unicode_ci
    init_connect=”SET collation_connection = utf8_unicode_ci”

    а при запуске контейнера уже другой collation-server?
    –collation-server=utf8_bin

    26.06.2019
    Ответить
    • rmn-lux писал:

      Спасибо за замечание. Это, конечно же, недочёт, и collation должен быть как в конфиге – utf8_unicode_ci. Но по идее если параметр при старте контейнера не переопределяет значения (см. через show global) из конфига, то всё не так и критично. Недочёт исправил.

      27.06.2019
      Ответить

Добавить комментарий для Алексей Отменить ответ

Ваш e-mail не будет опубликован. Обязательные поля помечены *