Docker監視用のZabbix Server/Agentをdocker-composeでまとめて立ち上げて簡単に監視する

あるホスト上に動いているDockerの監視をZabbix Server/Agentで行います。
以下のように監視対象のdockerが動いてるhost上にZabbix一式を立ち上げて監視して、downしたらアラートを発行するようにします。

![zabbix0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86684/44397e8a-7fc0-b00b-6f02-dc1c2ea18895.png)


この方法の場合1host = 1 Zabbix Agentになるのでホストが複数あるときは各ホストにZabbix Agentコンテナを立ち上げることになります。
今回は1hostの場合の手順です。

# Zabbix Server/Agentの用意
まずはZabbix Server/Agentを立ち上げます。
以下の`docker-compose.yml`を作成して`docker-compose up -d`

```docker-compose.yml
version: '3'
services:
  zabbix-agent:
    image: monitoringartist/dockbix-agent-xxl-limited:latest
    hostname: zabbix-agent
    environment:
      ZA_Server: 0.0.0.0/0
      ZA_ServerActive: zabbix-server
    volumes:
      - /:/rootfs
      - /var/run:/var/run
    restart: always
  zabbix-db:
    image: monitoringartist/zabbix-db-mariadb
    environment:
      MARIADB_USER: zabbix
      MARIADB_PASS: my_password
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - ./zabbix-db-data:/var/lib/mysql
    restart: always
  zabbix-server:
    image: monitoringartist/dockbix-xxl:latest
    environment:
      ZS_DBHost: zabbix-db
      ZS_DBUser: zabbix
      ZS_DBPassword: my_password
      #XXL_zapix: 'true'
      #XXL_grapher: 'true'
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - ./zabbix-server/alertscripts:/usr/local/share/zabbix/alertscripts
    ports:
      - 38080:80
    restart: always
```
これで`http://<ホストIP>`:38080にブラウザから接続すればZabbixのWebUIが見れます。
ちなみに私の環境では起動完了まで数分かかりました。

# Zabbix-Serverの設定
WebUIから監視設定を入れていきます。
初期状態では`Admin/zabbix`でログインできます。
下の参考画像を見ながら以下の設定を行ってください。

- templateの追加
    - テンプレートをダウンロード
        - https://github.com/monitoringartist/zabbix-docker-monitoring/blob/master/template/Zabbix-Template-App-Docker.xml
    -  `Configration` > `Template`に移動後右上の`import`をクリック
    -  `参照`から先ほどダウンロードした`Zabbix-Template-App-Docker.xml`を選択して`import`
- hostの追加
    - `Configration` > `Hosts`に移動後右上の`Create host`をクリック
    - 以下を設定（参考画像①）
        - `Host`タブ
            - Host name: zabbix-agent
            - Groups: docker
            - Agent interfaces
                - DNS name: zabbix-agent
                - Connect to: DNS
                - Port: 10050
        - `Templates`タブ
            - `Link new templates`に`Template App Docker - www.monitoringartist.com`
                - (注意) 上のAddを押してから下のAddを押す（参考画像②）

これで設定は終了で`Configration` > `Hosts`に戻ってZBXが緑になれば成功です（参考画像③）。
※ 緑になるまで時間がかかることがあります。

[参考画像]

- ①Create host

![zabbix01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86684/86927e72-39bf-e2c3-60d1-496ae52b366b.png)

- ②Create host-Template追加

![zabbix02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86684/b1dc9a77-b795-6e2f-ab9b-323d8190c9da.png)

- ③Zabbix Agent有効可の確認

![zabbix3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86684/26d21e40-0ed0-ee24-c861-20da7cb3c63b.png)

# モニタリング状況の確認

`Monitoring` > `Latestdata`に移動し`Host groups`を`docker`にして`Apply`すると一覧が表示されると思います。

今回のTemplateで取得できる情報は各コンテナごとの

- Container is running
- CPU utilization 
- Used cache memory
- Used RSS memory
- Used swap

になります。

# アラートの設定
ここまでで監視はできるようになりましたが、コンテナに何かあっても特に表示されません。
今回はコンテナがdownしたらアラートが出るようにします。

- `Configration` > `Template` > `Template App Docker - www.monitoringartist.com` > `Discovery rules`タブに移動
- 表示されている`Running containers`列の`Trigger prototypes`をクリック(参考画像④)
- 右上の`Create trigger prototypes`をクリックし以下を設定を`Add`
    - Name: `Container {#HCONTAINERID} is down`
    - Severity: `Heigh`
    - Expression: `{Template App Docker - www.monitoringartist.com:docker.up[/{#HCONTAINERID}].last()}=0`
        - 横のAddからGUIで設定(参考画像⑤)

最終的にできたものは参考画像⑥になります。
これで適当なコンテナをStopすると参考画像⑦のようにWebUIのトップに障害が表示されるようになります。
        

[参考画像]

- ④Trigger prototypes

![zabbix04.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86684/579f263f-b373-dbb2-11b5-7e3c2d57a99d.png)

- ⑤Expression

![zabbix05.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86684/15fdfb9c-9fac-feb9-bd2c-61873a5c4931.png)

- ⑥Trigger

![zabbix06.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86684/01730630-ec65-96e6-4441-4d779cd241bb.png)

- ⑦障害画面

![zabbix07.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86684/6181177e-0be5-1adf-9b4a-3304194a7e5b.png)

# おまけ: Slackに通知

解説は探せば出てくると思うのでここには書きませんが、アラートをSlackに連携しておくと便利です。
いくつか方法があるみたいですが私は https://github.com/ericoc/zabbix-slack-alertscript を使うことにしました。
今回のdocker-compose.ymlではzabbix-serverはvolumeで`./zabbix-server/alertscripts:/usr/local/share/zabbix/alertscripts`を指定しているので`./zabbix-server/alertscripts`に上記github urlのslack.shを配置すると使えるようになります。