CData Software Blog

クラウド連携のCData Software の技術ブログです。

CData APIServer をDocker 上で動かす最もシンプルな方法

はじめに

CData 技術ディレクター桑島です。Dockerコンテナ上でCData API Server を使いたい というお問い合わせを沢山いただきます。そこで、CData APIServer をDockerコンテナで動かす最もシンプルな方法をご紹介します。

f:id:kuwazzy:20200308065904p:plain

構成

Docker環境

今回は、macOS上にDocker環境を作成します。Docker Desktop on masOSをインストールします。

hub.docker.com

Java Application Server(Tomcat)

CData APIServerを動作させるWeb Application Serverは、Docker Hub オフィシャルイメージ内の最新(Latest)のApache Tomcatを利用します。

hub.docker.com

CData APIServer

CData API Serverは、Windows(.NET Edition)とCrossPlatform(Java Edition)があります。本シナリオではCrossPlatform(Java Edition)を利用します。CData APIServerは下記ページからダウンロードできます。

www.cdata.com

CData APIServerリポジトリDB

作成したAPI定義やアクセスユーザ、アクセスログのデータを永続化するため、CData APIServerのこれらのデータを格納するデータベース(リポジトリDB)をMySQLに格納します。MySQLには事前にSchema(本例ではapiserver)を作成しておきます。

手順

インプットの準備

以下のファイルを一つのディレクトリに格納します。

DockerFile, Server.xml, tomcat-users.xmlは以下のファイルを利用します。

Dockerfile

  • Dcoker Hubから最新のTomcatイメージを取得
  • apiserver.warをtomcatのwebappsに配置
  • TomcatのConfigファイル(tomcat-users.xml / server.xml)をconfに配置
FROM tomcat:latest

ADD ./apiserver.war /usr/local/tomcat/webapps
ADD ./tomcat-users.xml /usr/local/tomcat/conf
ADD ./server.xml /usr/local/tomcat/conf

Server.xml

  • APIServerからMySQLリポジトリDBへの接続情報である Context path="/apiserver" タグ以降を追加
<?xml version="1.0" encoding="UTF-8"?>
    :
 (省略)
    :
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">

        <!-- SingleSignOn valve, share authentication between web applications
             Documentation at: /docs/config/valve.html -->
        <!--
        <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
        -->

        <!-- Access log processes all example.
             Documentation at: /docs/config/valve.html
             Note: The pattern used is equivalent to using pattern="common" -->
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />

       <Context path="/apiserver">
          <Resource name="jdbc/APP_DB" auth="Container" type="javax.sql.DataSource"
                maxActive="100" maxIdle="30" maxWait="10000"
                driverClassName="cdata.jdbc.mysql.MySQLDriver"
                url="jdbc:cdata:mysql:User=xxxxx;Password=xxxxx;Database=apiserver;Server=xxxxx;Port=3306;"/>
          <Resource name="jdbc/APP_USERS" auth="Container" type="javax.sql.DataSource"
                maxActive="100" maxIdle="30" maxWait="10000"
                driverClassName="cdata.jdbc.mysql.MySQLDriver"
                url="jdbc:cdata:mysql:User=xxxxx;Password=xxxxx;Database=apiserver;Server=xxxxx;Port=3306;"/>
          <Resource name="jdbc/APP_LOGS" auth="Container" type="javax.sql.DataSource"
                maxActive="100" maxIdle="30" maxWait="10000"
                driverClassName="cdata.jdbc.mysql.MySQLDriver"
                url="jdbc:cdata:mysql:User=xxxxx;Password=xxxxx;Database=apiserver;Server=xxxxx;Port=3306;"/>
        </Context>
      </Host>
    </Engine>
  </Service>
</Server>

tomcat-users.xml

  • userタグにroles="cdata_admin"のユーザを追加
<?xml version="1.0" encoding="UTF-8"?>
    :
 (省略)
    :
<user name="admin" password="admin" roles="cdata_admin,rssbus_admin,admin-gui,manager-gui,
manager-status,manager-script,manager-jmx" />
</tomcat-users>

Docker Build (Dockerイメージの作成)

  • docker buildコマンド実行
  • リポジトリ名:tomcat, タグ名:apiserverで作成
  • 作成したDockerイメージの一覧を確認
~/Docker/APIServerJp $ docker build -t tomcat:apiserver .
Sending build context to Docker daemon  84.14MB
Step 1/4 : FROM tomcat:latest
latest: Pulling from library/tomcat
50e431f79093: Pull complete 
dd8c6d374ea5: Pull complete 
c85513200d84: Pull complete 
55769680e827: Pull complete 
e27ce2095ec2: Pull complete 
5943eea6cb7c: Pull complete 
3ed8ceae72a6: Pull complete 
91d1e510d72b: Pull complete 
415cc4506e71: Pull complete 
a79d88064227: Pull complete 
Digest: sha256:xxxxxxxxxxxxxxxx
Status: Downloaded newer image for tomcat:latest
 ---> a7fa4ac97be4
Step 2/4 : ADD ./apiserver.war /usr/local/tomcat/webapps
 ---> 08bfe96a9ab2
Step 3/4 : ADD ./tomcat-users.xml /usr/local/tomcat/conf
 ---> 6809256ee5bf
Step 4/4 : ADD ./server.xml /usr/local/tomcat/conf
 ---> 4767a0582095
Successfully built 4767a0582095
Successfully tagged tomcat:apiserver
~/Docker/APIServerJp $ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
tomcat              apiserver           4767a0582095        7 seconds ago       613MB
tomcat              latest              a7fa4ac97be4        3 days ago          528MB
~/Docker/APIServerJp $ 

(補足)既にDockerイメージが存在しており、既存のイメージを削除する方法

~/Docker/APIServerJp $ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
tomcat              apiserver           4767a0582095        8 minutes ago       613MB
tomcat              latest              a7fa4ac97be4        3 days ago          528MB
~/Docker/APIServerJp $ docker image rm 4767a0582095
Untagged: tomcat:apiserver
Deleted: sha256:xxxxxxxxxxxxxxxx
 :
Deleted: sha256:xxxxxxxxxxxxxxxx
~/Docker/APIServerJp $ docker image rm a7fa4ac97be4
Untagged: tomcat:latest
Untagged: tomcat@sha256:xxxxxxxxxxxxxxxx
 :
Deleted: sha256:xxxxxxxxxxxxxxxx
~/Docker/APIServerJp $ 

Docker Run (イメージからコンテナ起動)

  • ポート:8080で起動
~/Docker/APIServerJp $ docker run --rm -it  -p 8080:8080 tomcat:apiserver
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/local/openjdk-8
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
21-Mar-2020 07:24:40.516 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version name:   Apache Tomcat/8.5.53
    :
 (省略)
    :
21-Mar-2020 07:24:44.639 INFO [localhost-startStop-1] org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
21-Mar-2020 07:24:46.174 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
21-Mar-2020 07:24:46.185 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 5561 ms

APIServerの管理コンソールにアクセス

ブラウザで以下のアドレスにアクセス

http://localhost:8080/apiserver/

(補足)ポートはDocker Run時の指定ポートを設定

以下の管理コンソールのログイン画面が表示されます。tomcat-users.xmlで指定したUser / Password でログインします。

f:id:kuwazzy:20200321173931p:plain

ログインが成功するとステータスタブが表示されます。ライセンスが見つからない旨のエラーメッセージが表示されていますので、情報タブを開き、適切なライセンスでアクティベーションを行ってください。

f:id:kuwazzy:20200321174106p:plain

リポジトリDB(MySQL)の確認

server.xmlで指定したMySQLリポジトリDBをMySQLWorkBenchなどで開いてみます。app_xxxxテーブル群が作成されていることを確認します。CData APIServerの管理コンソールで作成したAPI定義情報やユーザ情報、さらにAPIユーザのアクセスログはこれらのテーブルに永続化されて保管されますので、Dockerを立ち上げ直しても前回の情報を保持したままご利用いただけます。

f:id:kuwazzy:20200321174411p:plain

まとめ

いかがでしたでしょうか? CData APIServer をDockerコンテナで動かす最もシンプルな方法をご紹介しました。本記事では、実際のCData APIServerを使ってAPIを定義、定義したAPIへのアクセス方法はご紹介しておりません、これらの手順については定期的に開催しているハンズオンセミナーの資料がございますのでこちらの手順をご覧ください。

www.cdatablog.jp

今回ご紹介した手順は、CData APIServerの30日間ご利用いただける無償評価版でもご利用いただけますので是非お試しください。

www.cdata.com