2017年1月25日水曜日

docker-comose で JobScheduler のテスト環境を作る


DockerHUB で公開している SOS JobScheduler のイメージを使って簡単にテスト環境を作れます。

使用した環境は以下のとおり。VirtualBoxの仮想マシンを使用しています。
  • Dockerホスト: CentOS7.3
  • Docker: 1.10.3

docker-compose インストール


まず、Dockerホストに docker-compose をインストールします。
[root@centos0702 sosjs]# pip install docker-compose

docker-compose.yml 作成


次に docker-compose の 設定ファイルを作成します。
今回は、sosjs ディレクトリを作って、そこに設定ファイルを作りました。
[root@centos0702 sosjs]# cat docker-compose.yml
jobscheduler:
  image: floedermann/jobscheduler
  links:
    - db:mysql
  volumes_from:
    - datastore
  ports:
    - "4444:4444"
    - "40444:40444"

db:
  image: mariadb
  environment:
    MYSQL_USER: jobscheduler
    MYSQL_PASSWORD: jobscheduler
    MYSQL_ROOT_PASSWORD: scheduler
    MYSQL_DATABASE: jobscheduler

datastore:
   image: busybox
   command: /bin/true
   volumes:
     - /opt/jobscheduler/data/scheduler/config/live

dockerコンテナ起動


上記の docker-compose.yml があるディレクトリで下記コマンドを実行すると、DockerHUBからイメージをダウンロードしてDockerコンテナが起動します。
[root@centos0702 sosjs]# docker-compose up -d
Pulling db (mariadb:latest)...
Trying to pull repository docker.io/library/mariadb ...
latest: Pulling from docker.io/library/mariadb
5040bd298390: Pull complete
55370df68315: Pull complete
fad5195d69cc: Pull complete
a1034a5fbbfc: Pull complete
eb46f36a6163: Pull complete
de7067e4ea0a: Pull complete
fc40d1291bb9: Pull complete
aff5d18aeeef: Pull complete
1c729aed3f3d: Pull complete
ed7e90870837: Pull complete
8ae91f5b8acf: Pull complete
aa554fbac13d: Pull complete
Digest: sha256:ed04792bb13c111cbd1743c2921ea6cf777051a7f7f51f7b134efec9af7afdad
Status: Downloaded newer image for docker.io/mariadb:latest
Pulling datastore (busybox:latest)...
Trying to pull repository docker.io/library/busybox ...
latest: Pulling from docker.io/library/busybox
4b0bc1c4050b: Pull complete
Digest: sha256:817a12c32a39bbe394944ba49de563e085f1d3c5266eb8e9723256bc4448680e
Status: Downloaded newer image for docker.io/busybox:latest
Pulling jobscheduler (floedermann/jobscheduler:latest)...
Trying to pull repository docker.io/floedermann/jobscheduler ...
latest: Pulling from docker.io/floedermann/jobscheduler
386a066cd84a: Pull complete
75ea84187083: Pull complete
88b459c9f665: Pull complete
690dbea0e4ca: Pull complete
7e401cdd6f18: Pull complete
a58186ddf9a0: Pull complete
49999ed55bc4: Pull complete
eb40561aad8f: Pull complete
5e1e63d48c1f: Pull complete
09d7ed6ff6b2: Pull complete
6ba4b48aec7a: Pull complete
f8db429f8b8b: Pull complete
Digest: sha256:79e7ce0cf75c6f3ceddb36c4f1d26a8cf907e8504a77c5afb402c59efd5d5290
Status: Downloaded newer image for docker.io/floedermann/jobscheduler:latest
Creating sosjs_datastore_1
Creating sosjs_db_1
Creating sosjs_jobscheduler_1

これでテスト環境の出来上がりです。Dockerコンテナは3つ作成されました。
[root@centos0702 sosjs]# docker ps -a
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS                     PORTS                                                         NAMES
d176b06f4975        floedermann/jobscheduler   "bash /opt/startup_sc"   5 minutes ago       Up 5 minutes               0.0.0.0:4444->4444/tcp, 0.0.0.0:40444->40444/tcp, 48444/tcp   sosjs_jobscheduler_1
028298731ab1        mariadb                    "docker-entrypoint.sh"   5 minutes ago       Up 5 minutes               3306/tcp                                                      sosjs_db_1
969de82ce298        busybox                    "/bin/true"              5 minutes ago       Exited (0) 5 minutes ago                                                                 sosjs_datastore_1

sosjs_jobscheduler_1とsosjs_db_1 は Up しています。
sosjs_datastore_1 は live フォルダを Dockerホストのディレクトリにマウントするだけなので、Status は Exited でOKです。

JobSchedulerの起動に成功していれば、以下のようにログが表示されます。
[root@centos0702 sosjs]# docker logs sosjs_jobscheduler_1 2>&1 | tail
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f8f284b8000)
        libstdc++.so.6 => /opt/jobscheduler/scheduler/lib/libstdc++.so.6 (0x00007f8f281a1000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f8f27ea0000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8f27af5000)
        libgcc_s.so.1 => /opt/jobscheduler/scheduler/lib/libgcc_s.so.1 (0x00007f8f278de000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f8f29311000)
Starting JobScheduler...
[ Processing finished ]
[ Writing the uninstaller data ... ]
[ Automated installation done ]

JOCへのアクセス


JOC にアクセスしたい場合は下記URLです。
http://<DockerホストのIPアドレス>:4444/
下図のように JOC が表示されます。
JobScheduler のバージョンは、1.10.6 です。


liveフォルダでのJOB定義


JOEは付属していないので、エディタでJOB定義のXMLファイル作成して live フォルダに格納します。
jobschedulerコンテナの live フォルダは、Dockerホストにマウントされています。
下記コマンドで、マウント先のディレクトリを探します。
[root@centos0702 sosjs]# docker inspect sosjs_jobscheduler_1 | grep -A 10 '"Mounts": '
        "Mounts": [
            {
                "Name": "8d80484c3b0c346960bfb10f49eb634b55e726e53096af5e49392ffee849e55c",
                "Source": "/var/lib/docker/volumes/8d80484c3b0c346960bfb10f49eb634b55e726e53096af5e49392ffee849e55c/_data",
                "Destination": "/opt/jobscheduler/data/scheduler/config/live",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],

赤字部分が、Dockerホストのマウント先です。
ここに ジョブ定義の xml ファイルなどを格納すればテストできます。
[root@centos0702 sosjs]# ls /var/lib/docker/volumes/8d80484c3b0c346960bfb10f49eb634b55e726e53096af5e49392ffee849e55c/_data
sos

コンテナの入れ替え


liveフォルダのマウント先がわかりずらいので任意の場所に変更してみます。
docker-compose.yml を修正します。
下記の例では、docker-compose.yml と同じ場所にある live ディレクトリにマウントします。
datastore:
   image: busybox
   command: /bin/true
   volumes:
     - ./live:/opt/jobscheduler/data/scheduler/config/live

下記コマンドを実行するとコンテナを作り直して、入れ替えてくれます。
[root@centos0702 sosjs]# docker-compose up -d
sosjs_db_1 is up-to-date
Recreating sosjs_datastore_1
Recreating sosjs_jobscheduler_1

これで、JOB定義を置く場所が、./live ディレクトリに変更になります。
[root@centos0702 sosjs]# ls -l
合計 4
-rw-r--r-- 1 root root 473  1月 24 09:44 docker-compose.yml
drwxr-xr-x 5 root root  48  1月 23 22:53 live

コンテナへのアクセス


デフォルトは英語環境なので、日本語環境に設定変更したい場合などはJobSchedulerコンテナに入ります。
JobSchedulerのDockerコンテナに入りたい場合は以下のようにします。
JobScheduler は /opt と /root/install にインストールされています。
[root@centos0702 sosjs]# docker exec -it sosjs_jobscheduler_1 /bin/bash
root@d176b06f4975:/# ls /opt/
jobscheduler  startup_scheduler.sh

DB(mariadb)のDockerコンテナに入りたい場合は以下のようにします。
mysql コマンドでDBに接続できます。
[root@centos0702 sosjs]# docker exec -it sosjs_db_1 /bin/bash
root@028298731ab1:/# env
MARIADB_MAJOR=10.1
HOSTNAME=028298731ab1
MYSQL_DATABASE=jobscheduler
MYSQL_PASSWORD=jobscheduler
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
GPG_KEYS=199369E5404BD5FC7D2FE43BCBCB082A1BB943DB       430BDF5C56E7C94E848EE60C1C4CBDCDCD2EFD2A        4D1BB29D63D98E422B2113B19334A25F8507EFA5
PWD=/
SHLVL=1
HOME=/root
GOSU_VERSION=1.7
MYSQL_USER=jobscheduler
MARIADB_VERSION=10.1.21+maria-1~jessie
MYSQL_ROOT_PASSWORD=scheduler
_=/usr/bin/env
root@028298731ab1:/# mysql --user=jobscheduler --password=jobscheduler jobscheduler
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 24
Server version: 10.1.21-MariaDB-1~jessie mariadb.org binary distribution

Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [jobscheduler]> 

コンテナの起動/停止


テスト環境コンテナは、以下のコマンドで一括して停止できます。
[root@centos0702 sosjs]# docker-compose stop
Stopping sosjs_jobscheduler_1 ... done
Stopping sosjs_db_1 ... done
[root@centos0702 sosjs]# docker ps -a
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS                        PORTS               NAMES
d176b06f4975        floedermann/jobscheduler   "bash /opt/startup_sc"   22 minutes ago      Exited (137) 14 seconds ago                       sosjs_jobscheduler_1
028298731ab1        mariadb                    "docker-entrypoint.sh"   22 minutes ago      Exited (0) 10 seconds ago                         sosjs_db_1
969de82ce298        busybox                    "/bin/true"              22 minutes ago      Exited (0) 22 minutes ago                         sosjs_datastore_1

一括して開始したい場合は、以下のコマンドです。
[root@centos0702 sosjs]# docker-compose start
Starting db ... done
Starting datastore ... done
Starting jobscheduler ... done
[root@centos0702 sosjs]# docker ps -a
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS                      PORTS                                                         NAMES
d176b06f4975        floedermann/jobscheduler   "bash /opt/startup_sc"   23 minutes ago      Up 14 seconds               0.0.0.0:4444->4444/tcp, 0.0.0.0:40444->40444/tcp, 48444/tcp   sosjs_jobscheduler_1
028298731ab1        mariadb                    "docker-entrypoint.sh"   23 minutes ago      Up 19 seconds               3306/tcp                                                      sosjs_db_1
969de82ce298        busybox                    "/bin/true"              23 minutes ago      Exited (0) 19 seconds ago                                                                 sosjs_datastore_1

コンテナの状態は "docker-compose ps" でも確認できます。
なお、"docker-compose stop" したあと "docker-compose start" した場合、jobscheduler が起動しないので(link を使ってるから?)、stop したら "docker-compose up -d"  で起動します。

コンテナの破棄


テスト環境が不要になったら、下記コマンドで 一括コンテナを削除できます。
[root@centos0702 sosjs]# docker-compose stop
Stopping sosjs_jobscheduler_1 ... done
Stopping sosjs_db_1 ... done
[root@centos0702 sosjs]# docker-compose rm
Going to remove sosjs_jobscheduler_1, sosjs_db_1, sosjs_datastore_1
Are you sure? [yN] y
Removing sosjs_jobscheduler_1 ... done
Removing sosjs_db_1 ... done
Removing sosjs_datastore_1 ... done

"docker-compose down" を実行すると、stop と rm を実施してくれます。