Docker + Tomcat9 + Maven のローカル開発環境構築まで
概要
私は、Tomcat9 + Mavenを使った製品の開発をしています。
ソースコードがそこそこ大きいので、新しいライブラリを検証する時には最小構成の環境で試したい時があります。
そのため、Dockerでローカル開発環境を作りました。
環境作りの流れを作業ログとしてブログにまとめます。
また、テンプレートとして繰り返し使用する事を想定しているため、テンプレートリポジトリとしてGithubにあげています。
前提
- WSL2 上のUbuntuでDocker Desktopが使用できる
- Githubのアカウントがある
- Ubuntu : 20.04
- Docker-desktop Version : 4.13.1 (90346)
①Dockerコンテナ上でTomcatが起動するまで
1.ディレクトリの作成
mkdir docker-tomcat9-maven cd docker-tomcat9-maven
2.Dockerfileの作成
FROM tomcat:9-jdk11
Tomcat9系の検証をする必要があったため、Tomcat9を使用してます。
Tomcat10以降でServlet等のパッケージ名が変わるため、に移行するのは割と手間です。
何の制約もない場合はTomcat10以降を使用した方が無難です
3. docker-compose.ymlの作成
version: '3'
services:
app:
build:
context: .
dockerfile: Dockerfile
working_dir: /app
ports:
- "8081:8080" # Tomcatのポート。ホスト:コンテナ
4. Dockerイメージをビルドして起動する
docker-comose build docker-comose up -d # コンテナに入れるか確認 docker exec -it docker-tomcat9-maven-app-1 bash
5. Tomcatの起動確認
ブラウザでhttp://localhost:8081/ にアクセスするとTomcatの404画面を確認できます。

②Mavenの導入~アプリのデプロイまで
1. Mavenを導入する
docker-comose up -d docker exec -it docker-tomcat9-maven-app-1 bash apt-get -y update apt-get -y upgrade # mavenをインストール apt-get instanll -y maven # mvnのバージョンを確認する mvn -version #3.6.3
Maven – Maven Releases History
によると、3系の最新は3.8系。
ローカル環境なのでとりあえず3.6系でいい事にする。

apt-getを使わずに、curlでmavenの最新版を入手する事も考えたが、今回はやめておく
2. Mavenプロジェクトを作る
mvn archetype:generate -DgroupId=jp.gr.java_conf.tunemage -DartifactId=tomcat-sample -DarchetypeArtifactId=maven-archetype-webapp # less を導入する apt-get install -y less # pom.xmlが生成されている事を確認する less docker-tomcat9-maven/pom.xml
3. warファイルを生成する
cd docker-tomcat9-maven mvn package ls target
tomcat-sample.warが生成されている事を確認
4. デプロイする
cp target/tomcat-sample.war /usr/local/tomcat/webapps
ブラウザでhttp://localhost:8081/tomcat-sample/ に入るとJSPの画面が表示されます。

③生成したMavenプロジェクトを組み込む
1. dockerコンテナ内で生成した雛形をホストにコピーする
ホスト側で以下のコマンドを実行
# コンテナIDを調べる docker ps # コンテナからホストにファイルをコピーする docker cp [コンテナID]:/app/docker-tomcat9-maven/pom.xml . docker cp [コンテナID]:/app/docker-tomcat9-maven/src .
2. DockerfileにMaven導入の処理を追記する
FROM tomcat:9-jdk11 RUN apt-get -y update RUN apt-get -y upgrade RUN apt-get install -y less RUN apt-get install -y maven
DockerでRUNを多く記述するとレイヤが増えてパフォーマンスに影響するので、&&繋ぎにするなどの対応が必要となるが今回は端折る
3. docker-compose.ymlにホストとコンテナのボリューム共有を
version: '3'
services:
app:
build:
context: .
dockerfile: Dockerfile
working_dir: /app
ports:
- "8081:8080" # Tomcatのポート。ホスト:コンテナ
volumes:
- ".:/app" #ホスト:コンテナ
4. 再度イメージをビルドする
ホスト側で
docker-compose build
5. index.jspを修正する
<html>
<body>
<h2>Hello JSP</h2>
</body>
</html>
6.ビルド&デプロイする
docker-comose up -d docker exec -it docker-tomcat9-maven-app-1 bash mvn package cp target/tomcat-sample.war /usr/local/tomcat/webapps
7. 確認
ブラウザでhttp://localhost:8081/tomcat-sample/ に入るとJSPの画面が表示されます。

④テスト用サーブレットの追加
生成したプロジェクトには、src/main/javaディレクトリがない。
javaファイルが1つもないのはさすがに寂しいので、Srevletを追加しておく。
1. ディレクトリの作成
以下のディレクトリを作成する
2. pom.xmlにServlet APIを追加
https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api/4.0.1
からpom.xmlにコピペする
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
3. パッケージを作成
src/main/java下に、jp.gr.java_conf.tunemage.servletを追加する
4. Servletクラスを作成
シンプルなServletを作成する。
package jp.gr.java_conf.tunemage.servlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletException;
import java.io.PrintWriter;
import java.io.IOException;
@WebServlet("/HelloServlet")
public class HelloServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
PrintWriter out = response.getWriter();
out.println("Hello Servlet");
}
}
Tomcat10以降は、servletのパッケージ名が、javax からjakaltaに変わります。
5. ビルド&デプロイする
mvn package cp target/tomcat-sample.war /usr/local/tomcat/webapps
6. 確認
ブラウザでhttp://localhost:8081/tomcat-sample/ に入るとJSPの画面が表示されます。

⑤Githubに追加
使い回せるように、Githubにテンプレートリポジトリとして公開します
1. GithubのトップページでNewボタンを押す

2. リポジトリ名を入力して「Create Repository」を押す

3. Setting を押す

4. 「Template Repository」をチェックする

5. git init
ホスト側のトップディレクトリでgit initする
git init
5. .gitignoreファイルを作成する
/target/ /.vscode/* /bin/
内容は随時追加する想定です。
6. Githubにpushする
git commit . git commit -m "first commit" git remote add origin https://github.com/tunemage/docker-tomcat9-maven.git git push origin master
7. Githubにpushされている事を確認

「Use This Template」ボタンを作成
以上です。