docker-compose習作① Zabbix-Serverの外部チェックアイテムで取得

docker-composeの習作ができたので、
作成の仕方を公開します。

Dockerサーバ環境は以下の通り


OS:CentOS Linux release 7.6.1810 (Core)
Docker：19.03.1
docker-compose:
docker-compose version 1.23.2, build 1110ad01
docker-py version: 3.6.0
CPython version: 3.6.7

目標としては、Zabbixサーバ(Ver.4.2.5)をマルチコンテナでデプロイして、
KukuluLIVEの視聴者数をZabbixで監視できるようにするとこまでとしています。

kukuLIVEはAPI開発をしているので、それを利用させてもらいます。
APIに関する記事はこちら

http://kukulu.erinn.biz/live/wiki/index.php?API

### Dockerfileでイメージを作成

```Dockerfile:Dockerfile
FROM zabbix/zabbix-server-mysql:centos-4.2.5
RUN curl https://packages.microsoft.com/config/rhel/7/prod.repo | tee /etc/yum.repos.d/microsoft.repo \
 && yum install -y powershell
COPY kukulu_viewers.ps1 /usr/lib/zabbix/externalscripts/
```
zabbix-server-mysqlにPowerShellをインストールし、
`kukulu_viewers.ps1`をコンテナ側の`/usr/lib/zabbix/externalscripts/`へ
コピーしています。`kukulu_viewers.ps1`は以下の通りの構文で、
KukuluLIVEの視聴者数をREST-APIで取得するようにしています。

```powershell:kukulu_viewers.ps1
#!/usr/bin/pwsh

### 現在のKukuluLIVEの総視聴者数を確認するツール

# 総視聴者数取得関数
function kukulu_viewers() {
    $KUKULU =  Invoke-RestMethod -Uri https://live.erinn.biz/api/?category=live
    (($KUKULU).live.viewers | Measure-Object -Sum).Sum
}

    kukulu_viewers
```

資材が揃ったら、`docker build`でイメージを作成します。

```bash:Dockerfileでイメージ作成
# mkdir /root/zabbix
# pwd
/root/zabbix
# ls
Dockerfile kukulu_viewers.ps1 docker-compose.yml
# docker build -f Dockerfile -t zabbix-server-mysql:kukulu-cs-4.2.5 .
Sending build context to Docker daemon  6.656kB
Step 1/3 : FROM zabbix/zabbix-server-mysql:centos-4.2.5
centos-4.2.5: Pulling from zabbix/zabbix-server-mysql
8ba884070f61: Pull complete
eb1e527c78ca: Pull complete
(中略)
Successfully built 7dbeee2be493
Successfully tagged zabbix-server-mysql:kukulu-cs-4.2.5
# docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED              SIZE
zabbix-server-mysql          kukulu-cs-4.2.5     7dbeee2be493        About a minute ago   630MB
zabbix/zabbix-server-mysql   centos-4.2.5        80cd980c51d9        2 weeks ago          334MB
```

### docker-compose.ymlでマルチコンテナをデプロイ
docker-compose.ymlでZabbix-Server、MySQL、Apache、Zabbix-Agentの
4つのコンテナをデプロイしていきます。

```docker:docker-compose.yml
version: "3"
services:
  zabbix_db:
    image: mysql:5.7.24
    environment:
      - MYSQL_DATABASE=zabbix
      - MYSQL_USER=zabbix
      - MYSQL_PASSWORD=zabbix
      - MYSQL_ROOT_PASSWORD=zabbix
  zabbix_server:
    image: zabbix-server-mysql:kukulu-cs-4.2.5
    environment:
      - DB_SERVER_HOST=zabbix_db
      - MYSQL_DATABASE=zabbix
      - MYSQL_USER=zabbix
      - MYSQL_PASSWORD=zabbix
      - MYSQL_ROOT_PASSWORD=zabbix
    ports:
      - "10051:10051"
    links:
      - zabbix_db
  zabbix_web:
    image: zabbix/zabbix-web-apache-mysql:centos-4.2.5
    environment:
      - ZBX_SERVER_HOST=zabbix_server
      - DB_SERVER_HOST=zabbix_db
      - MYSQL_DATABASE=zabbix
      - MYSQL_USER=zabbix
      - MYSQL_PASSWORD=zabbix
      - MYSQL_ROOT_PASSWORD=zabbix
      - PHP_TZ=Asia/Tokyo
    ports:
      - 8080:80
    links:
      - zabbix_server
      - zabbix_db
  zabbix_agent:
    image: zabbix/zabbix-agent:centos-4.2.5
    privileged: true
    environment:
      - ZBX_SERVER_HOST=zabbix_server
    expose:
      - "10050"
    links:
      - zabbix_server                                                                                                                        

```
`docker-compose`でデプロイします。

```bash:docker-composeでデプロイ
# pwd
/root/zabbix
# docker-compose -f docker-compose.yml up -d
Pulling zabbix_db (mysql:5.7.24)...
5.7.24: Pulling from library/mysql
177e7ef0df69: Pull complete
(中略)
Creating zabbix_zabbix_db_1 ... done
Creating zabbix_zabbix_server_1 ... done
Creating zabbix_zabbix_agent_1  ... done
Creating zabbix_zabbix_web_1    ... done
# docker ps
CONTAINER ID        IMAGE                                         COMMAND                  CREATED             STATUS              PORTS                           NAMES
a6951d17c69e        zabbix/zabbix-web-apache-mysql:centos-4.2.5   "docker-entrypoint.sh"   50 seconds ago      Up 48 seconds       443/tcp, 0.0.0.0:8080->80/tcp   zabbix_zabbix_web_1
e114e5c4c8ca        zabbix/zabbix-agent:centos-4.2.5              "/sbin/tini -- /usr/…"   50 seconds ago      Up 48 seconds       10050/tcp                       zabbix_zabbix_agent_1
f26a0a605723        zabbix-server-mysql:kukulu-cs-4.2.5           "/sbin/tini -- /usr/…"   51 seconds ago      Up 49 seconds       0.0.0.0:10051->10051/tcp        zabbix_zabbix_server_1
e9a18fce90a2        mysql:5.7.24                                  "docker-entrypoint.s…"   52 seconds ago      Up 50 seconds       3306/tcp, 33060/tcp             zabbix_zabbix_db_1
#  docker-compose ps
         Name                       Command               State               Ports
-----------------------------------------------------------------------------------------------
zabbix_zabbix_agent_1    /sbin/tini -- /usr/bin/doc ...   Up      10050/tcp
zabbix_zabbix_db_1       docker-entrypoint.sh mysqld      Up      3306/tcp, 33060/tcp
zabbix_zabbix_server_1   /sbin/tini -- /usr/bin/doc ...   Up      0.0.0.0:10051->10051/tcp
zabbix_zabbix_web_1      docker-entrypoint.sh             Up      443/tcp, 0.0.0.0:8080->80/tcp
```
# Zabbixへログインし、外部チェックのアイテムを作成
Zabbixコンテナへログインします。

`http://<DockerサーバのIPアドレス>:8080`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198785/acdee9fe-1bfa-5a94-bd9b-14b0dbcc4f39.png)

Username:Admin
Password:zabbix

TOP画面が表示されます。

[Configuration]-[Hosts]でHost画面を表示して、[Zabbix server]列の[Items]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198785/4604bc76-33d0-ce52-4a01-42776c793933.png)

[Items]画面右上の[Create Item]ボタンを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198785/bd8c0fee-3657-c581-5afb-8241a7147364.png)

Name:お好みの名前でどうぞ
Type:External check
Key:kukulu_viewers.ps1 ※Dockerfileでコンテナへコピーしたスクリプト名

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198785/4170e480-efba-7c5a-392d-a8a54c53a1e8.png)

ここまで編集したら、画面最下部の[Add]を選択します。
[Item Added]と表示されたら準備OK。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198785/6c733304-53f8-47b1-6b0f-83edcadd42bd.png)

### 監視できているか確認
[Monitoring]-[Latest data]を選択し、
[Hosts]に[Zabbix server]を選択した状態で[Apply]を押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198785/1e36abde-0a00-ecd9-f418-625bedb0c66d.png)

先ほど作成したアイテム名のレコードがあると思うので、
右側の[Graph]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198785/99a030a0-f4ae-a363-dc76-65eea36a38ba.png)

取得できているのがわかれば完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198785/ae2f6ddc-5e92-c2df-4dd4-f12238050476.png)