Zabbix 5.x(latest)をDocker Composeで動かす

ふと年始に自宅Zabbixをコンテナに移行したくなったので、Docker Composeで動かすためにやったことをメモに残す。

想定読者

  • Zabbixの構築・運用経験がある人
    • Zabbix起動後の初期セットアップ方法などは割愛
  • DockerやDocker Composeしたことがある人
    • Docker等のインストール方法は割愛

環境

  • OS : Ubuntu Server 20.04.1 LTS
  • Docker : 20.10.1
  • Docker-compose : 1.25.0

インストール

0. 想定環境

Zabbix Server

  • コンテナで実行する

Zabbix Agent2

  • コンテナではなく、ホストOSにインストールする
    • 今後ホスト上で監視項目を追加していきたいと思ったときに、監視対象へのアクセス権などの制御や運用がコンテナだと面倒そうだなと思ったので
    • Zabbix Agent自身と他のアプリケーションの干渉があまり想定できなかったため

0. インストールドキュメント

5 INSTALLATION FROM CONTAINERS

基本的に上記オフィシャルドキュメントに記載されている内容をベースに進めていく。

1. 構成ファイルの取得

zabbix / zabbix-docker をクローンする。

$ git clone https://github.com/zabbix/zabbix-docker.git

2. Server構成の選択

README.mdのUsageやインストールドキュメントに記載があるように、複数のcomposeファイルが含まれている。 選択肢として下記の選択が与えられており、好きなものを選べばよい。 - ベースイメージ : alpine or Centos or Ubuntu - データベース : MySQL or PostgreSQL - コンテナイメージのビルド : 最新のビルド済みイメージを使用する or ローカルでビルドする

今回は下記理由によりalpine & MySQL & latestを選択し、docker-compose_v3_alpine_mysql_latest.yamlを選定することとした。 - コンテナ内を弄るつもりがないので運用上UbuntuCentOSが使いやすいとかもなく、alpineが一番スリムであったため - Zabbix + MySQLで過去に運用しており、特にPostgreSQLを使わなければならないようなライセンス上の都合もなかったため - ローカルでビルドする必要性がなく、既にベンダー側でテスト済みのイメージを利用したほうが変にはまる要素がないと思ったため

選定したyamlファイルをdocker-composeファイルとしてコピーする。

$ cd zabbix-docker
$ cp docker-compose_v3_alpine_mysql_latest.yaml docker-compose.yaml

(参考)ファイル構成

クローンしたリポジトリは、下記のようなファイル・ディレクトリが含まれている。

ほぼすべてのディレクト

  • 中にalpine,centos,ubuntuディレクトリが含まれており、各ベースイメージからコンテナイメージをビルドするためのDockerfileが含まれている
  • latestを選択すると使うことはないはず

.env_から始まるファイル

  • Zabbixサーバを構築する際に与える必要のある変数が含まれるファイル
    • zabbix_server.confなどに与える値も含む
  • デフォルトのままでも起動可能
  • 必要に応じて編集する

.MYSQL_ or .POSTGRES_から始まるファイル

  • DBのシークレット情報を持つファイル
  • デフォルトのままでも起動可能、必要に応じて編集する。
  • User名やパスワードは変更するべき?
    • DBはホストOSから外へはポートを公開していない
    • ホストOSからは接続可能なため、万が一ホストがやられた際のデータ保護のためには必要…でもホストがやられているときは手遅れでは

docker-compose_v3_から始まるファイル

  • docker-composeファイル
  • 前述の通り選択してcpして利用する。

なお、docker-compose up後からzbx_envディレクトリが生成され、コンテナが使用するデータが保存されていく。別の場所が良いのであれば頑張ってyamlの記述を置換する。

3. docker-compose.yamlの編集

必要なコンポーネントの選択

本ファイル内には下記コンポーネントが含まれており、services内で不要なものがあればコメントアウトもしくは該当箇所を削除する

  • Zabbix Server(必須)
    • zabbix-server
  • Zabbix Proxy(不要または選択)
    • zabbix-proxy-sqlite3
    • zabbix-proxy-mysql
  • Web(選択)
  • Zabbix Agent(不要または選択)
    • zabbix-agent
  • その他(不要または選択)
  • DB(必須)

今回は下記services以外はすべて削除した

- zabbix-server
- zabbix-web-apache-mysql
- zabbix-snmptraps (SNMPトラップ監視のため)
- mysql-server
- db_data_mysql

Zabbix-ServerのIP固定

ホストOS上でインストールしたZabbix Agentと通信する際は、DockerのNetworkで通信を行う。zabbix_agent2.confにZabbix ServerのIPを記載する必要があるが現在の状態では与えられた下記ネットワークIPプールから順次IPが割り当てられるため、起動毎にIPが変化する。

networks:
  zbx_net_frontend:
    driver: bridge
    driver_opts:
      com.docker.network.enable_ipv6: "false"
    ipam:
      driver: default
      config:
      - subnet: 172.16.238.0/24

そのため、Zabbix ServerのIPを固定化する。今回はデフォルトで記載されている172.16.238.0/24から172.16.238.100を使用する。

下記のようにipv4_address: 172.16.238.100を追記する。

services:
 zabbix-server:
  image: zabbix/zabbix-server-mysql:alpine-5.2-latest

(中略)

  networks:
   zbx_net_backend:
     aliases:
      - zabbix-server
      - zabbix-server-mysql
      - zabbix-server-alpine-mysql
      - zabbix-server-mysql-alpine
   zbx_net_frontend:
     ipv4_address: 172.16.238.100

4. env_の編集

.env_web

PHPのTimeZone設定をJSTにする。下記内容を記述。

PHP_TZ=Asia/Tokyo

.env_srv

zabbix_server.confで設定しなければならない内容を記述する。 今回はESXiを監視するために下記内容を追記し有効化及び監視間隔の調整を実施。

ZBX_STARTVMWARECOLLECTORS=4
ZBX_VMWAREFREQUENCY=300
ZBX_VMWAREPERFFREQUENCY=300

5. 起動

$ sudo docker-compose up -d

6. ブラウザでアクセス

http://<HostIP>/にアクセスし、初期アカウントでログインできることを確認。

7. Zabbix Agent2のインストール

Download and install ZabbixからAgentに必要な箇所を抜粋

$ wget https://repo.zabbix.com/zabbix/5.2/ubuntu/pool/main/z/zabbix-release/zabbix-release_5.2-1+ubuntu20.04_all.deb
$ sudo dpkg -i zabbix-release_5.2-1+ubuntu20.04_all.deb
$ sudo apt update
$ sudo apt install zabbix-agent2

その後、/etc/zabbix/zabbix_agent2.confで固定化したサーバのIPを指定してサービスを再起動、ZabbixServer側からもZabbixAgentのIPをホストの127.0.0.1からホストのIPに変更して保存すればホストOSの監視が開始される。

また、zabbixユーザを下記コマンドでdockerグループに参加させ、dockerテンプレートと結びつけると、コンテナの監視が追加される。

$ sudo gpasswd -a zabbix docker