業務エンジニアの攻撃は最大の防御ブログ

業務エンジニアのブログ。業務システム大好き。フレームワーク開発も好き。

Docker + Tomcat9 + Maven のローカル開発環境構築まで

概要

私は、Tomcat9 + Mavenを使った製品の開発をしています。

ソースコードがそこそこ大きいので、新しいライブラリを検証する時には最小構成の環境で試したい時があります。

そのため、Dockerでローカル開発環境を作りました。

環境作りの流れを作業ログとしてブログにまとめます。

また、テンプレートとして繰り返し使用する事を想定しているため、テンプレートリポジトリとしてGithubにあげています。

github.com

前提

  • 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を使わずに、curlmavenの最新版を入手する事も考えたが、今回はやめておく

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. ディレクトリの作成

以下のディレクトリを作成する

  • src/main/java
  • src/test
  • src/test/java
  • src/test/resources

2. pom.xmlServlet 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」ボタンを作成

以上です。