
こんにちは、テクニカルサポートの宮本です!
今回は Docker コンテナ(Tomcat) 上の APIServer を、Docker ホスト側のディレクトリで利用するバインドマウントの方法をご紹介します。
バインドマウントとは
ホストマシン上のファイルやディレクトリをコンテナで利用できるように、コンテナを起動する際にホスト側の対象となるディレクトリとコンテナ上のディレクトリの紐づけを行うことを指します。
ホスト側に APIServer をインストールすることで、コンテナの入れ替えが発生しても設定情報を永続的に利用することができます。
また、新たにコネクタを追加したいときには、対象のコネクタを所定のホスト側のディレクトリに配置するだけで追加することが可能となります。
手順
APIServer ダウンロード
まずは APIServer Java 版をダウンロードしてください。(30日間の無償トライアルが可能です)
www.cdata.com
Docker ホスト側に APIServer を展開する
ダウンロードしたファイルを、Docker ホストとなるインスタンスに格納し、中にある APIServer のwarファイルを任意のディレクトリで展開します。
今回は「/opt/apiserver」配下に展開しました。
[root@apiserver]$ pwd
/opt/apiserver
[root@apiserver]$ ll
total 118364
-rw-r--r-- 1 root root 121202370 Aug 25 21:23 apiserver.war
[root@apiserver]$ jar xvf apiserver.war
~
[root@apiserver]$ ll
total 118408
drwxr-xr-x 2 root root 325 Aug 25 17:23 admin
-rw-r--r-- 1 root root 290 Apr 5 13:36 admin.rsc
drwxr-xr-x 2 root root 6 Apr 5 13:36 api
-rw-r--r-- 1 root root 288 Apr 5 13:36 api.rsc
-rw-r--r-- 1 root root 121202370 Aug 25 21:23 apiserver.war
drwxr-xr-x 3 root root 41 Aug 25 17:23 app_data
-rw-r--r-- 1 root root 320 Apr 5 13:36 error.jsp
-rw-r--r-- 1 root root 17542 Apr 5 13:29 favicon.ico
drwxr-xr-x 3 root root 19 Aug 25 17:23 help
drwxr-xr-x 2 root root 6 Aug 25 17:19 includes
-rw-r--r-- 1 root root 43 Apr 5 13:36 index.jsp
-rw-r--r-- 1 root root 468 Apr 5 13:36 logout.jsp
drwxr-xr-x 2 root root 25 Aug 25 17:23 META-INF
drwxr-xr-x 2 root root 6 Aug 25 17:19 pub
-rw-r--r-- 1 root root 554 Apr 5 13:36 query.rsc
drwxr-xr-x 2 root root 6 Aug 25 17:19 src
drwxr-xr-x 13 root root 193 Aug 25 17:23 ui
drwxr-xr-x 3 root root 32 Aug 25 17:23 WEB-INF
[root@apiserver]$
展開が完了しましたら、次はDockerfile 関連の準備になります。
Dockerfile の準備
Dockerfile の中身は、イメージの取得とtomcat-users.xml の配置を行うようにしています。ちなみに tomcat-users.xml では APIServer へのログインユーザーの情報を設定しています。
[root@ip-172-31-35-49 apiserver]# cat Dockerfile
FROM tomcat:9.0.0
ADD ./tomcat-users.xml /usr/local/tomcat/conf
[root@ip-172-31-35-49 apiserver]#
tomcat-users.xml の中身
userタグ(最後の部分)にroles="cdata_admin"のユーザを追加しています。
[root@apiserver]$ cat tomcat-users.xml
バインドマウントでコンテナ起動
では Dockerfile イメージを取得します。
[root@apiserver]$ ll
total 245824
drwxr-xr-x 2 root root 133 Sep 16 14:14 BWCG-V
-rw-r--r-- 1 root root 251699605 Aug 26 06:33 BWCG-V.zip
-rw-r--r-- 1 root root 65 Sep 16 14:52 Dockerfile
-rw-r--r-- 1 root root 8749 Sep 16 14:48 server.xml
-rw-r--r-- 1 root root 2301 Aug 19 14:01 tomcat-users.xml
[root@apiserver]$
[root@apiserver]$
[root@apiserver]$ docker build --no-cache -t tomcat:apiserver .
Sending build context to Docker daemon 634.3MB
~
Status: Downloaded newer image for tomcat:9.0.0
---> 273c6a7e33d5
Step 2/2 : ADD ./tomcat-users.xml /usr/local/tomcat/conf
---> b59790b9b686
Successfully built b59790b9b686
Successfully tagged tomcat:apiserver
[root@apiserver]$
次に、ユーザーディレクトリの配下に~/cdata/apiserver というディレクトリを作成しておきます。このディレクトリ配下には APIServer 上の設定情報が保持されるようになります。
今回は root ユーザーで実行しているので、/root/cdata/apiserver とディレクトリを作成しました。
それでは Docker コンテナを起動していきます。
先ほど APIServer を展開したパスと上記設定情報保持用のパスをコンテナでマウントするよう -v で指定します。
[root@apiserver]$ docker run --rm -it --name apiserver -v /opt/apiserver/:/usr/local/tomcat/webapps/apiserver/ -v /root/cdata/apiserver/:/root/cdata/apiserver/ -p 8080:8080 tomcat:apiserver
~
16-Sep-2021 15:09:58.208 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
16-Sep-2021 15:09:58.219 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-nio-8009"]
16-Sep-2021 15:09:58.222 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 15615 ms
これでエラーが出力されてなければ起動完了です。
以下のようなURLで接続を試みてください。
http://XXXXXXXXX:8080/apiserver
うまくいけばログイン画面が表示され、tomcat-users.xml で指定したユーザー/パスワードでログインすれば、APIServer のトップ画面が表示されます。
コンテナを入れ替え後の確認
まずは現 APIServer でいくつか設定をしていきましょう。
ABOUT タブにいってトライアルのアクティベートを行ってください。その後、SETTINGS → Connections で接続設定を行います。今回はMySQL に接続してみています。
あとは適当にResources で利用するリソースなどを作成しておきます。
この状態でコンテナを入れ替えてみます。APIServer のアプリケーション本体と設定内容は Docker ホスト側に格納されているので、コンテナの入れ替えが発生しても影響を受けないはずです。
では起動中の Docker を停止させます。なお、Docker 起動時に --rm と指定していたので、停止したタイミングでコンテナが削除され、コンテナリストを表示させても何も残らないようにしています。
[root@ip-172-31-35-49 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@ip-172-31-35-49 ~]#
それでは Docker イメージの生成から行っていきます。
[root@ip-172-31-35-49 apiserver]# docker build --no-cache -t tomcat:apiserver .
Sending build context to Docker daemon 755.5MB
Step 1/2 : FROM tomcat:9.0.0
---> 273c6a7e33d5
Step 2/2 : ADD ./tomcat-users.xml /usr/local/tomcat/conf
---> 68e095a8d671
Successfully built 68e095a8d671
Successfully tagged tomcat:apiserver
[root@ip-172-31-35-49 apiserver]#
生成したイメージをもとに再度コンテナを起動してみます。
[root@ip-172-31-35-49 apiserver]# docker run --rm -it --name apiserver -v /opt/apiserver/:/usr/local/tomcat/webapps/apiserver/ -v /root/cdata/apiserver/:/root/cdata/apiserver/ -p 8080:8080 tomcat:apiserver
先ほど設定したリソースが表示されているのが確認できました!
おわりに
いかがでしたでしょうか。Docker 上で APIServer をご利用される際は、Docker ホスト側に設定情報を保持する方がデータが永続的に保持されますのでおすすめです。
もし設定情報が外部のDBで保持したいというようであれば、こちらの記事をご参照ください。