TomcatのDockerイメージ作成
Tomcatの公式DockerイメージにWebアプリケーションを追加したDockerイメージを作成してみました。


公式イメージの概要
Tomcatの公式イメージのデフォルト設定は以下だけ覚えておけばいいと思います。

  • CATALINA_HOME、CATALINA_BASE は /usr/local/tomcat
  • webappsは空。managerなどはwebapps.distに入っているので必要ならコピーする必要がある


Dockerfile

##FROM tomcat:9-jdk8
FROM tomcat:9-jre21

EXPOSE 8080

# copy manager app from webapps.dist to webapps
COPY --from=tomcat:9-jre21 /usr/local/tomcat/webapps.dist/manager/ /usr/local/tomcat/webapps/manager/

ADD myapp01.tar.gz  ${CATALINA_HOME}/webapps/
#COPY *.jar  ${CATALINA_HOME}/lib/
COPY context.xml server.xml web.xml ${CATALINA_HOME}/conf/
COPY setenv.sh          ${CATALINA_HOME}/bin/
COPY tomcat-users.xml   ${CATALINA_HOME}/conf/
COPY manager.xml myapp01.xml ${CATALINA_HOME}/conf/Catalina/localhost/
COPY database  /opt/database

##RUN sed -i 's/8080/8090/g' ${CATALINA_HOME}/conf/server.xml

CMD ${CATALINA_HOME}/bin/catalina.sh run


setenv.shのサンプル

CATALINA_OPTS="-server -Xmx256m"
##CATALINA_OPTS="-server -Xmx1024m -Xms1024m -Xss512k"
CATALINA_OPTS="$CATALINA_OPTS --add-opens=java.base/java.io=ALL-UNNAMED"
CATALINA_OPTS="$CATALINA_OPTS --add-opens=java.base/java.lang=ALL-UNNAMED"
CATALINA_OPTS="$CATALINA_OPTS --add-opens=java.base/java.util=ALL-UNNAMED"
CATALINA_OPTS="$CATALINA_OPTS --add-opens=java.naming/javax.naming=ALL-UNNAMED"
CATALINA_OPTS="$CATALINA_OPTS -Duser.language=ja -Duser.country=JP"
export CATALINA_OPTS

UMASK="0022"
export UMASK


context.xmlのサンプル

<?xml version="1.0" encoding="UTF-8"?>

<Context>
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <WatchedResource>WEB-INF/tomcat-web.xml</WatchedResource>
    <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>

    <JarScanner scanManifest="false"/>
    <Resources allowLinking="true" cachingAllowed="false" cacheTtl="1" cacheMaxSize="1" />
    <Valve className="org.apache.catalina.valves.RemoteIpValve"
                     remoteIpHeader="x-forwarded-for"
                     proxiesHeader="x-forwarded-by"
                     protocolHeader="x-forwarded-proto" /> 
</Context>


server.xmlのサンプル
全体は示しませんが、下記の部分を書き換えています(属性が二つ増えています)。

    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" URIEncoding="ISO-8859-1" maxParameterCount="20000" />


web.xmlのサンプル
全体は示しませんが、下記の部分を追記しています(中央部分)。

    <servlet>
        <servlet-name>jsp</servlet-name>
        <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
        <init-param>
            <param-name>fork</param-name>
            <param-value>false</param-value>
        </init-param>
<!-- ここから -->
        <init-param>
            <param-name>mappedfile</param-name>
            <param-value>false</param-value>
        </init-param>
<!-- ここまで -->
        <init-param>
            <param-name>xpoweredBy</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>3</load-on-startup>
    </servlet>


myapp01.xmlのサンプル

<Context docBase="myapp01" reloadable="true" crossContext="false" debug="0"
  cachingAllowed="false" swallowOutput="true">

  <Valve className="org.apache.catalina.valves.AccessLogValve"
      directory="logs" prefix="myapp01_access." suffix=".txt" pattern="common"/>

  <Resource name="jdbc/sadb" auth="Container" type="javax.sql.DataSource"
      driverClassName="org.h2.Driver"
      url="jdbc:h2:file:/opt/database/stdb;IFEXISTS=TRUE"
      username="testuser" password="testpass"
  />
</Context>


tomcat-users.xmlのサンプル

<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
<role rolename="manager-gui"/>
<user username="testuser" password="testpass" roles="manager-gui"/>
</tomcat-users>


manager.xmlのサンプル

<Context privileged="true" docBase="${catalina.home}/webapps/manager">
<!--
    <Valve className="org.apache.catalina.valves.RemoteAddrValve"
           allow="^111\.222\.111\.\d+$" />
-->
</Context>

Tomcat Managerを使いたい場合に重要な注意があります。 Podmanコンテナの中ではクライアントのIPは 10.0.2.100 で常に記録されるので、 RemoteAddrValveのIPアドレス制限は役に立ちません。コンテナの外でアクセス制御した方がいいと思います。


ビルドと動作確認

podman build -t mytom .
podman run --rm -d -p 8090:8080 --name mytom-app mytom
podman exec -it mytom-app /bin/bash
podman stop mytom-app

# ブラウザで以下にアクセスします。
http://{hostname}:8090/manager/html
http://{hostname}:8090/myapp01/index.do

Misc. Topics Top

(first uploaded 2024/09/06 last updated 2024/12/29, URANO398)