Zabbix 3.0をDocker Composeで一度に実行する方法

# 概要

Zabbix 3.0 の検証用に Docker で簡単に環境を構築できるようにした。構築には Docker Compose を使い Zabbix Server 用コンテナと MariaDB コンテナを稼働・管理する。

# 動作条件

今回の確認を行ったのは以下の環境。

* CentOS 7.2 (kernel 3.10.0-327.10.1.el7.x86_64)
* Docker Engine 1.10 + Docker Compose 1.6
* Zabbix コンテナ
 * [zabbix-3.0](https://hub.docker.com/r/zabbix/zabbix-3.0/)
 * [zabbix-db-mailadb](https://hub.docker.com/r/zabbix/zabbix-db-mariadb/~/dockerfile/) 

# 環境構築

## 作業方針

[zabbix-community-docker](https://github.com/zabbix/zabbix-community-docker) で配布されている Zabbix 3.0 の Docker イメージを使い環境構築を行う。

コンテナは Docker Compose を使って一括管理できるようにする。ただし、コミュニティで配布されている docker-compose.yml は v2 フォーマットに書き換え、以下の環境を構築する。

![docker-compose-zabbix2.png](https://qiita-image-store.s3.amazonaws.com/0/13002/3e415ba8-49ef-6798-2a93-556a7324e930.png)

配布されていた docker-compose.yml をそのまま使わず、v2 フォーマットに書き換えた理由は以下の通り。

* サービス(Zabbix, Mariadb)とボリュームを分けて扱い安くなる
* v2 フォーマットは depends_on があるため、DB コンテナ起動後に Zabbix Server コンテナを起動させることが可能（既にコンテナ内の起動スクリプト run.sh の完成度が高かったので、活用できる）

## 環境構築手順

Docker Machine 等を使うなど、Docker Engine は何らかの方法でインストール済みでなければ、次のコマンドを実行して Docker Engine のインストールと起動を行う（Dockerが配布する最新版のバイナリ・パッケージをセットアップする方法）。

```bash
# curl -sSL https://get.docker.com/ | sh
# systemctl start docker
```

次に ``docker-compose`` のバイナリをセットアップする。

```
# curl -L https://github.com/docker/compose/releases/download/1.6.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose
```

Compose が利用可能かどうかは、バージョン番号が表示可能かどうかで確認する。以下、正常な例。

```
$ docker-compose version
docker-compose version 1.6.2, build 4d72027
docker-py version: 1.7.2
CPython version: 2.7.9
OpenSSL version: OpenSSL 1.0.1e 11 Feb 2013
```

次に Compose のプロジェクト（作業単位）に使うディレクトリを作成し、移動する。ここでは ``zabbix3`` とするが、任意の名称で構わない。

```
$ mkdir zabbix3
$ cd zabbix3
```

このディレクトリ内に ``docker-compose.yaml`` ファイルを作成する。

```yaml:docker-compose.yaml
version: '2'
services:
  zabbix-db:
    image: zabbix/zabbix-db-mariadb
    volumes:
      - zabbix-db-storage:/var/lib/mysql
      - backups:/backups
      - /etc/localtime:/etc/localtime:ro
    environment:
      - MARIADB_USER=zabbix
      - MARIADB_PASS=my_password
  zabbix-server:
    image: zabbix/zabbix-3.0:latest
    depends_on:
      - zabbix-db
    ports:
      - "80:80"
      - "10051:10051"
    volumes:
      - /etc/localtime:/etc/localtime:ro
    links:
      - zabbix-db:zabbix.db
    environment:
      - ZS_DBHost=zabbix.db
      - ZS_DBUser=zabbix
      - ZS_DBPassword=my_password
volumes:
  zabbix-db-storage:
    driver: local
  backups:
    driver: local
```

ベースになっているのは [コミュニティ版 docker-compose.yml](https://github.com/zabbix/zabbix-community-docker/blob/master/Dockerfile/zabbix-3.0/docker-compose.yml) だが、特徴と変更点は以下の通り。

* 利用しているイメージや環境変数は同じもの
* Compose v2 フォーマットに書き換えるため、サービスとボリュームを定義
* v2 フォーマットのボリューム機能を使うため、zabbix-db-storage コンテナは使用しない

ファイル作成後は、必要なイメージを取得する。

```bash
$ docker-compose pull
Pulling zabbix-db (zabbix/zabbix-db-mariadb:latest)...
latest: Pulling from zabbix/zabbix-db-mariadb
a3ed95caeb02: Pull complete
196355c4b639: Pull complete
39ac25574789: Pull complete
a71e49d71685: Pull complete
Digest: sha256:659022fb65ec3843472c42d9722f3bf65f8f9f13187563c7d8e73c6a5ff5c4c1
Status: Downloaded newer image for zabbix/zabbix-db-mariadb:latest
Pulling zabbix-server (zabbix/zabbix-3.0:latest)...
latest: Pulling from zabbix/zabbix-3.0
a3ed95caeb02: Already exists
196355c4b639: Already exists
e83e94d3bc97: Pull complete
a586f6047ba2: Pull complete
b33c7f8446ba: Pull complete
92aa3f0ccb13: Pull complete
Digest: sha256:2585752c00c8e784f899bef3fef0e1092574ca72396716cdd39a3cd75148b56d
Status: Downloaded newer image for zabbix/zabbix-3.0:latest
```

エラーが出なければ、イメージが取得できているか確認する。

```bash
$ docker images
REPOSITORY                 TAG                 IMAGE ID            CREATED             SIZE
zabbix/zabbix-3.0          latest              7e2d6c4d3b1d        7 hours ago         719.6 MB
zabbix/zabbix-db-mariadb   latest              85539c34211e        35 hours ago        554.4 MB
```

次に、Zabbix Server コンテナと Mariadb コンテナを ``docker-compose up -d`` で起動する（-d はデタッチド・モードで実行＝バックグラウンドで実行）。

```bash
$ docker-compose up -d
Creating network "zabbix3_default" with the default driver
Creating volume "zabbix3_zabbix-db-storage" with local driver
Creating volume "zabbix3_backups" with local driver
Creating zabbix3_zabbix-db_1
Creating zabbix3_zabbix-server_1
```

``docker-compose ps`` コマンドで、正常に動作しているか確認する。

```
$ docker-compose ps
       Name                 Command                State                 Ports
-------------------------------------------------------------------------------------
zabbix3_zabbix-db_1   /run.sh               Up                    3306/tcp
zabbix3_zabbix-       /config/bootstrap.s   Up                    0.0.0.0:10051->1005
server_1              h                                           1/tcp, 10052/tcp,
                                                                  162/udp,
                                                                  0.0.0.0:80->80/tcp
```

このとき MariaDB の初期セットアップが進行するので、1分ほど待つ必要がある。進行状況は ``docker-compose logs`` コマンドで確認できる。

```bash
$ docker-compose logs
(略)
zabbix-server_1 | [WARNING 20:58:27] Zabbix database doesn't exist. Installing and importing default settings
zabbix-server_1 |
zabbix-server_1 | [LOG 20:58:27] Database and user created, importing default SQL
zabbix-server_1 |
zabbix-server_1 | [LOG 20:58:38] Import finished, starting
zabbix-server_1 | [LOG 20:58:38] Starting Zabbix version 3.0.1
(略)
zabbix-db_1     | ========================================================================
zabbix-db_1     |     You can now connect to this MariaDB Server using:
zabbix-db_1     |     mysql -uzabbix -pmy_password -h<host>
zabbix-db_1     |
zabbix-db_1     |     For security reasons, you might want to change the above password.
zabbix-db_1     |     The 'root' user has no password but only allows local connections
zabbix-db_1     | ========================================================================
```

``Ctrl+C`` でログの表示を中断できる。

Docker Compose に関する詳細は、ドキュメントをご覧ください。

* Docker Compose 概要
 * http://docs.docker.jp/compose/overview.html

### ブラウザ側での確認

あとは、ブラウザで ``http://<ホストIP>/`` にアクセスすると Zabbix の初期画面が表示される。

![zab3a.png](https://qiita-image-store.s3.amazonaws.com/0/13002/3b2a92c0-7fa6-8662-589c-00fb4cf47edb.png)

ID: ``Admin`` 、 Password: ``zabbix`` でログインする。ログイン直後は、画面右上の２番目、人の形のアイコン ``Admin (Zabbix Administratior)``  をクリックし、``Change password`` ボタンを押し、パスワードを変更しておく。

この zabbix-server コンテナにはエージェントも稼働している。Zabbix に登録するには ``Configuration`` -> ``Hosts`` -> ``Zabbix server`` の ``Disabled`` をクリックし、``Enabled`` に切り替える。あとは、通常の Zabbix サーバのようにセットアップもできる。

![zabbix-monitor.png](https://qiita-image-store.s3.amazonaws.com/0/13002/ff36882d-2657-5076-0cfa-798d760f6c73.png)


### おまけ：ホスト側にMariaDB の zabbix データをバックアップ

Docker ホスト上で以下のコマンドを実行（Compose プロジェクト名を変えている場合は、docker ps で正確なコンテナ名を確認すること）。

```
$ docker exec \
    -ti zabbix3_zabbix-db_1 \
    /zabbix-backup/zabbix-mariadb-dump -u zabbix -p my_password -o /backups
Configuration:
 - host:     127.0.0.1 (127.0.0.1)
 - database: zabbix
 - user:     zabbix
 - output:   /backups

Fetching list of existing tables...
Starting table backups...
0%.....12%.....24%......36%.......48%.....60%.....72%......84%84%......96%..

For the following large tables only the schema (without data) was stored:
 - acknowledges
 - alerts
 - auditlog
 - auditlog_details
 - events
 - history
 - history_log
 - history_str
 - history_text
 - history_uint
 - trends
 - trends_uint

Compressing backup file...

Backup Completed:
/backups/zabbix_cfg_127.0.0.1_20160331-2302_db-3.0.0.sql.gz
```

フルバックアップは

```
docker exec \
    -ti zabbix3_zabbix-db_1 \
    bash -c "\
    mysqldump -u zabbix -pmy_password zabbix | \
    bzip2 -cq9 > /backups/zabbix_db_dump_$(date +%Y-%m-%d-%H.%M.%S).sql.bz2"
```

データは `zabbix-db`` コンテナ内の ``/backup`` にバックアップをしている。しかし、ここは Compoes の設定で、コンテナ用の領域とは別に、ホスト側（ローカル）のボリュームに保管されている。確認するには

```
$ docker inspect zabbix3_zabbix-db_1
(略)
        "Mounts": [
(略)
            {
                "Name": "zabbix3_backups",
                "Source": "/var/lib/docker/volumes/zabbix3_backups/_data",
                "Destination": "/backups",
                "Driver": "local",
                "Mode": "rw",
                "RW": true,
                "Propagation": "rprivate"
```

この ``Source`` に書かれているのが、ホスト上の実体ディレクトリであることがわかる。あとは、ホスト上で直接確認できる。

```
 ls -al /var/lib/docker/volumes/zabbix3_backups/_data
total 6404
drwxr-xr-x 2 root root    4096 Mar 31 23:08 .
drwxr-xr-x 3 root root    4096 Mar 31 20:58 ..
-rw-r--r-- 1 root root 1048474 Mar 31 23:02 zabbix_cfg_127.0.0.1_20160331-2302_db-3.0.0.sql.gz
-rw-r--r-- 1 root root 1048472 Mar 31 23:07 zabbix_cfg_localhost_20160331-2307_db-3.0.0.sql.gz
-rw-r--r-- 1 root root 1048482 Mar 31 23:08 zabbix_cfg_localhost_20160331-2308_db-3.0.0.sql.gz
-rw-r--r-- 1 root root 1131890 Mar 31 23:05 zabbix_db_dump_2016-03-31-23.05.45.sql.bz2
-rw-r--r-- 1 root root 1131862 Mar 31 23:06 zabbix_db_dump_2016-03-31-23.06.29.sql.bz2
-rw-r--r-- 1 root root 1131765 Mar 31 23:06 zabbix_db_dump_2016-03-31-23.06.37.sql.bz2
```


Enjoy!



## 参考

* Zabbix Community Dockerfiles
 * https://github.com/zabbix/zabbix-community-docker/tree/master/Dockerfile/zabbix-3.0
 * https://hub.docker.com/r/zabbix/zabbix-3.0/
 * https://hub.docker.com/r/zabbix/zabbix-db-mariadb/~/dockerfile/