本節では、Official DockerイメージによるTomcatの使い方を示す。
TomcatのOfficial Dockerイメージは以下で公開されている
Javaランタイム(JRE)のバージョンと、Tomcatのバージョンの組み合わせを指定することができる。 2015年5月現在の組み合わせは以下の通り。
7
or 8
6.0.44
or 7.0.22
or 8.0.22
これらのDockerfileは以下のレポジトリで公開されている。
コンテナには以下の変数(環境変数、コンテナ変数)が設定されている。
8080
変数名 | 値 |
---|---|
${CATALINA_HOME} |
/usr/local/tomcat |
${TOMCAT_MAJOR} |
8 |
${TOMCAT_VERSION} |
8.0.22 |
${TOMCAT_TGZ_URL} |
(該当バージョンのtomcatバイナリアーカイブのURL) |
Official DockerイメージでのTomcatサーバの設定ファイルは、/usr/local/tomcat/conf
以下に格納されている。
unpackWARs
, autoDeploy
の値がserver.xml
にてデフォルトでtrue
である。よって、特に変更せずとも起動時にwarを自動展開&配備してくれる。
設定を変更したい場合は、各種設定ファイルを-v
オプションで実行時に上書きすることで適用可能。
Official Dockerイメージを起動すると、Tomcatサーバのログが標準出力に書き出される。
コンテナをデーモンとして起動した場合はdocker logs
コマンドで参照可能。
また、/usr/local/tomcat/logs
にログファイルが配置されるため、このディレクトリを -v
指定することでコンテナ外に置くことも可能。
以下、Official Dockerイメージの使用方法を示す。
以下のオプションでコンテナを起動
(JRE8 + Tomcat 8.0.22の場合)
docker run -it --rm -p 8080:8080 tomcat:8.0.22-jre8
ブラウザで http://localhost:8080 にアクセス
→ Tomcatのトップページが表示される
docker top
でコンテナプロセスを確認すると、以下のようになる。
$ docker top ${container_id}
UID PID PPID C STIME TTY TIME CMD
root 19114 880 0 13:23 pts/1 00:00:15 /usr/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/usr/local/tomcat/endorsed -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start
つまり、コンテナ内では単一のJavaプロセスが動作していることがわかる。
TomcatのDockerコンテナへのデプロイには、二つの方法がある。
コンテナのセキュリティ強度、ユーザアプリ自体を含めたイメージの配布を考慮すると
前者の方がより汎用的な手段だと考えられる。
以下、コンテナイメージへの同梱方法について示す。
ユーザアプリのWARを用意する
(例:/hello
にマッピングされるServletを含むtest.war
を用意)
Tomcatのwebapps
ディレクトリにWARファイルを配置したコンテナイメージを作成
(例:test.war
を配置したmy_tomcat_app
イメージを作成)
$ cat Dockerfile
FROM tomcat:8.0.22-jre8
ENV WAR_FILE test.war
COPY ${WAR_FILE} /usr/local/tomcat/webapps/
$ docker build -t my_tomcat_app .
Sending build context to Docker daemon 5.632 kB
Sending build context to Docker daemon
Step 0 : FROM tomcat:8.0.22-jre8
---> 1617643ddf97
Step 1 : ENV WAR_FILE test.war
---> Using cache
---> 83533910445e
Step 2 : COPY ${WAR_FILE} /usr/local/tomcat/webapps/
---> 691e4b10db84
Removing intermediate container af46a883aedf
Successfully built 691e4b10db84
作成したコンテナイメージを起動
$ docker run -it --rm -p 8080:8080 my_tomcat_app
ブラウザでServletのマップされたURLにアクセス
(例: http://localhost:8080/test/hello にアクセス)
→ Servlet に実装された doGet の結果が出力される
Tomcatの設定ファイルを変更(上書き)することで、Tomcatマネージャを利用して
コンテナ内のTomcatへのホットデプロイが可能になる。
例えば、以下のXMLとDockerfileからコンテナを作成すると、
コンテナの起動後にTomcatマネージャを利用できる。
$ cat settings.xml
<?xml version="1.0" encoding="UTF-8"?>
<settings>
<servers>
<server>
<id>TomcatServer</id>
<username>admin</username>
<password>Passw0rd</password>
</server>
</servers>
</settings>
$ cat tomcat-users.xml
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
<role rolename="manager-gui"/>
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<user username="admin" password="Passw0rd" roles="manager,manager-gui,manager-script" />
</tomcat-users>
$ cat Dockerfile
FROM tomcat:8.0.22-jre8
COPY settings.xml /usr/local/tomcat/comf/
COPY tomcat-users.xml /usr/local/tomcat/conf/