本文へジャンプ

GridDB Dockerfileサンプル 説明書

Revision: 4.6.0-400

1 はじめに

1.1 本書の目的

本書ではGridDB Dockerfileサンプルの利用方法について説明します。

1.2 注意事項

本サンプルはインターネットへの接続ができることを前提とします。プロキシ経由でインターネットに接続する環境の場合、Dockerfileサンプルのプロキシ設定箇所のコメントを解除してご利用ください。

2 GridDB Dockerfileサンプル

2.1 概要

GridDB DockerfileサンプルはGridDBクラスタやクライアントのDockerコンテナを作成するサンプルです。 Dockerホスト上でGridDBクラスタやクライアントを動作させることができます。

2.2 アーキテクチャ

GridDB Dockerfileサンプルは以下の2種類のDockerfileサンプルを提供します。

  • GridDBサーバコンテナ用Dockerfile

    GridDBのサーバモジュールが起動するコンテナです。

  • GridDBクライアントコンテナ用Dockerfile

    GridDBの運用ツール、SQLインタフェース、Javaライブラリ、WebAPIを利用できるコンテナです。

ユーザはDockerfileサンプルをビルドしてコンテナイメージを生成します。コンテナイメージをコンテナ実行環境で起動することで、GridDBを動作させます。また、コンテナレジストリにコンテナイメージを登録し、コンテナ実行環境に呼び出すことができます。

GridDB Dockerコンテナの利用形態

2.3 ファイル構成

  • Docker_server/: GridDBサーバコンテナビルド用ディレクトリ
    • rpm/: GridDBインストーラ格納用ディレクトリ
    • Dockerfile_server
    • docker-entrypoint_server.sh
  • Docker_client/: GridDBクライアントコンテナビルド用ディレクトリ
    • 3rd/: 外部ソフトウェア格納用ディレクトリ
    • rpm/: GridDBインストーラ格納用ディレクトリ
    • Dockerfile_client
    • docker-entrypoint_client.sh
  • Provider/:
    • Provider
    • provider.json
  • sample/:
    • JDBCClient.java
    • MultiNodesClient.java
  • docker-compose.yml: Docker compose用コンテナ起動設定ファイル
  • .env: GridDBコンテナ用環境変数設定ファイル

2.4 動作環境

本サンプルは以下の環境で動作を確認しています。

  • オンプレミス環境

    • ホストOS: RHEL / CentOS 7.6
    • コンテナランタイム: Docker CE 19.03(Docker composeを含む)
  • Microsoft Azure環境

    • Azure VM (CentOS 7.5)
    • Azure Container Instance (ACI)
    • Azure Container Registry (ACR)

本サンプルはGridDB V4.5 Enterprise Editionで動作を確認しています。

3 オンプレミスサーバ上のGridDB Dockerfileサンプル利用方法

3.1 Dockerコンテナをビルドする

3.1.1 GridDBサーバコンテナをビルドする

下記のrpmファイルをDocker_server\rpmディレクトリにコピーします。

$ ls rpm
griddb-ee-client-4.5.0-linux.x86_64.rpm
griddb-ee-server-4.5.0-linux.x86_64.rpm

Docker_serverディレクトリ内で以下のコマンドを実行し、Dockerfileをビルドします。

$ docker build -t griddb/griddb-server:4.5 -f Dockerfile_server .

3.1.2 GridDBクライアントコンテナをビルドする

下記のrpmファイルをDocker_client\rpmディレクトリにコピーします。

$ ls rpm
griddb-ee-client-4.5.0-linux.x86_64.rpm
griddb-ee-java_lib-4.5.0-linux.x86_64.rpm
griddb-ee-webapi-4.5.0-linux.x86_64.rpm
griddb-ee-webui-4.5.0-linux.x86_64.rpm

以下のソフトウェアのモジュールをDocker_client\3rdディレクトリにコピーします。

  • Java SE 8 (jdk-8uXXX-linux-x64.rpm)

Docker_clientディレクトリ内で以下のコマンドを実行し、Dockerfileをビルドします。

$ docker build -t griddb/griddb-client:4.5 -f Dockerfile_client .

3.2 Dockerコンテナを起動する

3.2.1 GridDBサーバコンテナを起動する

以下のコマンドにより、前節でビルドしたGridDBサーバコンテナを起動します。

$ docker run -d --name <docker_container_name> \
    -e GRIDDB_CLUSTERNAME=<cluster_name> \
    -e GRIDDB_NODE_NUM=<node_number> \
    -e NOTIFICATION_ADDRESS=<notification_address> \
    griddb/griddb-server:4.5

サーバコンテナの起動時には、以下の環境変数を指定します。

環境変数名 説明 デフォルト値
GRIDDB_CLUSTERNAME クラスタ名 myCluster
GRIDDB_NODE_NUM クラスタに所属するノード数 1
NOTIFICATION_ADDRESS 【マルチキャスト方式で指定】マルチキャストアドレス (*1)
NOTIFICATION_MEMBER 【固定リスト方式で指定】各ノードのネットワーク通信IPアドレス一覧(半角カンマ区切り) (*1)
NOTIFICATION_PROVIDER 【プロバイダ方式で指定】プロバイダのURL (*1)
SERVICE_ADDRESS GridDBノードのIPアドレス(クラスタ内、クライアント間通信用) -

(*1) いずれか1種類のみ指定必須

3.2.2 GridDBクライアントコンテナを起動する

以下のコマンドにより、前節でビルドしたGridDBクライアントコンテナを起動します。

$ docker run -d --name <docker_container_name> \
    -e GRIDDB_NODE=<node_ip> \
    -e GRIDDB_PORT=<node_operation_port> \
    griddb/griddb-client:4.5

クライアントコンテナの起動時には、以下の環境変数を指定します。

環境変数名 説明 デフォルト値
GRIDDB_NODE クラスタに属するGridDBサーバノードのIPアドレス(いずれか一つ) -(必須)
GRIDDB_PORT GridDB運用管理操作用ポート -(必須)

3.3 GridDBクラスタを起動する(同一Dockerホスト上)

3.3.1 単一ノード構成の場合

  • GridDBクラスタ起動

    単一のGridDBサーバコンテナを起動し、単一ノード構成のクラスタを構築します。

    以下のコマンドを実行します。コンテナ名はgriddbになります。

    $ docker run -d --name griddb \
        -e GRIDDB_CLUSTERNAME=<cluster_name> \
        -e GRIDDB_NODE_NUM=1 \
        -e NOTIFICATION_ADDRESS=<notification_address> \
        griddb/griddb-server:4.5
    

    GridDBホームディレクトリをDockerボリュームとして永続化する場合は、"--mount"オプションを追加します。

    $ docker run -d --name griddb \
        -e GRIDDB_CLUSTERNAME=<cluster_name> \
        -e GRIDDB_NODE_NUM=1 \
        -e NOTIFICATION_ADDRESS=<notification_address> \
        --mount source=<volume_name>,target=/var/lib/gridstore/ \
        griddb/griddb-server:4.5
    
  • GridDBクライアントから接続

    NoSQL APIで接続:

    $ cd sample
    $ javac -cp /usr/share/java/gridstore.jar SingleNodeClient.java
    $ java -cp .:/usr/share/java/gridstore.jar SingleNodeClient <IP Address> 10001 myCluster
    

    JDBCで接続:

    $ cd sample
    $ javac JDBCClient.java
    $ java -cp .:/usr/share/java/gridstore-jdbc.jar JDBCClient <IP Address> 20001 myCluster
    
  • GridDBクライアントコンテナから接続

    起動済みのGridDBサーバを指定し、GridDBクライアントコンテナを起動します。

    $ docker run -d --name griddb-client \
        --link <container_name>:griddb \
        griddb/griddb-client:4.5
    

3.3.2 複数ノード構成の場合

以下では、3つのGridDBサーバコンテナを起動し、3ノード構成のクラスタを構築します。同一Dockerホスト上にクライアントコンテナも起動します。また、コンテナそれぞれのGridDBホームディレクトリをDockerボリュームとして永続化します。

同一Dockerホスト上のGridDBクラスタ

同梱のdocker-compose.ymlを用いて、Docker composeによってクライアントを含む複数コンテナを一度に起動することができます。

version: '3'
services:
    griddb1:
        container_name: myNode1
        image: griddb-server:${GRIDDB_VERSION}
        build:
            context: ./Docker_server
            dockerfile: Dockerfile_server
        env_file: .env
        networks:
            griddb_net:
                ipv4_address: ${IPADDR_NODE1}
        volumes:
            - "node1:/var/lib/gridstore/"
    griddb2:
        container_name: myNode2
        image: griddb-server:${GRIDDB_VERSION}
        env_file: .env
        networks:
            griddb_net:
                ipv4_address: ${IPADDR_NODE2}
        volumes:
            - "node2:/var/lib/gridstore/"
    griddb3:
        container_name: myNode3
        image: griddb-server:${GRIDDB_VERSION}
        env_file: .env
        networks:
            griddb_net:
                ipv4_address: ${IPADDR_NODE3}
        volumes:
            - "node3:/var/lib/gridstore/"
    client:
        container_name: client
        image: griddb-client:${GRIDDB_VERSION}
        build:
            context: ./Docker_client
            dockerfile: Dockerfile_client
        env_file: .env
        networks:
            griddb_net:
                ipv4_address: ${IPADDR_CLIENT}
        volumes:
            - "client:/var/lib/gridstore/log"
        depends_on:
            - "griddb1"
            - "griddb2"
            - "griddb3"
        ports:
            - 8080:8080
            - 8081:8081

volumes:
    node1:
    node2:
    node3:
    client:
        
networks:
    griddb_net:
        driver: bridge
        ipam:
            config:
                - subnet: ${SUBNET} 

GridDB Dockerfileサンプルでは、3.2節で説明したコンテナ起動用の環境変数およびdocker-compose実行時に使用する環境変数を.envファイルに定義できます。構築するGridDBクラスタの接続方式(マルチキャスト、固定リスト、プロバイダ)に応じて、対応する環境変数を定義してください。 .envファイルに定義できる環境変数は以下です。

環境変数名 説明
GRIDDB_NODE_NUM クラスタに所属するノード数 3
GRIDDB_CLUSTERNAME クラスタ名 dockerCluster
GRIDDB_VERSION バージョン 4.5
NOTIFICATION_ADDRESS 【マルチキャスト方式で指定】マルチキャストアドレス 239.0.0.1
NOTIFICATION_MEMBER 【固定リスト方式で指定】各ノードのネットワーク通信IPアドレス一覧(半角カンマ区切り) 172.18.0.2,172.18.0.3,172.18.0.4
NOTIFICATION_PROVIDER 【プロバイダ方式で指定】プロバイダのURL http://providerhost/provider.json
GRIDDB_NODE クラスタに属するGridDBノードのIPアドレス(いずれか一つ) 172.18.0.2
GRIDDB_PORT GridDB運用管理操作用ポート 10040
IPADDR_NODE1 myNode1のIPアドレス 172.18.0.2
IPADDR_NODE2 myNode2のIPアドレス 172.18.0.3
IPADDR_NODE3 myNode3のIPアドレス 172.18.0.4
IPADDR_CLIENT clientのIPアドレス 172.18.0.5
SUBNET クラスタが属するサブネット 172.18.0.0/24

3.4 GridDBクラスタを起動する(複数Dockerホスト上)

前節の同一Dockerホスト上に複数コンテナを起動する方法は、以下の点でクラスタリングのメリットを十分に得られません。

  • ノードの冗長性による可用性の担保
  • 独立したリソースの並列利用による高速処理

複数のDockerホスト上でGridDBクラスタを構築することで、これらのメリットをより得られるようになります。

3.4.1 マルチキャスト方式によるクラスタ構築

マルチキャスト方式でクラスタを構築する場合は、Dockerネットワークをhostモードで構築してください。

以下はhostネットワークによる三台のDockerホスト上に、ノード構成のクラスタをマルチキャスト方式で構築する場合のコマンド例です。

複数Dockerホスト上のGridDBクラスタ(マルチキャスト方式)

host1上で実行:

$ docker run --net=host \
    -e GRIDDB_NODE_NUM=3 \
    -e GRIDDB_CLUSTERNAME=dockerCluster \
    -e NOTIFICATION_ADDRESS=239.0.0.2 \
    -e SERVICE_ADDRESS=192.168.56.101 \
    --name myNode1 griddb/griddb-server:4.5

host2上で実行:

$ docker run --net=host \
    -e GRIDDB_NODE_NUM=3 \
    -e GRIDDB_CLUSTERNAME=dockerCluster \
    -e NOTIFICATION_ADDRESS=239.0.0.2 \
    -e SERVICE_ADDRESS=192.168.56.102 \
    --name myNode2 griddb/griddb-server:4.5

host3上で実行:

$ docker run --net=host \
    -e GRIDDB_NODE_NUM=3 \
    -e GRIDDB_CLUSTERNAME=dockerCluster \
    -e NOTIFICATION_ADDRESS=239.0.0.2 \
    -e SERVICE_ADDRESS=192.168.56.103 \
    --name myNode3 griddb/griddb-server:4.5

3.4.2 固定リスト方式によるクラスタ構築

固定リスト方式では、MACVLANネットワークとoverlayネットワークのいずれかのDockerネットワークを使用することができます。 MACVLANネットワークでは、各コンテナはネットワーク外と共通のサブネットを用いるため、ポートの露出(expose)は不要ですが、 overlayネットワークでは、10001、20001(NewSQL使用時)、10040の3種類のポートを露出する必要があります。

以下はoverlayネットワークによる三台のDockerホスト上に、3ノード構成のクラスタを固定リスト方式で構築する場合のコマンド例です。

複数Dockerホスト上のGridDBクラスタ(固定リスト方式)
  • 3台のホストをDocker swarmを用いてクラスタ化します。

    host1上で実行:

    $ docker swarm init --advertise-addr=192.168.56.101
    

    このコマンドにより、ホストを参加させるのに必要なトークンが表示されます。

    host2上で実行:

    $ docker swarm join --token <TOKEN> \
        --advertise-addr 192.168.56.102 192.168.56.101:2377
    

    host3上で実行:

    $ docker swarm join --token <TOKEN> \
        --advertise-addr 192.168.56.103 192.168.56.101:2377
    
  • overlayネットワーク(griddb-net)を作成します。

    $ docker network create -d overlay \
        --subnet 10.0.1.0/24 --attachable griddb-net
    
  • GridDBサーバコンテナを起動します。

    machine1ノード上で実行:

    $ docker run \
        -e GRIDDB_NODE_NUM=3 \
        -e GRIDDB_CLUSTERNAME=dockerCluster \
        -e NOTIFICATION_MEMBER=10.0.1.4,10.0.1.5,10.0.1.6 \
        -p 10001:10001 -p 10040:10040 -p 20001:20001 \
        --network griddb-net --ip 10.0.1.4 \
      --name myNode1 griddb/griddb-server:4.5
    

    machine2ノード上で実行:

    $ docker run -e GRIDDB_NODE_NUM=3 \
        -e GRIDDB_NODE_NUM=3 \
        -e GRIDDB_CLUSTERNAME=dockerCluster \
        -e NOTIFICATION_MEMBER=10.0.1.4,10.0.1.5,10.0.1.6 \
        -p 10001:10001 -p 10040:10040 -p 20001:20001 \
        --network griddb-net --ip 10.0.1.5 \
        --name myNode2 griddb/griddb-server:4.5
    

    machine3ノード上で実行:

    $ docker run -e GRIDDB_NODE_NUM=3 \
        -e GRIDDB_NODE_NUM=3 \
        -e GRIDDB_CLUSTERNAME=dockerCluster \
        -e NOTIFICATION_MEMBER=10.0.1.4,10.0.1.5,10.0.1.6 \
        -p 10001:10001 -p 10040:10040 -p 20001:20001 \
        --network griddb-net --ip 10.0.1.6 \
        --name myNode3 griddb/griddb-server:4.5
    
  • 各コンテナ内でgs_node.jsongs_cluster.jsonを編集します。

    myNode1のgs_node.json: /transaction/serviceAddress/sql/serviceAddressを"192.168.56.101"に

    myNode2のgs_node.json: /transaction/serviceAddress/sql/serviceAddressを"192.168.56.102"に

    myNode3のgs_node.json: /transaction/serviceAddress/sql/serviceAddressを"192.168.56.103"に

    myNode1~3のgs_cluster.json:

    {
      ...
      "cluster": {
        ...
        "notificationMember": [
          {
            "cluster": {"address": "10.0.1.4","port": 10010},
            "sync": {"address": "10.0.1.4","port": 10020},
            "system": {"address": "10.0.1.4","port": 10040},
            "transaction": {"address": "192.168.56.101","port": 10001},
            "sql": {"address": "192.168.56.101","port": 20001}
          },
          {
            "cluster": {"address": "10.0.1.5","port": 10010},
            "sync": {"address": "10.0.1.5","port": 10020},
            "system": {"address": "10.0.1.5","port": 10040},
            "transaction": {"address": "192.168.56.102","port": 10001},
            "sql": {"address": "192.168.56.102","port": 20001}
          },
          {
            "cluster": {"address": "10.0.1.6","port": 10010},
            "sync": {"address": "10.0.1.6","port": 10020},
            "system": {"address": "10.0.1.6","port": 10040},
            "transaction": {"address": "192.168.56.103","port": 10001},
            "sql": {"address": "192.168.56.103","port": 20001}
          }
        ]
        ...
      }
      ...
    }
    

3.4.3 プロバイダ方式によるクラスタ構築

プロバイダ方式の場合は固定リスト方式の場合と同様です。 overlayネットワークのDockerホスト上では、10001、20001(NewSQL使用時)、10040ポートを露出する必要があります。

以下はoverlayネットワークによる三台のDockerホスト上に、3ノード構成のクラスタをプロバイダ方式で構築する場合のコマンド例です。

なお、ホストプロバイダがhttp://192.168.56.104/provider.json で、以下のホスト情報を提供しているとします。

$ curl http://192.168.56.104/provider.json
[
  {
    "cluster": {"address": "10.0.1.4","port": 10010},
    "sync": {"address": "10.0.1.4","port": 10020},
    "system": {"address": "10.0.1.4","port": 10040},
    "transaction": {"address": "192.168.56.101","port": 10001},
    "sql": {"address": "192.168.56.101","port": 20001}
  },
  {
    "cluster": {"address": "10.0.1.5","port": 10010},
    "sync": {"address": "10.0.1.5","port": 10020},
    "system": {"address": "10.0.1.5","port": 10040},
    "transaction": {"address": "192.168.56.102","port": 10001},
    "sql": {"address": "192.168.56.102","port": 20001}
  },
  {
    "cluster": {"address": "10.0.1.6","port": 10010},
    "sync": {"address": "10.0.1.6","port": 10020},
    "system": {"address": "10.0.1.6","port": 10040},
    "transaction": {"address": "192.168.56.103","port": 10001},
    "sql": {"address": "192.168.56.103","port": 20001}
  }
]
  • 3台のホストをDocker swarmを用いてクラスタ化します。

    host1上で実行:

    $ docker swarm init --advertise-addr=192.168.56.101
    

    このコマンドにより、ホストを参加させるのに必要なトークンが表示されます。

    host2上で実行:

    $ docker swarm join --token <TOKEN> \
        --advertise-addr 192.168.56.102 192.168.56.101:2377
    

    host3上で実行:

    $ docker swarm join --token <TOKEN> \
        --advertise-addr 192.168.56.103 192.168.56.101:2377
    
  • overlayネットワーク(griddb-net)を作成します。

    $ docker network create -d overlay \
        --subnet 10.0.1.0/24 --attachable griddb-net
    
  • GridDBサーバコンテナを起動します。

    host1ノード上で実行:

    $ docker run -e GRIDDB_NODE_NUM=3 \
        -e GRIDDB_CLUSTERNAME=dockerCluster \
        -e NOTIFICATION_PROVIDER=http://192.168.56.104/provider.json \
        -p 10001:10001 -p 10040:10040 -p 20001:20001 \
        --network griddb-net --ip 10.0.1.4 \
        --name myNode1 griddb/griddb-server:4.5
    

    host2ノード上で実行:

    $ docker run -e GRIDDB_NODE_NUM=3 \
        -e GRIDDB_CLUSTERNAME=dockerCluster \
        -e NOTIFICATION_PROVIDER=http://192.168.56.104/provider.json \
        -p 10001:10001 -p 10040:10040 -p 20001:20001 \
        --network griddb-net --ip 10.0.1.5 \
        --name myNode2 griddb/griddb-server:4.5
    

    host3ノード上で実行:

    $ docker run -e GRIDDB_NODE_NUM=3 \
        -e GRIDDB_CLUSTERNAME=dockerCluster \
        -e NOTIFICATION_PROVIDER=http://192.168.56.104/provider.json \
        -p 10001:10001 -p 10040:10040 -p 20001:20001 \
        --network griddb-net --ip 10.0.1.6 \
        --name myNode3 griddb/griddb-server:4.5
    
  • 各コンテナ内でgs_node.jsonを編集します。(gs_cluster.jsonは不要)

    myNode1のgs_node.json: /transaction/serviceAddress/sql/serviceAddressを"192.168.56.101"に

    myNode2のgs_node.json: /transaction/serviceAddress/sql/serviceAddressを"192.168.56.102"に

    myNode3のgs_node.json: /transaction/serviceAddress/sql/serviceAddressを"192.168.56.103"に

4 Microsoft Azureサービス上のGridDB Dockerfileサンプル利用方法

4.1 ACRでコンテナレジストリを利用する

Azure Container Registry (ACR)はコンテナイメージを管理するためのDockerプライベートレジストリを提供する、Microsoft Azureのマネージドサービスです。以下では、ACR上のコンテナイメージレジストリに対してGridDBコンテナを登録、取得する方法を説明します。

4.1.1 事前準備

  • 作業環境にAzure CLIをインストールします。
    https://docs.microsoft.com/ja-jp/cli/azure/install-azure-cli?view=azure-cli-latest
    
  • GridDBコンテナイメージをビルドします。(3.1節を参照)

4.1.2 (参考)ACRに新しいレジストリを作成する

  • 必要があれば、新しいリソースグループを作成します。

    $ az group create --name <resource-group-name> --location <resource-group-location>
    
  • 新しいレジストリを作成します。

    $ az acr create --resource-group <resource-group-name> --name <container-registry-name> --sku Premium --admin-enabled true
    
    • 作成したレジストリの認証情報を取得します。

      $ az acr credential show --name <container-registry-name>
      
    • (参考)ACRのアクセス制限設定

      ACRのレジストリについて、特定のIPアドレスからのみアクセスを許可し、それ以外からのアクセスを禁止する設定を行う方法を説明します。同様の手順で、特定のAzure仮想ネットワークからのみアクセスを許可する設定にすることもできます。

      • デフォルトでレジストリへのアクセスを禁止します。

        $ az acr update --name <container-registry-name> --default-action Deny
        
      • サービスエンドポイントを削除します。

        $ az network vnet subnet update \
            --name <subnet-name> \
            --vnet-name <virtual-network-name> \
            --resource-group <resource-group-name> \
            --service-endpoints ""
        
      • 既存のネットワークルールを削除します。

        $ az acr network-rule remove --name <container-registry-name> --subnet <subnet-resource-id>
        
      • 特定のIPからのアクセスのみ許可する、新しいネットワークルールを作成します。

        $ az acr network-rule add --name <container-registry-name> --ip-address <your-public-IP-address>
        

4.1.3 レジストリにコンテナイメージを登録する

  • ローカルのコンテナイメージのエイリアスをレジストリに作成します。

    $ az acr login --name <registry-path>
    $ docker tag <image-name> <registry-path>/<image-name-in-registry>
    
  • コンテナイメージをレジストリに登録します。

    $ docker push <registry-path>/<image-name-in-registry>
    

4.1.4 レジストリからコンテナイメージを取得する

  • レジストリからコンテナイメージを取得します。
    $ az acr login --name <registry-path>
    $ docker pull <registry-path>/<image-name-in-registry>
    

4.2 ACI上でGridDBクラスタを起動する

Azure Container Instance(ACI)はDockerコンテナの実行環境を提供するMicrosoft Azureのマネージドサービスです。

以下では、GridDBコンテナをAzure Container Instance (ACI)で動作させる方法を説明します。

なお、ACI上では、GridDBのクラスタネットワーク方式のうちプロバイダ方式のみを使用できます。本書で説明する手順で構築するシステム構成を以下の図に示します。

ACI上のGridDBクラスタ
ACI上のGridDBクラスタ

GridDBクラスタは3ノードで構成され、それぞれが別々のコンテナグループに属します。また、プロバイダ方式でクラスタを構成するため、プロバイダホスト用のコンテナを別途起動します。本書ではhttpdを使用します。

また、 nginx を用いたリバースプロキシ用のVMを別途用意し、ネットワーク外のGridDB WebAPIや統合運用管理GUI(gs_admin)からGridDBクラスタにアクセスできるようにしています。

4.2.1 事前準備

  • 作業環境にAzure CLIをインストールします。
    https://docs.microsoft.com/ja-jp/cli/azure/install-azure-cli?view=azure-cli-latest
    
  • GridDBサーバ、クライアントのコンテナイメージをビルドします。(3.1節を参照)
  • プロバイダホストのコンテナイメージをビルドします。
    $ docker build -t providerhost:1.0 -f Provider .
    
  • 各コンテナイメージをACR上のレジストリに登録します。(4.1節を参照)

4.2.2 必要なリソースを作成する

  • Azure CLIにおいてAzureにログインします。

    $ az login
    
  • プロキシ経由でインターネットに接続する環境の場合、環境変数にプロキシ情報を登録します。

    $ export http_proxy=http://<user name>:<password>@<proxy address>:<proxy port>
    $ export https_proxy=http://<user name>:<password>@<proxy address>:<proxy port>
    
  • 必要があれば、新しいコンテナグループを作成します。

    $ az group create --name <resource-group-name> --location <location>
    
  • 必要があれば、Azure Filesを使用するための新しいストレージアカウントを作成します。

    $ az storage account create --name <storage_account_name> --resource-group <resource-group-name>
    $ az storage share create --name node1 --account-name <storage_account_name>
    $ az storage share create --name node2 --account-name <storage_account_name>
    $ az storage share create --name node3 --account-name <storage_account_name>
    
  • 作成したストレージアカウントの認証キーを取得します。

    $ az storage account keys list --resource-group <resource-group-name> \
        --account-name <storage_account_name> --query "[0].value" --output tsv
    
  • Azure仮想ネットワークを作成します。

    $ az network vnet create --resource-group <resource-group-name> \
        --name <vnet-name> --address-prefix 10.0.0.0/16
    
  • GridDBコンテナイメージが登録されたACRのコンテナレジストリにログインします。(認証情報が必要)

    $ docker login <registry-path>
    
  • プロバイダホストを起動します。

    • プロバイダホスト用のサブネット(10.0.0.0/24)を作成します。

      $ az network vnet subnet create --resource-group <resource-group-name> \
          --vnet-name <vnet-name> --name providerhost --address-prefix 10.0.0.0/24
      
    • プロバイダホストのインスタンスを作成、起動します。

      $ az container create --name providerhost --resource-group <resource-group-name> \
          --image <registry-path>/providerhost:1.0 \
          --registry-username <registry-name> --registry-password <registry-password> \
          --vnet <vnet-name> --subnet providerhost --port 80
      

4.2.3 GridDBクラスタを起動する

  • サーバコンテナ用のサブネット(10.0.1.0/24)を作成します。

    $ az network vnet subnet create --resource-group <resource-group-name> \
        --vnet-name <vnet-name> --name servernodes --address-prefix 10.0.1.0/24
    
  • 3サーバー分のコンテナを起動します。

    $ az container create --name myNode1 \
        --image <registry-name-on-azurecr.io>/griddb-server:4.5 \
        --registry-username <registry-name> --registry-password <registry-password> \
        --resource-group <resource-group-name> \
        --vnet <vnet-name> --subnet servernodes \
        --ports 10001 10010 10020 10040 20001 \
        --environment-variables 'GRIDDB_CLUSTERNAME'='<cluster-name>' 'GRIDDB_NODE_NUM'='3' 'NOTIFICATION_PROVIDER'='http://10.0.0.4/provider.json' \
        --azure-file-volume-account-name <gridDB_storage_account> \
        --azure-file-volume-account-key  <volume-account-key> \
        --azure-file-volume-share-name myNode1 \ 
        --azure-file-volume-mount-path /var/lib/gridstore/data
    $ az container create --name myNode2 \
        --image <registry-name-on-azurecr.io>/griddb-server:4.5 \
        --registry-username <registry-name> --registry-password <registry-password> \
        --resource-group <resource-group-name> \
        --vnet <vnet-name> --subnet servernodes \
        --ports 10001 10010 10020 10040 20001 \
        --environment-variables 'GRIDDB_CLUSTERNAME'='<cluster-name>' 'GRIDDB_NODE_NUM'='3' 'NOTIFICATION_PROVIDER'='http://10.0.0.4/provider.json' \
        --azure-file-volume-account-name <gridDB_storage_account> \
        --azure-file-volume-account-key  <volume-account-key> \
        --azure-file-volume-share-name myNode2 \ 
        --azure-file-volume-mount-path /var/lib/gridstore/data
    $ az container create --name myNode3 \
        --image <registry-name-on-azurecr.io>/griddb-server:4.5 \
        --registry-username <registry-name> --registry-password <registry-password> \
        --resource-group <resource-group-name> \
        --vnet <vnet-name> --subnet servernodes \
        --ports 10001 10010 10020 10040 20001 \
        --environment-variables 'GRIDDB_CLUSTERNAME'='<cluster-name>' 'GRIDDB_NODE_NUM'='3' 'NOTIFICATION_PROVIDER'='http://10.0.0.4/provider.json' \
        --azure-file-volume-account-name <gridDB_storage_account> \
        --azure-file-volume-account-key  <volume-account-key> \
        --azure-file-volume-share-name myNode3 \ 
        --azure-file-volume-mount-path /var/lib/gridstore/data
    

4.2.4 GridDBクライアントを起動する

  • クライアントコンテナ用のサブネット(10.0.2.0/24)を作成します。

    $ az network vnet subnet create --resource-group <resource-group-name> \
        --vnet-name <vnet-name> --name client --address-prefix 10.0.2.0/24
    
  • クライアントコンテナを起動します。

    $ az container create --name client \
        --image <registry-name-on-azurecr.io>/griddb-client:4.5 \
        --registry-username <registry-name> --registry-password <registry-password> \
        --resource-group <resource-group-name> \
        --vnet <vnet-name> --subnet client \
        --ports 8080 8081 \
        --environment-variables 'GRIDDB_NODE'='10.0.1.4' 'GRIDDB_PORT'='10040'
    
  • コンテナにローカルからログインするためには、以下のコマンドを実行します。

    $ az container exec --resource-group <resource-group-name> --name <container-name> --exec-command "/bin/bash"
    
  • GridDB運用ツール(gs_admin、WebAPI)にアクセスするためには、以下の手順を実行します。

    • CentOSのAzure VMを1台作成します。

    • VMをサブネット(10.0.0.0/16)に登録します。

    • VMにパブリックIPを付与します。

    • VMにnginxをインストールし、リバースプロキシサーバを作成します。

      • nginxをインストールします。

        https://docs.nginx.com/nginx/admin-guide/installing-nginx/installing-nginx-open-source/
        
      • 以下の記述を含むgriddb.confを/etc/nginx/conf.d/の下に作成します。

        server {
            listen 80;
            server_name <dns-server-name-of-virtual-machine>;
            location /gs_admin {
                proxy_pass http://10.1.2.4:8080/gs_admin;
            }
            location /webapi {
                proxy_pass http://10.1.2.4:8081/;
            }
        }
        
      • nginxを再起動します。

        sudo systemctl reload nginx
        
    • gs_adminにアクセスします。

      <dns-server-name-of-virtual-machine>/gs_admin
      
    • WebAPIのBase URLは以下です。

      <dns-server-name-of-virtual-machine>/webapi
      

4.3 Azure VM上でGridDBクラスタを起動する

ACIを使用せずに、Azure VM上にインストールしたDocker CE上にGridDBクラスタを構築することもできます。

以下では、GridDBコンテナをAzure VM上のDocker CEで動作させる方法を説明します。

4.3.1 事前準備

  • 作業環境にAzure CLIをインストールします。
    https://docs.microsoft.com/ja-jp/cli/azure/install-azure-cli?view=azure-cli-latest
    
  • GridDBサーバ、クライアントのコンテナイメージをビルドします。(3.1節を参照)
  • コンテナイメージをACR上のレジストリに登録します。(4.1節を参照)

4.3.2 必要なリソースを作成する

  • 必要があれば、新しいコンテナグループを作成します。

    $ az group create --name <resource-group-name> --location <resource-group-location>
    
  • Azure仮想ネットワークを作成します。

    $ az network vnet create --resource-group <resource-group-name> \
        --name <virtual_network_name> --address-prefix 10.0.0.0/16
    $ az network vnet subnet create --resource-group <resource-group-name> \
        --vnet-name <virtual_network_name> --name <subnet_name> --address-prefix 10.0.0.0/24
    
  • Azure VMインスタンスを作成します。 (サーバ用3台、クライアント用1台)

    $ az vm create --resource-group <resource-group-name> \
        --name machine1 --public-ip-address-dns-name <machine1-public-dns-name> \
        --image CentOS --admin-username <user-name> --admin-password <password> \
        --vnet-name <virtual_network_name> --subnet <subnet_name> --private-ip-address 10.0.0.4
    $ az vm create --resource-group <resource-group-name> \
        --name machine2 --public-ip-address-dns-name <machine2-public-dns-name> \
        --image CentOS --admin-username <user-name> --admin-password <password> \
        --vnet-name <virtual_network_name> --subnet <subnet_name> --private-ip-address 10.0.0.5
    $ az vm create --resource-group <resource-group-name> \
        --name machine3 --public-ip-address-dns-name <machine3-public-dns-name> \
        --image CentOS --admin-username <user-name> --admin-password <password> \
        --vnet-name <virtual_network_name> --subnet <subnet_name> --private-ip-address 10.0.0.6
    $ az vm create --resource-group <resource-group-name> --name machineclient \
        --public-ip-address-dns-name <client-public-dns-name> \
        --image CentOS --admin-username <user-name> --admin-password <password> \
        --vnet-name <virtual_network_name> --subnet <subnet_name> --private-ip-address 10.0.0.7
    
  • VMインスタンスにDocker CEをインストールします。

4.3.3 GridDBクラスタを起動する

  • それぞれのVM上で、レジストリからコンテナイメージを取得します。

    machine1, machine2, machine3ノード上で実行:

    $ docker login <registry-name-on-azurecr.io>
    $ docker pull <registry-name-on-azurecr.io>/griddb-server:4.5
    
  • それぞれのVM上で、サーバコンテナを起動します。

    machine1ノード上で実行:

    $ docker run -d --name myNode1 \
        -e GRIDDB_CLUSTERNAME=dockerCluster \
        -e GRIDDB_NODE_NUM=3 \
        -e NOTIFICATION_MEMBER=10.0.0.4,10.0.0.5,10.0.0.6 \
        -e SERVICE_ADDRESS=10.0.0.4 \
        -p 10001:10001 -p 10010:10010 -p 10020:10020 -p 10040:10040 -p 20001:20001 \
        <registry-path>/griddb-server:4.5
    

    machine2ノード上で実行:

    $ docker run -d --name myNode2 \
        -e GRIDDB_CLUSTERNAME=dockerCluster \
        -e GRIDDB_NODE_NUM=3 \
        -e NOTIFICATION_MEMBER=10.0.0.4,10.0.0.5,10.0.0.6 \
        -e SERVICE_ADDRESS=10.0.0.5 \
        -p 10001:10001 -p 10010:10010 -p 10020:10020 -p 10040:10040 -p 20001:20001 \
        <registry-path>/griddb-server:4.5
    

    machine3ノード上で実行:

    $ docker run -d --name myNode3 \
        -e GRIDDB_CLUSTERNAME=dockerCluster \
        -e GRIDDB_NODE_NUM=3 \
        -e NOTIFICATION_MEMBER=10.0.0.4,10.0.0.5,10.0.0.6 \
        -e SERVICE_ADDRESS=10.0.0.6 \
        -p 10001:10001 -p 10010:10010 -p 10020:10020 -p 10040:10040 -p 20001:20001 \
        <registry-path>/griddb-server:4.5
    

4.3.4 GridDBクライアントを起動する

  • レジストリからコンテナイメージを取得します。

    machineclientノード上で実行:

    $ docker login <registry-name-on-azurecr.io>
    $ docker pull <registry-name-on-azurecr.io>/griddb-client:4.5
    
  • クライアントコンテナを起動します。

    machineclientノード上で実行:

    $ docker run -d --name client \
      -e GRIDDB_NODE=10.0.0.4 \
      -e GRIDDB_PORT=10040 \
      -p 8080:8080 -p 8081:8081 \
      <registry-name-on-azurecr.io>/griddb-client:4.5
    

5 主な操作

5.1 コンテナ内でシェルを起動する

$ docker exec -it <node_name> bash

5.2 GridDBクラスタのステータスを確認する

$ docker exec -it <node_name> bash
$ su - gsadm
$ gs_stat -u admin/admin

5.3 GridDBクラスタへのアクセス

5.3.1 Dockerホスト上からマルチキャスト接続でGridDBクラスタにアクセスする

  • hostネットワークからコンテナのdocker0インタフェースにマルチキャストルートを設定します。

    $ ip route add 239.0.0.1/32 dev docker0
    
  • マルチキャストルートに対してクライアントからアクセスします。

    $ cd sample
    $ javac -cp /usr/share/java/gridstore.jar MultiNodesClient.java
    $ java -cp .:/usr/share/java/gridstore.jar MultiNodesClient 239.0.0.1 31999 myCluster
    

5.3.2 Dockerホスト外のGridDBクライアントからアクセスする

  • コンテナ起動時に必要なポートを露出しておきます。

    $ docker run -P -d --name griddb griddb/griddb-server:4.5
    

    ポートフォワードすることもできます。

    $ docker run -p 40001:10001 -d --name griddb griddb/griddb-server:4.5
    
  • 露出されたポートは以下のコマンドで確認できます。

    $ docker port griddb
    
  • 露出されているポートに対してクライアントからアクセスします。

    $ cd sample
    $ javac -cp /usr/share/java/gridstore.jar SingleNodeClient.java
    $ java -cp .:/usr/share/java/gridstore.jar SingleNodeClient <Docker Host IP Address> 40001 myCluster
    

6 商標

  • GridDBは日本国内における東芝デジタルソリューションズ株式会社の登録商標です。
  • DockerはDocker Inc.の米国およびその他の国における登録商標です。
  • MicrosoftおよびAzureは米国Microsoft Corporationの米国およびその他の国における登録商標です。