【Java】TomcatでWebアプリを作成しDockerコンテナ環境にデプロイして実行する手順

Tomcat で Web アプリを作成し Docker コンテナ環境にデプロイして実行する手順について解説します。

Web アプリは Java で作成しますが、まずは単純に「Hello World!」と表示させるところから出発します。

 

この記事で作成した Docker コンテナイメージを AWS ECS にデプロイする手順は以下となります。

 

【AWS】Docker で作成した Java Web アプリのコンテナ環境をイメージ化して ECR にプッシュし ECS にデプロイする手順

 

 

環境

  • 開発環境:Eclipse Version Oxygen.3a Release (4.7.3a)
  • Tomcat 9
  • JRE 1.8
  • Docker version 20.10.14

 

 

Web アプリの作成

まずは簡単な Web アプリを作成します。

Hello World と表示するだけです。

 

Eclipse を起動し「ファイル」「新規」「動的Webプロジェクト」を選択します。

 

 

 

 

 

「動的 Web プロジェクト」の設定画面が表示されるのでプロジェクト名(tomcat_test)を入力して「次へ」ボタンをクリックします。

 

 

 

 

そのまま「次へ」ボタンをクリックします。

 

 

 

 

 

コンテキスト・ルート、コンテンツ・ディレクトリーを確認して「完了」ボタンをクリックします。

今回のコンテキスト・ルートは「tomcat_test」なので、以下のような URL になるイメージです。

  • http://localhost:8080/tomcat_test/xxx/xxx

 

 

 

 

 

以下の画面が表示されたら「パースペクティブを開く」ボタンをクリックします。

 

 

 

tomcat_testプロジェクトが作成されることを確認します。

 

 

 

 

 

Eclipse 上で Tomcat を起動します。(Windows 上の Tomcat ではないことに注意)

プロジェクトを選択して「サーバー」タブより「ローカルホストの Tomcat v9.0 サーバ」選択して右クリックし「追加および除去」をクリックします。

 

 

 

 

下図のようにリソース(tomcat_test)を構成済みに追加したら「完了」ボタンをクリックします。

 

 

 

 

 

「Servers」「server.xml」を開いて Context に tomcat_test が追加されていることを確認します。

 

 

 

 

 

次にクラスファイルを作成します。

プロジェクトを右クリックし「新規」「クラス」をクリックします。

 

 

 

 

 

パッケージ(com.test)を入力し、名前(HelloWorld)を入力して「完了」ボタンをクリックします。

 

 

 

 

 

Javaクラス(HelloWorld.java)が追加されることを確認します。

 

 

 

 

以下のようにコードを入力します。

 

 

 

 

次に web.xml ファイルを作成します。

「WEB-INF」を右クリックして「新規」「ファイル」をクリックします。

 

 

 

 

 

新規ファイル画面でファイル名「web.xml」と入力し「完了」ボタンをクリックします。

 

 

 

 

 

 

以下のように「web.xml」を作成します。

 

 

■web.xmlの内容

<web-app xmlns=”http://java.sun.com/xml/ns/j2ee” xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xsi:schemaLocation=”http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd” version=”2.4″>
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.test.HelloWorld</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name> hello </servlet-name>
<url-pattern> /tomcat/hello </url-pattern>
</servlet-mapping>
</web-app>

 

 

 

 

 

 

Eclipse の Tomcat を起動します。

 

 

 

 

下図のように Tomcat サーバーが起動したことを確認します。

 

 

 

 

 

ブラウザを起動して以下の URL を入力します。

  • URL:http://localhost:8080/tomcat_test/tomcat/hello

 

 

 

 

 

 

 

作ったアプリをTomcatへデプロイする

Eclipse 上の Tomcat でうまく Web アプリを表示することができたら、次は Windows マシン上の Tomcat へデプロイして表示してみます。

 

WAR ファイルの作成

最初に WAR ファイルを作成します。

 

対象のプロジェクト(tomcat_test)を選択して右クリックし「エクスポート」「WAR ファイル」をクリックします。

 

 

 

 

 

Web プロジェクト名と WAR ファイルの保存先を選択して「完了」ボタンをクリックします。

※すでに既存ファイルがある場合は「既存ファイルを上書き」にチェックを入れます。

 

 

 

 

 

WAR ファイル(tomcat_test.war)が作成されていることを確認します。

 

 

 

 

 

Tomcat の起動

ここで Windows の Tomcat サーバーを起動します。

 

 

Tomcat9.0w.exe をダブルクリックしてプロパティ画面を表示します。

 

 

「Start」ボタンをクリックします。

 

 

 

 

ステータスが「Started」になることを確認します。

 

 

 

 

 

 

 

webapps フォルダに WAR ファイルをデプロイ(コピー)します。

 

 

 

 

 

tomcat_test.war ファイルを置くと自動的に tomcat_test フォルダが作成されるので確認します。

 

 

 

 

ブラウザを起動し「http://localhost:8080/tomcat_test/tomcat/hello」にアクセスをして「Hello World」が表示されることを確認します。

 

 

 

 

 

 

 

Docker コンテナ環境に WAR ファイルをデプロイする

  • Eclipse の Tomcat サーバでも問題なし
  • Windows の Tomcat サーバでも問題なし

ということが確認できたので、次は Docker コンテナ環境に WAR ファイルをデプロイします。

 

 

■Dockerバージョン

[test@localhost public]$ docker -v
Docker version 20.10.14, build a224086
[test@localhost public]$

 

 

 

■tomcat:9のイメージを実行する

[test@localhost tomcat_test]$ sudo su – 
Last login: Sat Apr 23 09:25:37 JST 2022 from 192.168.182.1 on pts/4 
[root@localhost ~]# cd work/ 
[root@localhost work]# mkdir tomcat_test 
[root@localhost work]# cd tomcat_test/ 
[root@localhost tomcat_test]# docker container run –name tomcat_test -p 80:8080 tomcat:9 

 

~ 省略 ~

 

23-Apr-2022 05:06:09.878 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler [“http-nio-8080”]
23-Apr-2022 05:06:09.914 INFO [main] org.apache.catalina.startup.Catalina.load Server initialization in [1076] milliseconds
23-Apr-2022 05:06:10.021 INFO [main] org.apache.catalina.core.StandardService.startInternal Starting service [Catalina]
23-Apr-2022 05:06:10.021 INFO [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet engine: [Apache Tomcat/9.0.62]
23-Apr-2022 05:06:10.042 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler [“http-nio-8080”]
23-Apr-2022 05:06:10.081 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [166] milliseconds

 

※フォアグラウンドで実行されているのでプロンプトは返ってきません。エラーではありません。

 

  • –name  ← コンテナーに tomcat_test という名前を割り当てます。
  • -p 80:8080 ← ホストマシンの80とコンテナー(tomcat_test)の8080をバインドします。つまりホストマシンの80番ポートにアクセスをするとコンテナー(tomcat_test)の8080番ポートにアクセスが行きます。
  • tomcat:9 ← イメージ(tomcat:9)を指定します。

 

 

エラーが出た場合

「Error starting userland proxy: listen tcp4 0.0.0.0:80: bind: address already in use.」のエラーが出た場合です。

 

■エラーが出た場合

[root@localhost tomcat_test]# docker container run –name tomcat_test -p 80:8080 tomcat:9 
Unable to find image ‘tomcat:9’ locally 
9: Pulling from library/tomcat 
6aefca2dc61d: Pull complete 
967757d56527: Pull complete 
c357e2c68cb3: Pull complete 
c766e27afb21: Pull complete 
a747e81e6111: Pull complete 
2859d18181fd: Pull complete 
3c6d59134c80: Pull complete 
9890ec2258be: Pull complete 
63e0f50436fd: Pull complete 
754380b8837d: Pull complete 
Digest: sha256:ab2f34bd3ae36c656b37510586a3eeb596f92f1f03e81251cbe266eee0106779 
Status: Downloaded newer image for tomcat:9 
docker: Error response from daemon: driver failed programming external connectivity on endpoint tomcat_test (1b6e082d0406c353afaec70db0dae6b776406cde1a0614c597c6d7b05f893946): Error starting userland proxy: listen tcp4 0.0.0.0:80: bind: address already in use. 
ERRO[0083] error waiting for container: context canceled 
[root@localhost tomcat_test]# 

 

このエラーの原因ですが、すでにホストマシンで80番ポートが使用されているからです。

 

 

■httpdを停止する

[root@localhost tomcat_test]# sudo lsof -i -P | grep “LISTEN”  ← 80番ポートが使用されていないか確認します。
rpcbind    594    rpc    8u  IPv4  23297      0t0  TCP *:111 (LISTEN) 
rpcbind    594    rpc   11u  IPv6  23300      0t0  TCP *:111 (LISTEN) 
cupsd      960   root   10u  IPv6  36988      0t0  TCP localhost:631 (LISTEN) 
cupsd      960   root   11u  IPv4  36989      0t0  TCP localhost:631 (LISTEN) 
sshd       964   root    3u  IPv4  34807      0t0  TCP *:22 (LISTEN) 
sshd       964   root    4u  IPv6  34816      0t0  TCP *:22 (LISTEN) 
master    1332   root   13u  IPv4  38026      0t0  TCP localhost:25 (LISTEN) 
master    1332   root   14u  IPv6  38027      0t0  TCP localhost:25 (LISTEN) 
dnsmasq   1357 nobody    6u  IPv4  39145      0t0  TCP localhost.localdomain:53 (LISTEN) 
mysqld    2645  mysql   14u  IPv4  48219      0t0  TCP *:3306 (LISTEN) 
httpd     3514   root    4u  IPv6  55147      0t0  TCP *:80 (LISTEN) 
httpd     3515 apache    4u  IPv6  55147      0t0  TCP *:80 (LISTEN) 
httpd     3516 apache    4u  IPv6  55147      0t0  TCP *:80 (LISTEN) 
httpd     3517 apache    4u  IPv6  55147      0t0  TCP *:80 (LISTEN) 
httpd     3518 apache    4u  IPv6  55147      0t0  TCP *:80 (LISTEN) 
httpd     3519 apache    4u  IPv6  55147      0t0  TCP *:80 (LISTEN) 
[root@localhost tomcat_test]# systemctl stop httpd  ← httpdを停止します。
[root@localhost tomcat_test]# sudo lsof -i -P | grep “LISTEN” 
rpcbind    594    rpc    8u  IPv4  23297      0t0  TCP *:111 (LISTEN) 
rpcbind    594    rpc   11u  IPv6  23300      0t0  TCP *:111 (LISTEN) 
cupsd      960   root   10u  IPv6  36988      0t0  TCP localhost:631 (LISTEN) 
cupsd      960   root   11u  IPv4  36989      0t0  TCP localhost:631 (LISTEN) 
sshd       964   root    3u  IPv4  34807      0t0  TCP *:22 (LISTEN) 
sshd       964   root    4u  IPv6  34816      0t0  TCP *:22 (LISTEN) 
master    1332   root   13u  IPv4  38026      0t0  TCP localhost:25 (LISTEN) 
master    1332   root   14u  IPv6  38027      0t0  TCP localhost:25 (LISTEN) 
dnsmasq   1357 nobody    6u  IPv4  39145      0t0  TCP localhost.localdomain:53 (LISTEN) 
mysqld    2645  mysql   14u  IPv4  48219      0t0  TCP *:3306 (LISTEN) 
[root@localhost tomcat_test]# 

 

この後再度実行すればエラーは出力されないと思います。

 

 

Windows PC から Teraterm で Docker ホスト(Linux)にアクセスをしている場合は、別途もう1つウィンドウを起動してアクセスをして Docker ホストに WAR ファイルをアップロードします。

 

■WAR ファイルをアップロード

[root@localhost tomcat_test]# ls -l
total 4
-rw-r–r–. 1 root root 2090 Apr 23 18:24 tomcat_test.war
[root@localhost tomcat_test]#

 

 

 

コンテナIDを確認します。

 

■コンテナIDを確認する

[root@localhost tomcat_test]# docker ps 
CONTAINER ID   IMAGE      COMMAND             CREATED              STATUS              PORTS                                   NAMES 
c5a529212723   tomcat:9   “catalina.sh run”   About a minute ago   Up About a minute   0.0.0.0:80->8080/tcp, :::80->8080/tcp   tomcat_test 
[root@localhost tomcat_test]# 

 

 

コンテナが起動したらホストからコンテナへ WAR ファイルをコピーします。

 

■ホストからコンテナへ WAR ファイルをコピー

$ docker cp tomcat_test.war c5a529212723:/usr/local/tomcat/webapps

 

コンテナの「/usr/local/tomcat/webapps」ディレクトリに tomcat_test.war ファイルをデプロイ(コピー)します。

 

 

コンテナ環境にログインして tomcat_test.war ファイルがコピーされていることを確認します。

 

■コンテナ環境にログインする

[root@localhost tomcat_test]# docker exec -it tomcat_test /bin/bash
root@c5a529212723:/usr/local/tomcat#

 

 

■WAR ファイルがコピーされていることを確認する

root@c5a529212723:/usr/local/tomcat/webapps# ls 
tomcat_test.war 
root@c5a529212723:/usr/local/tomcat/webapps#  

 

root@c5a529212723:/usr/local/tomcat/webapps# ls -l 
total 4 
drwxr-x—. 4 root root   37 Apr 23 09:44 tomcat_test  ← しばらく経つと、以下のようにフォルダが自動的にできる。 
-rw-r–r–. 1 root root 2090 Apr 23 09:24 tomcat_test.war 
root@c5a529212723:/usr/local/tomcat/webapps# 

 

 

 

動作確認

ブラウザを起動し以下の URL にアクセスをして「Hello World」が表示されることを確認します。

  • http://localhost/tomcat_test/tomcat/hello

 

 

 

 

 

 

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

AlphaOmega Captcha Medica  –  What Do You See?
     
 

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください