note

Tomcatの使い方(Docker)

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

Official Dockerイメージ

TomcatのOfficial Dockerイメージは以下で公開されている

Javaランタイム(JRE)のバージョンと、Tomcatのバージョンの組み合わせを指定することができる。 2015年5月現在の組み合わせは以下の通り。

  • JRE: 7 or 8
  • Tomcat: 6.0.44 or 7.0.22 or 8.0.22

これらのDockerfileは以下のレポジトリで公開されている。

コンテナ設定

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

  • EXPOSE: 8080
  • ENV: 下表を参照
変数名
${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イメージの使用方法を示す。

起動確認

  1. 以下のオプションでコンテナを起動
    (JRE8 + Tomcat 8.0.22の場合)

     docker run -it --rm -p 8080:8080 tomcat:8.0.22-jre8
    
  2. ブラウザで 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コンテナへのデプロイには、二つの方法がある。

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

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

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

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

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

  2. 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
    
  3. 作成したコンテナイメージを起動

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

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

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/