質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Tomcat

TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

Apache Tomcat

Apache TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

2回答

5106閲覧

Spring BootのwarアプリケーションのDockerコンテナにブラウザからアクセスできない

Linkey

総合スコア77

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Tomcat

TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

Apache Tomcat

Apache TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2021/12/28 15:35

編集2021/12/29 03:44

Dockerを勉強しているものです。
Tomcatにwarファイルを配置したイメージからDockerコンテナを起動してwarアプリケーションにアクセスできるかを確認しています。
ブラウザからアクセスすると404が返ってきてしまいます。

/sample1/src/main/java/com/example/sample1/Sample1Application.java

java

1package com.example.sample1; 2 3import org.springframework.boot.SpringApplication; 4import org.springframework.boot.autoconfigure.SpringBootApplication; 5import org.springframework.boot.builder.SpringApplicationBuilder; 6import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; 7 8@SpringBootApplication 9public class Sample1Application extends SpringBootServletInitializer { 10 11 public static void main(String[] args) { 12 SpringApplication.run(Sample1Application.class, args); 13 } 14 15 @Override 16 protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { 17 return builder.sources(Sample1Application.class); 18 } 19}

/sample1/src/main/java/com/example/sample1/controller/SampleController.java

java

1@RestController 2public class SampleController { 3 @RequestMapping("/sample") 4 public String home() { 5 return "Hello Docker World"; 6 } 7 8 @RequestMapping(method= RequestMethod.GET, value= "/sample2") 9 public ModelAndView welcome() { 10 ModelAndView modelAndView= new ModelAndView(); 11 modelAndView.setViewName("sample2.html"); 12 return modelAndView; 13 } 14}

/sample1/src/main/resources/templates/sample2.html

html

1<!DOCTYPE html> 2<html> 3<head> 4<meta charset="UTF-8"> 5<title>Spring Boot Sample Site</title> 6</head> 7<body> 8 <div>Hello World.</div> 9</body> 10</html>

pom.xml

xml

1<?xml version="1.0" encoding="UTF-8"?> 2<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4 <modelVersion>4.0.0</modelVersion> 5 <parent> 6 <groupId>org.springframework.boot</groupId> 7 <artifactId>spring-boot-starter-parent</artifactId> 8 <version>2.6.1</version> 9 <relativePath/> <!-- lookup parent from repository --> 10 </parent> 11 <groupId>com.example</groupId> 12 <artifactId>sample1</artifactId> 13 <version>0.0.1-SNAPSHOT</version> 14 <packaging>war</packaging> 15 <name>sample1</name> 16 <description>Demo project for Spring Boot</description> 17 <properties> 18 <java.version>17</java.version> 19 <maven.compiler.target>8</maven.compiler.target> 20 <maven.compiler.source>8</maven.compiler.source> 21 </properties> 22 <dependencies> 23 <dependency> 24 <groupId>org.springframework.boot</groupId> 25 <artifactId>spring-boot-starter</artifactId> 26 </dependency> 27 <dependency> 28 <groupId>org.springframework.boot</groupId> 29 <artifactId>spring-boot-starter-web</artifactId> 30 </dependency> 31 <dependency> 32 <groupId>org.springframework.boot</groupId> 33 <artifactId>spring-boot-starter-thymeleaf</artifactId> 34 </dependency> 35 <dependency> 36 <groupId>org.springframework.boot</groupId> 37 <artifactId>spring-boot-starter-test</artifactId> 38 <scope>test</scope> 39 </dependency> 40 <dependency> 41 <groupId>org.springframework.boot</groupId> 42 <artifactId>spring-boot-starter-tomcat</artifactId> 43 <scope>provided</scope> 44 </dependency> 45 </dependencies> 46 47 <build> 48 <finalName>sample1</finalName> 49 <plugins> 50 <plugin> 51 <groupId>org.springframework.boot</groupId> 52 <artifactId>spring-boot-maven-plugin</artifactId> 53 </plugin> 54 </plugins> 55 </build> 56 57</project> 58

以下の手順を実施しました。
①warファイルを作成する

②Dockerfileを作成
Dockerfile

FROM tomcat RUN ["apt-get", "update"] RUN ["apt-get", "install", "-y", "vim"] ENV PATH $PATH:/usr/sbin RUN rm -rf /usr/local/tomcat/webapps.dist/ COPY ./sample1.war /usr/local/tomcat/webapps/ CMD chmod +x /usr/local/tomcat/bin/catalina.sh CMD ["catalina.sh", "run"]

③Dockerイメージを作成
docker build -t (Dockerユーザ名)/springboot-sample1:v1 .

④作成したイメージからコンテナを作成し起動する
docker run -it --publish 8080:8080 (Dockerユーザ名)/springboot-sample1:v1

28-Dec-2021 15:18:25.166 INFO [main] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive [/usr/local/tomcat/webapps/sample1.war] ~ 28-Dec-2021 15:18:26.137 INFO [main] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive [/usr/local/tomcat/webapps/sample1.war] has finished in [971] ms 28-Dec-2021 15:18:26.141 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"] 28-Dec-2021 15:18:26.153 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [1047] milliseconds

⑤ブラウザからhttp://localhost:8080/sample1/sample、http://localhost:8080/sample1/sample2にアクセスすると404となる

HTTPステータス 404 – 見つかりません。 タイプ ステータスレポート 説明 オリジンサーバーは、ターゲットリソースの現在の表現を見つけられなかったか、またはそれが存在することを開示するつもりはありません。 Apache Tomcat/10.0.14

解決方法を探していますが、未だに解決ができていません。
DockerとTomcatにお詳しい方がいましたらご回答いただけないでしょうか?
よろしくお願いいたします。

--- 追記 ----
Dockerfileのcatalina.sh実行コマンドを以下のように修正して確認
CMD ["sh", "/usr/local/tomcat/bin/catalina.sh", "run"]

Dockerイメージを作り直してから以下のコマンドでイメージからコンテナを作成
docker container run -it -p 8080:8080 --name test (Dockerユーザ名)/springboot-sample1:v1 /bin/bash

資材の配置状態は以下のような状態です。

root@abd9ba51180a:/usr/local/tomcat/webapps# ls -la total 13096 drwxr-xr-x 1 root root 4096 Dec 29 01:45 . drwxr-xr-x 1 root root 4096 Dec 22 17:10 .. drwxr-x--- 4 root root 4096 Dec 29 01:45 sample1 -rwxr-xr-x 1 root root 13391545 Dec 29 01:43 sample1.war

/usr/local/tomcat/webapps/sample1

root@abd9ba51180a:/usr/local/tomcat/webapps/sample1# ls -la total 20 drwxr-x--- 5 root root 4096 Dec 29 01:52 . drwxr-xr-x 1 root root 4096 Dec 29 01:52 .. drwxr-x--- 3 root root 4096 Dec 29 01:52 META-INF drwxr-x--- 5 root root 4096 Dec 29 01:52 WEB-INF drwxr-x--- 3 root root 4096 Dec 29 01:52 org

orgフォルダの中身を確認。

root@abd9ba51180a:/usr/local/tomcat/webapps/sample1# cd org/ root@abd9ba51180a:/usr/local/tomcat/webapps/sample1/org# ls -la total 12 drwxr-x--- 3 root root 4096 Dec 29 03:12 . drwxr-x--- 5 root root 4096 Dec 29 03:12 .. drwxr-x--- 3 root root 4096 Dec 29 03:12 springframework root@cd66d6f2186c:/usr/local/tomcat/webapps/sample1/org# root@cd66d6f2186c:/usr/local/tomcat/webapps/sample1/org# cd springframework/ root@cd66d6f2186c:/usr/local/tomcat/webapps/sample1/org/springframework# ls -la total 12 drwxr-x--- 3 root root 4096 Dec 29 03:12 . drwxr-x--- 3 root root 4096 Dec 29 03:12 .. drwxr-x--- 3 root root 4096 Dec 29 03:12 boot root@abd9ba51180a:/usr/local/tomcat/webapps/sample1/org/springframework# root@abd9ba51180a:/usr/local/tomcat/webapps/sample1/org/springframework# cd boot/ root@abd9ba51180a:/usr/local/tomcat/webapps/sample1/org/springframework/boot# ls -la total 12 drwxr-x--- 3 root root 4096 Dec 29 03:12 . drwxr-x--- 3 root root 4096 Dec 29 03:12 .. drwxr-x--- 7 root root 4096 Dec 29 03:12 loader root@abd9ba51180a:/usr/local/tomcat/webapps/sample1/org/springframework/boot# cd loader root@abd9ba51180a:/usr/local/tomcat/webapps/sample1/org/springframework/boot/loader# ls -la total 124 drwxr-x--- 7 root root 4096 Dec 29 03:12 . drwxr-x--- 3 root root 4096 Dec 29 03:12 .. -rw-r----- 1 root root 5871 Feb 1 1980 ClassPathIndexFile.class -rw-r----- 1 root root 6806 Feb 1 1980 ExecutableArchiveLauncher.class -rw-r----- 1 root root 3966 Feb 1 1980 JarLauncher.class -rw-r----- 1 root root 1483 Feb 1 1980 'LaunchedURLClassLoader$DefinePackageCallType.class' -rw-r----- 1 root root 1535 Feb 1 1980 'LaunchedURLClassLoader$UseFastConnectionExceptionsEnumeration.class' -rw-r----- 1 root root 11154 Feb 1 1980 LaunchedURLClassLoader.class -rw-r----- 1 root root 5932 Feb 1 1980 Launcher.class -rw-r----- 1 root root 1536 Feb 1 1980 MainMethodRunner.class -rw-r----- 1 root root 266 Feb 1 1980 'PropertiesLauncher$1.class' -rw-r----- 1 root root 1484 Feb 1 1980 'PropertiesLauncher$ArchiveEntryFilter.class' -rw-r----- 1 root root 8128 Feb 1 1980 'PropertiesLauncher$ClassPathArchives.class' -rw-r----- 1 root root 1953 Feb 1 1980 'PropertiesLauncher$PrefixMatchingArchiveFilter.class' -rw-r----- 1 root root 18267 Feb 1 1980 PropertiesLauncher.class -rw-r----- 1 root root 1750 Feb 1 1980 WarLauncher.class drwxr-x--- 2 root root 4096 Dec 29 03:12 archive drwxr-x--- 2 root root 4096 Dec 29 03:12 data drwxr-x--- 2 root root 4096 Dec 29 03:12 jar drwxr-x--- 2 root root 4096 Dec 29 03:12 jarmode drwxr-x--- 2 root root 4096 Dec 29 03:12 util

curlコマンドでアクセス確認をするがTomcatの404が返却されてしまう

root@abd9ba51180a:/usr/local/tomcat/webapps/sample1# curl http://localhost:8080/sample1/sample/ <!doctype html><html lang="en"><head><title>HTTP Status 404 – Not Found</title><style type="text/css">body {font-family:Tahoma,Arial,sans-serif;} ~ <h3>Apache Tomcat/10.0.14</h3></body></html>

コンテナの環境変数は以下のようになっています。

root@abd9ba51180a:/# printenv HOSTNAME=abd9ba51180a JAVA_HOME=/usr/local/openjdk-8 GPG_KEYS=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX PWD=/usr/local/tomcat/webapps TOMCAT_SHA512=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX TOMCAT_MAJOR=10 HOME=/root LANG=C.UTF-8 TOMCAT_NATIVE_LIBDIR=/usr/local/tomcat/native-jni-lib TERM=xterm CATALINA_HOME=/usr/local/tomcat SHLVL=1 LD_LIBRARY_PATH=/usr/local/tomcat/native-jni-lib PATH=/usr/local/tomcat/bin:/usr/local/openjdk-8/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/sbin TOMCAT_VERSION=10.0.14 JAVA_VERSION=8u312 _=/usr/bin/printenv OLDPWD=/usr/local/tomcat

ローカル環境(Spring Tool Suite4)ではページが表示できます。
イメージ説明
イメージ説明

orgフォルダが悪さをしているように見えますが、どうしてそのフォルダが出来てしまったのか分からず、解決方法は調査中です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

自己解決できました。原因はビルドしたSpring Tool Suite4のTomcatバージョンとDockerコンテナのTomcatバージョンが一致していないことが原因でした。
以下の手順でブラウザアクセスできることを確認しました。
①Spring Tool Suite4でビルドアプリケーションを動かしてJavaバージョンとTomcatのバージョンを確認する。
イメージ説明
今回はJava8でTomcat9を使用。

②Dockerfileのtomcatのイメージとバージョンを修正
FROM tomcat:10-jdk8

FROM tomcat:9-jdk8-adoptopenjdk-hotspot

③Dockerイメージを再作成する

docker build -t (Dockerユーザ名)/springboot-sample1:v1 .

④作成したイメージからコンテナを作成し起動する

docker container run -itd -p 8080:8080 --name test01 (Dockerユーザ名)/springboot-sample1:v1

⑤起動したコンテナにアクセスする

docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 46c7a3bb03fe (Dockerユーザ名)/springboot-sample1:v1 "sh /usr/local/tomca…" 33 seconds ago Up 31 seconds 0.0.0.0:8080->8080/tcp test01 docker exec -i -t 46c7a3bb03fe /bin/bash root@46c7a3bb03fe:/usr/local/tomcat#

⑥curlコマンドでアクセスできることを確認

root@46c7a3bb03fe:/usr/local/tomcat# curl http://localhost:8080/sample1/sample/ Hello Docker Worldroot@46c7a3bb03fe:/usr/local/tomcat# curl root@46c7a3bb03fe:/usr/local/tomcat# curl http://localhost:8080/sample1/sample2/ <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Spring Boot Sample Site</title> </head> <body> <div>Hello World.</div> </body> </html>root@46c7a3bb03fe:/usr/local/tomcat#

⑥ブラウザから確認できることを確認しました。
イメージ説明
イメージ説明

JavaバージョンとTomcatのバージョンを開発環境とコンテナで合わせないといけないということを見落としておりました。お騒がせしました。

投稿2021/12/29 12:42

Linkey

総合スコア77

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Java のソースコードをみると、以下のどちらかにURLはなると思うのですが、
その場合でも 404 になりますでしょうか(sample1 が不要)

http://localhost:8080/sample, http://localhost:8080/sample2

すいません、Tomcatのバージョンが原因です。

Tomcat 10 から Servlet API が jakarta EE のを使うようになったので、
SpringBoot 2.6 などでは動作しません。
※SpringBoot 2.5, 2.6 などは Tomcat 9 を使う前提のため、Jakarta EE Servlet API に未対応

  • Tomcatのバージョンを9以下にさげる
  • 以下のマイグレーションツールでソースコードを変換する

マイグレーションツールを使う例の参考は以下
https://www.appsdeveloperblog.com/deploy-a-spring-boot-rest-app-as-a-war-to-tomcat-10/

投稿2021/12/29 06:21

編集2021/12/29 14:43
kiino

総合スコア557

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Linkey

2021/12/29 08:14

回答ありがとうございます。http://localhost:8080/sample, http://localhost:8080/sample2どちらも404となります。warファイルをtomcatに配置して展開するとwarファイル名がコンテキストパスになるという認識でしたのでhttp://localhost:8080/sample1/sample、http://localhost:8080/sample1/sample2でアクセス確認を行っていました。 root@3ab69fdc4f6a:/usr/local/tomcat# curl http://localhost:8080/sample <!doctype html><html lang="en"><head><title>HTTP Status 404 – Not Found</title><style type="text/css">body {font-family:Tahoma,Arial,sans-serif;} h1, h2, h3, b {color:white;background-color:#525D76;} h1 {font-size:22px;} h2 {font-size:16px;} h3 {font-size:14px;} p {font-size:12px;} a {color:black;} .line {height:1px;background-color:#525D76;border:none;}</style></head><body><h1>HTTP Status 404 – Not Found</h1><hr class="line" /><p><b>Type</b> Status Report</p><p><b>Description</b> The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.</p><hr class="line" /><h3>Apache Tomcat/10.0.14</h3></body></html>root@3ab69fdc4f6a:/usr/local/tomcat# root@3ab69fdc4f6a:/usr/local/tomcat# curl http://localhost:8080/sample2 <!doctype html><html lang="en"><head><title>HTTP Status 404 – Not Found</title><style type="text/css">body {font-family:Tahoma,Arial,sans-serif;} h1, h2, h3, b {color:white;background-color:#525D76;} h1 {font-size:22px;} h2 {font-size:16px;} h3 {font-size:14px;} p {font-size:12px;} a {color:black;} .line {height:1px;background-color:#525D76;border:none;}</style></head><body><h1>HTTP Status 404 – Not Found</h1><hr class="line" /><p><b>Type</b> Status Report</p><p><b>Description</b> The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.</p><hr class="line" /><h3>Apache Tomcat/10.0.14</h3></body></html>root@3ab69fdc4f6a:/usr/local/tomcat# curl http://localhost:8080/sample2/
kiino

2021/12/29 14:41

すいません、コンテキストの件をすっかり失念していました。 すでに解決ずみですが、Tomcat のバージョン違いが原因です。 Tomcat 10 から Servlet API が jakarta EE のを使うようになったので、 SpringBoot 2.6 などでは動作しません。 Tomcatのバージョンを9以下にさげるか、 以下のマイグレーションツールで変換するかなどが必要です https://github.com/apache/tomcat-jakartaee-migration あとは参考になるブログは以下など https://www.appsdeveloperblog.com/deploy-a-spring-boot-rest-app-as-a-war-to-tomcat-10/
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問