Tomcat で Web アプリを作成し Docker コンテナ環境にデプロイして実行する手順について解説します。
Web アプリは Java で作成しますが、まずは単純に「Hello World!」 と表示させるところから出発します。
この記事で作成した Docker コンテナイメージを AWS ECS にデプロイする手順は以下となります。
【AWS】Docker で作成した Java Web アプリのコンテナ環境をイメージ化して ECR にプッシュし ECS にデプロイする手順
AWSインフラ研究所
https://go-journey.club/archives/16928
AWSを中心としたクラウドインフラ技術サイト
環境
開発環境: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
コメント