note

GlassFishの使い方(Docker)

本節では、Official DockerイメージによるGlassFishの使い方を示す。

Official Dockerイメージ

GlassFish の Official Dockerイメージは以下で配布されている。

参考:Oracle 提供の Docker イメージ

Official Dockerイメージの「Official」は、「Docker Inc. が公式に認証した」という意味であり、
GlassFish 公式開発元(=Oracle)が提供しているものではない。

Oracle提供の Docker イメージとしては、2015年5月に公開された以下がある。

いずれも新機能の試用目的で提供されているものであり、Stableな運用は考慮されていない。

コンテナ設定

コンテナには以下の変数(環境変数、コンテナ変数)が設定されている。

  • EXPOSE: 8080, 4848, 8181
  • ENV: 下表を参照
変数名
JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64
GLASSFISH_HOME /usr/local/glassfish4

ドメイン設定

GlassFishは、基本構成で複数ドメインの管理機構を持っており、
各ドメイン毎に設定を変更できる。

デフォルトでは、domain1というドメインが設定されており、
/usr/local/glassfish4/glassfish/domains/domain1にファイル一式が存在する。

このディレクトリには config というサブディレクトリが存在し、
domain.xml などの設定ファイルが格納されている。

これらのファイルを上書きすることで、サーバの設定変更が可能となる。

ログ出力

Official Dockerイメージを起動すると、GlassFishサーバのログが標準出力に書き出される。

コンテナをデーモンとして起動した場合は docker logs コマンドで参照できる。

また、GlassFishのログはドメイン毎に管理され、デフォルトのdomain1では
/usr/local/glassfish4/glassfish/domains/domain1/logsにログが格納される。

同ディレクトリを -v 指定することでコンテナ外への出力も可能。


使用方法

以下、Official Dockerイメージの使用方法を示す。

起動確認

  1. 以下のオプションでコンテナを起動
    (JDK8 + GlassFish 4.1の場合)

     $ docker run -it --rm -p 8080:8080 glassfish:4.1-jdk8
    
  2. ブラウザで http://localhost:8080 にアクセス
    → GlassFishのトップページが表示される

参考:コンテナプロセスの確認

docker topでコンテナプロセスを確認すると、以下のように表示される。

$ docker top ${container_id} 
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                21769               880                 0                   15:50               pts/1               00:00:00            /bin/sh -c asadmin start-domain --verbose
root                21787               21769               0                   15:50               pts/1               00:00:05            java -jar /usr/local/glassfish4/bin/../glassfish/lib/client/appserver-cli.jar start-domain --verbose
root                21824               21787               0                   15:50               pts/1               00:00:19            /usr/lib/jvm/java-8-openjdk-amd64/bin/java -cp /usr/local/glassfish4/glassfish/modules/glassfish.jar -XX:+UnlockDiagnosticVMOptions -XX:NewRatio=2 -XX:MaxPermSize=192m -Xmx512m -client -javaagent:/usr/local/glassfish4/glassfish/lib/monitor/flashlight-agent.jar -Djavax.xml.accessExternalSchema=all -Djavax.net.ssl.trustStore=/usr/local/glassfish4/glassfish/domains/domain1/config/cacerts.jks -Djdk.corba.allowOutputStreamSubclass=true -Dfelix.fileinstall.dir=/usr/local/glassfish4/glassfish/modules/autostart/ -Dorg.glassfish.additionalOSGiBundlesToStart=org.apache.felix.shell,org.apache.felix.gogo.runtime,org.apache.felix.gogo.shell,org.apache.felix.gogo.command,org.apache.felix.shell.remote,org.apache.felix.fileinstall -Dcom.sun.aas.installRoot=/usr/local/glassfish4/glassfish -Dfelix.fileinstall.poll=5000 -Djava.endorsed.dirs=/usr/local/glassfish4/glassfish/modules/endorsed:/usr/local/glassfish4/glassfish/lib/endorsed -Djava.security.policy=/usr/local/glassfish4/glassfish/domains/domain1/config/server.policy -Dosgi.shell.telnet.maxconn=1 -Dfelix.fileinstall.bundles.startTransient=true -Dcom.sun.enterprise.config.config_environment_factory_class=com.sun.enterprise.config.serverbeans.AppserverConfigEnvironmentFactory -Dfelix.fileinstall.log.level=2 -Djavax.net.ssl.keyStore=/usr/local/glassfish4/glassfish/domains/domain1/config/keystore.jks -Djava.security.auth.login.config=/usr/local/glassfish4/glassfish/domains/domain1/config/login.conf -Dfelix.fileinstall.disableConfigSave=false -Dfelix.fileinstall.bundles.new.start=true -Dcom.sun.aas.instanceRoot=/usr/local/glassfish4/glassfish/domains/domain1 -Dosgi.shell.telnet.port=6666 -Dgosh.args=--nointeractive -Dcom.sun.enterprise.security.httpsOutboundKeyAlias=s1as -Dosgi.shell.telnet.ip=127.0.0.1 -DANTLR_USE_DIRECT_CLASS_LOADING=true -Djava.awt.headless=true -Dcom.ctc.wstx.returnNullForDefaultNamespace=true -Djava.ext.dirs=/usr/lib/jvm/java-8-openjdk-amd64/lib/ext:/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/ext:/usr/local/glassfish4/glassfish/domains/domain1/lib/ext -Djdbc.drivers=org.apache.derby.jdbc.ClientDriver -Djava.library.path=/usr/local/glassfish4/glassfish/lib:/usr/java/packages/lib/amd64:/usr/lib/x86_64-linux-gnu/jni:/lib/x86_64-linux-gnu:/usr/lib/x86_64-linux-gnu:/usr/lib/jni:/lib:/usr/lib com.sun.enterprise.glassfish.bootstrap.ASMain -upgrade false -domaindir /usr/local/glassfish4/glassfish/domains/domain1 -read-stdin true -asadmin-args --host,,,localhost,,,--port,,,4848,,,--secure=false,,,--terse=false,,,--echo=false,,,--interactive=true,,,start-domain,,,--verbose=true,,,--watchdog=false,,,--debug=false,,,--domaindir,,,/usr/local/glassfish4/glassfish/domains,,,domain1 -domainname domain1 -instancename server -type DAS -verbose true -asadmin-classpath /usr/local/glassfish4/glassfish/lib/client/appserver-cli.jar -debug false -asadmin-classname com.sun.enterprise.admin.cli.AdminMain

コンテナ内では3つのプロセスが動作していることがわかる。

ユーザアプリのデプロイ

GlassFishのDockerコンテナへのデプロイには、二つの方法がある。

  • アプリを同梱したコンテナイメージを作る(コールドデプロイ)
  • 管理コンソールを経由してデプロイする(ホットデプロイ)

コンテナのセキュリティ強度、ユーザアプリ自体を含めたイメージの配布を考慮すると
前者の方がより汎用的な手段だと考えられる。

以下、コンテナイメージへの同梱方法について示す。

コンテナイメージへのアプリ同梱

  1. ユーザアプリのWARを用意する
    (例: /helloにマッピングされるServletを含むfish_test.warを用意)

  2. GlassFishのドメインのautodeployディレクトリにWARファイルを配置したコンテナイメージを作成
    (例: fish_test.warを配置したmy_glassfish_appイメージを作成)

    $ cat Dockerfile
    FROM glassfish:4.1-jdk8
    ENV WAR_FILE fish_test.war
    COPY ${WAR_FILE} /usr/local/glassfish4/glassfish/domains/domain1/autodeploy/
    
    $ docker build -t my_glassfish_app .
    <<<FILL HERE>>>
    
  3. 作成したコンテナイメージを起動

    $ docker run -it --rm -p 8080:8080 my_glassfish_app
    
  4. ブラウザでServletのマップされたURLにアクセス
    (例: http://localhost:8080/fish_test/hello にアクセス) → Servlet に実装された doGet の結果が出力される

参考:コンテナへのホットデプロイ

Official Dockerイメージでは、GlassFishのWeb管理コンソールが有効化されていない。

したがって、アプリケーションをホットデプロイするためには、
Web管理コンソールを有効化する手順が可能になる。

例えば、以下の手順でホットデプロイ可能なコンテナを作成できる。

  1. コンテナ内に/bin/bashでログイン

    $ docker run -it glassfish:4.1-jdk8 /bin/bash
    
  2. コンテナ内で以下の操作を実施

    # asadmin --user admin change-admin-password
    Enter the admin password>【<RET>】
    Enter the new admin password>【任意のパスワード<RET>】
    Enter the new admin password again>【パスワード<RET>】
    Command change-admin-password executed successfully.
    
    # asadmin start-domain
    ...
    Command start-domain executed successfully.
    
    # asadmin --user admin enable-secure-admin
    Enter the admin password for user "admin">【パスワード<RET>】
    You must restart all running servers for the change in secure admin to take effect.
    Command enable-secure-admin executed successfully.
    
    # asadmin stop-domain
    Waiting for the domain to stop .
    Command stop-domain executed successfully.
    
  3. コンテナからログアウト

  4. コンテナをcommitしてイメージ化(CMDを元イメージと同じコマンドで上書き)

    $ docker commit \
       --change="CMD asadmin start-domain --verbose" \
       ${container_id} my_glassfish_img
    
  5. 作成したイメージからコンテナ起動

    $ docker run --rm -it -p 4848:4848 -p 8080:8080 my_glassfish_img