|
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
|

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