mattintosh note

Hello Raspberry Pi!

Docker で CentOS 7 な Zabbix Server を立てる

Docker 覚えよーってことで Zabbix がすぐに使えるコンテナを作ることにした。

いまこんな状態。

  • LXC は使ってるけど Docker はほとんど使ってない
  • Mastodonインスタンスを作るときに Docker を触った
  • 知ってるよ!クジラのアレでしょアレ!!

つまりよく知らない。

Ubuntu に Docker を入れる

とりあえず Docker を使えるように。docker というパッケージはすでに Mac ライクなドックを実現するためのパッケージで使われているので Docker は docker.io というパッケージ。

$ sudo apt-get install docker.io

docker グループに所属していないと毎回 sudo することになるので usermodgpasswd で自分を docker グループに追加しておく。

$ sudo usermod -aG docker $UID

ここで一旦ログアウト。

イメージを入手する

docker images でローカルのイメージを見てみる。当然まだ何もない。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

docker searchcentos にマッチするものを探してみる。デフォルトの表示件数は25件まで。

$ docker search centos
NAME                           DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
centos                         The official build of CentOS.                   3475      [OK]
jdeathe/centos-ssh             CentOS-6 6.9 x86_64 / CentOS-7 7.3.1611 x8...   77                   [OK]
tutum/centos                   Simple CentOS docker image with SSH access      32
kinogmt/centos-ssh             CentOS with SSH                                 15                   [OK]
centos/postgresql-94-centos7   PostgreSQL 9.4 SQL database server              10
centos/mysql-57-centos7        MySQL 5.7 SQL database server                   8
centos/php-56-centos7          PHP 5.6 platform for building and running ...   6
centos/python-35-centos7       Python 3.5 platform for building and runni...   4
centos/mongodb-26-centos7      MongoDB 2.6 NoSQL database server               4
 :

オフィシャルなリポジトリだけに絞り込みたいときは -f|--filter オプションで is-official=true を追加する。

$ docker search -f is-official=true centos
NAME      DESCRIPTION                     STARS     OFFICIAL   AUTOMATED
centos    The official build of CentOS.   3475      [OK]

STARS が 3 以上のものに絞り込みたい場合は stars=3 とする。

$ docker search -f stars=3 centos
NAME                           DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
centos                         The official build of CentOS.                   3475      [OK]
jdeathe/centos-ssh             CentOS-6 6.9 x86_64 / CentOS-7 7.3.1611 x8...   77                   [OK]
tutum/centos                   Simple CentOS docker image with SSH access      32
kinogmt/centos-ssh             CentOS with SSH                                 15                   [OK]
centos/postgresql-94-centos7   PostgreSQL 9.4 SQL database server              10
centos/mysql-57-centos7        MySQL 5.7 SQL database server                   8
centos/php-56-centos7          PHP 5.6 platform for building and running ...   6
centos/mysql-56-centos7        MySQL 5.6 SQL database server                   4
centos/mongodb-26-centos7      MongoDB 2.6 NoSQL database server               4
centos/python-35-centos7       Python 3.5 platform for building and runni...   4
centos/redis                   Redis built for CentOS                          3                    [OK]

せっかくなので ubuntu も検索してみる。CentOS より星の数が多い。

$ docker search -f stars=3 ubuntu
NAME                     DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
ubuntu                   Ubuntu is a Debian-based Linux operating s...   6269      [OK]
rastasheep/ubuntu-sshd   Dockerized SSH service, built on top of of...   91                   [OK]
ubuntu-upstart           Upstart is an event-based replacement for ...   74        [OK]
neurodebian              NeuroDebian provides neuroscience research...   37        [OK]
ubuntu-debootstrap       debootstrap --variant=minbase --components...   30        [OK]
32bit/ubuntu             Ubuntu for i386 (32bit)                         30
armhf/ubuntu             Ubuntu is a Debian-based Linux operating s...   27
nuagebec/ubuntu          Simple always updated Ubuntu docker images...   22                   [OK]
tutum/ubuntu             Simple Ubuntu docker images with SSH access     18
ppc64le/ubuntu           Ubuntu is a Debian-based Linux operating s...   10
sameersbn/ubuntu                                                         9                    [OK]
aarch64/ubuntu           Ubuntu is a Debian-based Linux operating s...   9
nimmis/ubuntu            This is a docker images different LTS vers...   7                    [OK]
i386/ubuntu              Ubuntu is a Debian-based Linux operating s...   7
libmesos/ubuntu                                                          3
darksheer/ubuntu         Base Ubuntu Image -- Updated hourly             3                    [OK]

よくわからない場合は https://hub.docker.com/explore/ を見に行けばいいんじゃないかな。

とりあえず CentOS 入れましょう。NAME[:TAG] 書式でタグが指定できます。タグの一覧は https://hub.docker.com/r/library/centos/tags/ とかで。

$ docker pull centos:latest

端末上でタグの一覧が見たければ https://registry.hub.docker.com/v1/repositories/${name}/tags の結果を jq でパース。

$ curl -s 'https://registry.hub.docker.com/v1/repositories/centos/tags' | jq -r .[].name
latest
5
5.11
6
6.6
6.7
6.8
6.9
7
7.0.1406
7.1.1503
7.2.1511
7.3.1611
centos5
centos5.11
centos6
centos6.6
centos6.7
centos6.8
centos6.9
centos7
centos7.0.1406
centos7.1.1503
centos7.2.1511
centos7.3.1611

docker images でイメージを見てみます。名前やタグを指定すれば絞り込みができます。

$ docker images centos:latest
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              36540f359ca3        10 days ago         192.5 MB

コンテナを作る

docker run でコンテナを作ります。

  • -i|--interactive:接続されていなくても標準入力を開いたままにします
  • -t|--tty:疑似端末を割り当てます
  • --rm:コンテナを自動的に削除します
$ docker run -ti centos
[root@dd4b64cdb392 /]# cat /etc/system-release
CentOS Linux release 7.3.1611 (Core)
[root@dd4b64cdb392 /]#

別の端末で docker ps を使って稼働中のコンテナを確認してみる。

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
dd4b64cdb392        centos:latest       "/bin/bash"         38 seconds ago      Up 35 seconds                           hungry_blackwell

exit や Ctrl+d でコンテナを終了させる。デタッチだけであれば Ctrl+p, Ctrl+q。

今度は -d|--detach で起動。

$ docker run -dti centos
762ea423472ea002b3c28bb88841bc7a66ce5f3b2b7257404ecb022d1cc4d562
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
762ea423472e        centos              "/bin/bash"         7 seconds ago       Up 4 seconds                            modest_bose

docker exec でコマンドを与えればコンテナ内で実行してくれる。

$ docker exec modest_bose cat /etc/system-release
CentOS Linux release 7.3.1611 (Core)

アタッチ。

$ docker attach modest_bose
[root@762ea423472e /]#

別のシェルを起動してそっちでアタッチ。

$ docker exec -ti modest_bose /bin/bash
[root@762ea423472e /]#

デタッチしてまたアタッチの流れ。

$ docker run -ti centos
[root@f48847bbf999 /]# ここで Ctrl+p, Ctrl+q を押すとデタッチされる
$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
f48847bbf999        centos              "/bin/bash"         10 seconds ago      Up 6 seconds                            agitated_morse
$ docker attach agitated_morse
[root@f48847bbf999 /]#

コンテナ名は毎回変わるので固定したい場合は docker run --name my-container のように --name オプションでコンテナ名を指定すればよい。

コンテナが量産されるんだけど…

必要なものがあればコミットしときましょう。

$ docker commit コンテナ名 イメージ名

全部要らないならまとめて消せばいいんじゃないかな。

$ docker rm `docker ps -qa`

Zabbix サーバ用の Dockerfile を書くよ

Docker に簡単に慣れたところで Zabbix サーバを構築するための Dockerfile を書いてみることにした。

が、よくよく調べてみると docker build では --privileged オプションが使えないので systemd が動かないらしい。まぁなんとかなるだろ。

Dockerfile を作っている途中、何故か yum install zabbix-server-mysql をしても /usr/share/doc/zabbix-server-mysql-3.0.* が作成されず、SQL のテンプレートがコピーされない問題があった。yum install --downloadonlyyumdownloader zabbix-server-mysqlRPM を落としてきて RPM でインストールするとインストールされる…謎。

とりあえず今のところはローカル再インストールで済ませてる。

# yumdownloader zabbix-server-mysql
# rpm -ivh --replacepkgs zabbix-server-mysql-3.0.*.rpm
# rm -f zabbix-server-mysql-3.0.*.rpm

最初から入れるなら依存関係先に入れないと RPM が怒る。

# yum install -y http://repo.zabbix.com/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.0-1.el7.noarch.rpm
# yum install -y `yum deplist zabbix-server-mysql | awk '/provider:/{ print $2 }' | grep -v zabbix-server-mysql | sort -u`
# yumdownloader zabbix-server-mysql
# rpm -ivh zabbix-server-mysql-3.0.*.rpm
# rm -f zabbix-server-mysql-3.0.*.rpm

それか RPM をぶちまけるか。

# rpm2cpio zabbix-server-mysql-3.0.* | cpio -idmv

mysqld_safe はバックグラウンドで動かせないし、かなり無理矢理だけどとりあえずモノは出来た。Dockerfile は Gist で作業中。

$ git clone https://gist.github.com/6c7b79b48c11eec3181fc252dd5afb5a.git docker-test
$ cd docker-test
$ docker pull centos:centos7
$ docker build .
$ docker run -ti --name zabbix -p 80:80 -p 10051:10051 ${IMAGE_ID}

systemd で動くやつ作ろうよ

systemctl start zabbix-server したいじゃん?

centos:centos7 イメージからベースになる temp コンテナを作って --privileged/sbin/init を実行させておく。

$ docker run -dti --privileged --name temp centos:centos7 /sbin/init

temp コンテナで /bin/bash を起動。

$ docker exec -ti temp /bin/bash

コンテナの中にスクリプトをぶち込む。

localedef -i ja_JP -f UTF-8 /usr/lib/locale/ja_JP.UTF-8
yum install -y http://repo.zabbix.com/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.0-1.el7.noarch.rpm
yum install -y zabbix-server-mysql zabbix-web-mysql zabbix-web-japanese zabbix-agent mariadb-server
yumdownloader zabbix-server-mysql
rpm -ivh --replacepkgs zabbix-server-mysql-3.0.*.rpm
rm -f zabbix-server-mysql-3.0.*.rpm
systemctl start mariadb
systemctl enable mariadb
echo 'create database zabbix character set utf8 collate utf8_bin;' | mysql -uroot
echo 'grant all on zabbix.* to zabbix@localhost;' | mysql -uroot
zcat /usr/share/doc/zabbix-server-mysql-3.0.*/create.sql.gz | mysql -uzabbix zabbix
sed -i'' '/# php_value date\.timezone/{s|# ||;s|Europe/Riga|Asia/Tokyo|}' /etc/httpd/conf.d/zabbix.conf
systemctl start httpd
systemctl enable httpd
systemctl start zabbix-server
systemctl enable zabbix-server
systemctl start zabbix-agent
systemctl enable zabbix-agent
exit

temp コンテナから zabbix3.0 イメージを作成。サイズは約600MB。

$ docker commit temp zabbix3.0
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
zabbix3.0           latest              a3c42c570541        21 minutes ago      602.8 MB

temp コンテナを停止して削除。

$ docker stop temp
$ docker rm temp

run するときは --previleged を忘れずに。

$ docker run --privileged -d -p80:80 zabbix3.0 /sbin/init

これでいつでも Zabbix に会えるね!!!(特に嬉しくはない)

f:id:mattintosh4:20170716214352p:plain

会社内での説明用に撮ったもの。YouTubeエディタいいね。