本節では、Official DockerイメージによるGlassFishの使い方を示す。
GlassFish の Official Dockerイメージは以下で配布されている。
Official Dockerイメージの「Official」は、「Docker Inc. が公式に認証した」という意味であり、
GlassFish 公式開発元(=Oracle)が提供しているものではない。
Oracle提供の Docker イメージとしては、2015年5月に公開された以下がある。
いずれも新機能の試用目的で提供されているものであり、Stableな運用は考慮されていない。
コンテナには以下の変数(環境変数、コンテナ変数)が設定されている。
8080
, 4848
, 8181
変数名 | 値 |
---|---|
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イメージの使用方法を示す。
以下のオプションでコンテナを起動
(JDK8 + GlassFish 4.1の場合)
$ docker run -it --rm -p 8080:8080 glassfish:4.1-jdk8
ブラウザで 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コンテナへのデプロイには、二つの方法がある。
コンテナのセキュリティ強度、ユーザアプリ自体を含めたイメージの配布を考慮すると
前者の方がより汎用的な手段だと考えられる。
以下、コンテナイメージへの同梱方法について示す。
ユーザアプリのWARを用意する
(例: /hello
にマッピングされるServletを含むfish_test.war
を用意)
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>>>
作成したコンテナイメージを起動
$ docker run -it --rm -p 8080:8080 my_glassfish_app
ブラウザでServletのマップされたURLにアクセス
(例: http://localhost:8080/fish_test/hello にアクセス)
→ Servlet に実装された doGet の結果が出力される
Official Dockerイメージでは、GlassFishのWeb管理コンソールが有効化されていない。
したがって、アプリケーションをホットデプロイするためには、
Web管理コンソールを有効化する手順が可能になる。
例えば、以下の手順でホットデプロイ可能なコンテナを作成できる。
コンテナ内に/bin/bash
でログイン
$ docker run -it glassfish:4.1-jdk8 /bin/bash
コンテナ内で以下の操作を実施
# 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.
コンテナからログアウト
コンテナをcommitしてイメージ化(CMDを元イメージと同じコマンドで上書き)
$ docker commit \
--change="CMD asadmin start-domain --verbose" \
${container_id} my_glassfish_img
作成したイメージからコンテナ起動
$ docker run --rm -it -p 4848:4848 -p 8080:8080 my_glassfish_img