Docker上でGridDBを実行する

近年、コンテナは注目されています。新しいソフトウェアを使い始めるのは、驚くほど簡単な方法です。GridDBも例外ではありません。 DockerにGridDBコンテナをデプロイしてコードをテストおよび開発できる簡単な手順がいくつかあります。

基本的なプロセスは次のとおりです。

  1. ドッカーとその他の前提条件をダウンロードします。
  2. Dockerイメージを作成します。
  3. コンテナを実行します。
  4. サンプルコードをビルドし実行します。

この記事はすべてを網羅するものではなく、開発者が基本的なコードを試すことができるようにDockerでGridDBサーバを実行するための簡単な方法を記述したものです。 GridDBとDockerを外部アクセスを持つ実稼働環境に配置する場合は、他にも多くの考慮事項がありますのでご注意ください。

Dockerと、必要なモジュールをダウンロードする

  1. ご使用のプラットフォームのhttps://www.docker.com/get-dockerからDockerをダウンロードしてインストールします。 この記事では、DockerをMacOSXで使用しました。
  2. Oracle JDK (Linux x64 RPMパッケージ)をhttp://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.htmlからダウンロードします.
  3. Dockerを使用して、CentOSベースイメージをダウンロードします。 6.7か6.8、または6.9が動作します。
    $ docker pull centos:6.8
    6.8: Pulling from library/centos
    67f15db7c18f: Pull complete
    Digest: sha256:37ee2dcd9a3a430136b566efb4aa1111ed332bfdef8b0de51a25d26891689fd7
    Status: Downloaded newer image for centos:6.8

Dockerイメージを構築する

最初に、Dockerイメージを作成するために必要なファイルを格納する空のディレクトリを作成します。

  1. 先ほどダウンロードしたJava JDKをこのディレクトリに配置します。
  2. 以下の内容のDockerfileによって使用されるgriddb.shという名前のファイルを作成します。
    #!/bin/bash
    export GS_HOME=/var/lib/gridstore/
    export GS_LOG=/var/lib/gridstore/log
  3. 以下のように「Dockerfile」という名前のファイルを作成します。
    FROM centos:6.8
    
    RUN set -x &&\
    HOST=`hostname` && \
    sed -i "s/^\(HOSTNAME=\).*/\1$HOST/" /etc/sysconfig/network && \
    rpm -Uvh https://github.com/griddb/griddb_nosql/releases/download/v3.0.0/griddb_nosql-3.0.0-1.linux.x86_64.rpm
    
    RUN set -x &&\
    su - gsadm -c "gs_passwd admin -p admin"
    
    RUN set -x && \
    sed -i -e s/\"clusterName\":\"\"/\"clusterName\":\"dockerGridDB\"/g \
    -e s/\"replicationNum\":2/\"replicationNum\":1/g /var/lib/gridstore/conf/gs_cluster.json
    
    ADD jdk-8u121-linux-x64.rpm /tmp
    
    RUN set -x && \
    rpm -Uvh /tmp/jdk-8u121-linux-x64.rpm
    
    CMD su - gsadm -c \
    "gs_startnode -u admin/admin -w 0 && gs_joincluster -c dockerGridDB -n 1 -u admin/admin" &&\
    tail -f /dev/null
    

    Dockerfileを作成したら、次のコマンドでイメージを作成することができます。

    $ docker build -t docker-griddb .
    Step 1/7 : FROM centos:6.8
     ---> ab44245321a8
    Step 2/7 : RUN set -x &&	HOST=`hostname` && 	sed -i "s/^\(HOSTNAME=\).*/\1$HOST/" /etc/sysconfig/network && 	rpm -Uvh https://github.com/griddb/griddb_nosql/releases/download/v3.0.0/griddb_nosql-3.0.0-1.linux.x86_64.rpm
     ---> Running in b723cc52a3a6
    ++ hostname
    + HOST=0de5ce56403a
    + sed -i 's/^\(HOSTNAME=\).*/\10de5ce56403a/' /etc/sysconfig/network
    + rpm -Uvh https://github.com/griddb/griddb_nosql/releases/download/v3.0.0/griddb_nosql-3.0.0-1.linux.x86_64.rpm
    Retrieving https://github.com/griddb/griddb_nosql/releases/download/v3.0.0/griddb_nosql-3.0.0-1.linux.x86_64.rpm
    Preparing...                ##################################################
    
    ------------------------------------------------------------
    Information:
      User gsadm and group gridstore have been registered.
      GridDB uses new user and group.
    ------------------------------------------------------------
    
    griddb_nosql                ##################################################
     ---> e742811e19c1
    Removing intermediate container b723cc52a3a6
    Step 3/7 : RUN set -x &&	su - gsadm -c "gs_passwd admin -p admin"
     ---> Running in bb1e0fff55d6
    + su - gsadm -c 'gs_passwd admin -p admin'
     ---> 13efc76ae454
    Removing intermediate container bb1e0fff55d6
    Step 4/7 : RUN set -x && 	sed -i -e s/\"clusterName\":\"\"/\"clusterName\":\"dockerGridDB\"/g 		-e s/\"replicationNum\":2/\"replicationNum\":1/g /var/lib/gridstore/conf/gs_cluster.json
     ---> Running in 7f0e0d4dd443
    + sed -i -e 's/"clusterName":""/"clusterName":"dockerGridDB"/g' -e 's/"replicationNum":2/"replicationNum":1/g' /var/lib/gridstore/conf/gs_cluster.json
     ---> 9fc93177a6d6
    Removing intermediate container 7f0e0d4dd443
    Step 5/9 : ADD griddb.sh /etc/profile.d/
     ---> 2950c8327419
    Removing intermediate container 520da00ea008
    Step 6/9 : RUN set -x && 	chmod +x /etc/profile.d/griddb.sh
     ---> Running in 1882151bf8f8
    + chmod +x /etc/profile.d/griddb.sh
     ---> 610c1a75042d
    Removing intermediate container 1882151bf8f8
    Step 7/7 : ADD jdk-8u121-linux-x64.rpm /tmp
     ---> 82e290734a6d
    Removing intermediate container 438a4b84f818
    Step 8/9 : RUN set -x && 	rpm -Uvh /tmp/jdk-8u121-linux-x64.rpm
     ---> Running in 73335ba1f265
    + rpm -Uvh /tmp/jdk-8u121-linux-x64.rpm
    Preparing...                ##################################################
    jdk1.8.0_121                ##################################################
    Unpacking JAR files...
    	tools.jar...
    	plugin.jar...
    	javaws.jar...
    	deploy.jar...
    	rt.jar...
    	jsse.jar...
    	charsets.jar...
    	localedata.jar...
     ---> 831d58936710
    Removing intermediate container 73335ba1f265
    Step 9/9 : CMD su - gsadm -c 	"gs_startnode -u admin/admin -w 0 && gs_joincluster -c dockerGridDB -n 1 -u admin/admin" &&	tail -f /dev/null
     ---> Running in 5143de19c598
     ---> 944a0436f719
    Removing intermediate container 5143de19c598
    Successfully built 944a0436f719
    

実行する

$ docker run docker-griddb
..
Started node.

Docker psでコンテナが動作しているのが以下のように確認できます。

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
f10c6cb4a3af        griddb-docker       "/bin/sh -c 'su - ..."   39 seconds ago      Up 38 seconds                           jovial_morse

コンテナIDは重要です。以下に示すように、例えばgs_stat情報を見るためのexecのような他のドッカーコマンドの引数として使用されます。

$ docker exec f10c su - -c "gs_stat -u admin/admin"
{
    "checkpoint": {
        "endTime": 1491496340738,
        "mode": "RECOVERY_CHECKPOINT",
        "normalCheckpointOperation": 0,
        "pendingPartition": 0,
        "requestedCheckpointOperation": 0,
        "startTime": 1491496340586
    },
    "cluster": {
        "activeCount": 1,
        "clusterName": "dockerGridDB",
        "clusterStatus": "MASTER",
        "designatedCount": 1,
        "loadBalancer": "ACTIVE",
        "master": {
            "address": "172.17.0.2",
            "port": 10040
        },
        "nodeList": [
            {
                "address": "172.17.0.2",
                "port": 10040
            }
        ],
        "nodeStatus": "ACTIVE",
        "notificationMode": "MULTICAST",
        "partitionStatus": "NORMAL",
        "startupTime": "2017-04-06T16:32:18Z",
        "syncCount": 2
    },
    "currentTime": "2017-04-06T16:47:00Z",
    "performance": {
        "batchFree": 0,
        "checkpointFileAllocateSize": 65536,
        "checkpointFileSize": 65536,
        "checkpointFileUsageRate": 0,
        "checkpointMemory": 0,
        "checkpointMemoryLimit": 1073741824,
        "checkpointWriteSize": 0,
        "checkpointWriteTime": 0,
        "currentCheckpointWriteBufferSize": 0,
        "currentTime": 1491497220407,
        "numConnection": 2,
        "numSession": 0,
        "numTxn": 0,
        "peakProcessMemory": 312152064,
        "processMemory": 312152064,
        "recoveryReadSize": 65536,
        "recoveryReadTime": 0,
        "storeCompressionMode": "NO_BLOCK_COMPRESSION",
        "storeDetail": {
            "batchFreeMapData": {
                "storeMemory": 0,
                "storeUse": 0,
                "swapRead": 0,
                "swapWrite": 0
            },
            "batchFreeRowData": {
                "storeMemory": 0,
                "storeUse": 0,
                "swapRead": 0,
                "swapWrite": 0
            },
            "mapData": {
                "storeMemory": 0,
                "storeUse": 0,
                "swapRead": 0,
                "swapWrite": 0
            },
            "metaData": {
                "storeMemory": 0,
                "storeUse": 0,
                "swapRead": 0,
                "swapWrite": 0
            },
            "rowData": {
                "storeMemory": 0,
                "storeUse": 0,
                "swapRead": 0,
                "swapWrite": 0
            }
        },
        "storeMemory": 0,
        "storeMemoryLimit": 1073741824,
        "storeTotalUse": 0,
        "swapRead": 0,
        "swapReadSize": 0,
        "swapReadTime": 0,
        "swapWrite": 0,
        "swapWriteSize": 0,
        "swapWriteTime": 0,
        "syncReadSize": 0,
        "syncReadTime": 0,
        "totalLockConflictCount": 0,
        "totalReadOperation": 0,
        "totalRowRead": 0,
        "totalRowWrite": 0,
        "totalWriteOperation": 0
    },
    "recovery": {
        "progressRate": 1
    },
    "version": "3.0.0-27877 CE"
}

サンプルコードのビルドと実行

この記事で説明したように、EclipseのようなGridDBソースコードをビルドするにはいくつかの方法がありますが、今回のような単純なケースでは、コンテナ内のJDKを使用してサンプルアプリケーションを構築します。 以下のようにコンテナ内のシェルを起動します。

$ docker exec -it f10c bash

次に、以下のコマンドを実行します。

# export CLASSPATH=/usr/share/java/gridstore.jar:$CLASSPATH
# mkdir gsSample
# cp /usr/griddb-3.0.0/docs/sample/program/Sample1.java gsSample/
# javac gsSample/Sample1.java
# java gsSample/Sample1 239.0.0.1 31999 dockerGridDB admin admin
name=name02 status=false count=2 lob=[65, 66, 67, 68, 69, 70, 71, 72, 73, 74]

おめでとうございます!これで、コンテナからGridDBサンプルを実行できます。 ホストからコンテナにファイルをコピーしたい場合は、以下を使用して簡単に実行することができます。

$ docker cp sourceFile containerId:destinationPath

ブログの内容について疑問や質問がある場合は Q&A サイトである Stack Overflow に質問を投稿しましょう。 GridDB 開発者やエンジニアから速やかな回答が得られるようにするためにも "griddb" タグをつけることをお忘れなく。 https://stackoverflow.com/questions/ask?tags=griddb

One Comment

  1. […] DevOpsの登場により、ソフトウェアサービスを開発、公開、および運用する開発者とシステム管理者の数が増加しました。 最近では、Docker、Kubernetes、Jenkinsなどのソフトウェアが開発者によく使われています。このブログでは、以前投稿したDockerに関するブログ記事に基づいてGridDBサーバー、Pythonクライアント、Javaクライアントを構築し、開発者が簡単にカスタマイズ可能なコンテナをデプロイするためのDockerfileと起動スクリプトを紹介します。 […]

Leave a Reply

Your email address will not be published. Required fields are marked *