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″> |
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 |
■tomcat:9のイメージを実行する
[test@localhost tomcat_test]$ sudo su –
~ 省略 ~
23-Apr-2022 05:06:09.878 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler [“http-nio-8080”] |
※フォアグラウンドで実行されているのでプロンプトは返ってきません。エラーではありません。
- –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 |
このエラーの原因ですが、すでにホストマシンで80番ポートが使用されているからです。
■httpdを停止する
[root@localhost tomcat_test]# sudo lsof -i -P | grep “LISTEN” ← 80番ポートが使用されていないか確認します。 |
この後再度実行すればエラーは出力されないと思います。
Windows PC から Teraterm で Docker ホスト(Linux)にアクセスをしている場合は、別途もう1つウィンドウを起動してアクセスをして Docker ホストに WAR ファイルをアップロードします。
■WAR ファイルをアップロード
[root@localhost tomcat_test]# ls -l |
コンテナIDを確認します。
■コンテナIDを確認する
[root@localhost tomcat_test]# docker ps |
コンテナが起動したらホストからコンテナへ 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 |
■WAR ファイルがコピーされていることを確認する
root@c5a529212723:/usr/local/tomcat/webapps# ls
root@c5a529212723:/usr/local/tomcat/webapps# ls -l |
動作確認
ブラウザを起動し以下の URL にアクセスをして「Hello World」が表示されることを確認します。
- http://localhost/tomcat_test/tomcat/hello
コメント