You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker中Tomcat无法运行Java应用的问题排查求助

问题描述

我尝试构建一个运行Java应用的Docker镜像,已准备好对应的.jar文件,使用以下配置启动容器后,日志显示Tomcat已正常启动,但访问localhost:8080时出现异常。

配置文件

Dockerfile

FROM tomcat:9-jdk11
COPY <my-application>.jar /usr/local/tomcat/webapps/
CMD ["catalina.sh", "run"]
EXPOSE 8080

docker-compose.yaml

version: '3'
services:
  my-java-app:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - 8080:8080

容器启动日志

my-app-docker-1-1  | NOTE: Picked up JDK_JAVA_OPTIONS:  --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
my-app-docker-1-1  | 21-Jun-2023 12:32:05.318 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version name:   Apache Tomcat/9.0.76
my-app-docker-1-1  | 21-Jun-2023 12:32:05.327 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built:          Jun 5 2023 07:17:04 UTC
my-app-docker-1-1  | 21-Jun-2023 12:32:05.328 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version number: 9.0.76.0
my-app-docker-1-1  | 21-Jun-2023 12:32:05.328 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name:               Linux
my-app-docker-1-1  | 21-Jun-2023 12:32:05.329 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version:            5.19.0-45-generic
my-app-docker-1-1  | 21-Jun-2023 12:32:05.329 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture:          amd64
my-app-docker-1-1  | 21-Jun-2023 12:32:05.330 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Java Home:             /opt/java/openjdk
my-app-docker-1-1  | 21-Jun-2023 12:32:05.330 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Version:           11.0.19+7
my-app-docker-1-1  | 21-Jun-2023 12:32:05.331 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Vendor:            Eclipse Adoptium
my-app-docker-1-1  | 21-Jun-2023 12:32:05.331 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE:         /usr/local/tomcat
my-app-docker-1-1  | 21-Jun-2023 12:32:05.332 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME:         /usr/local/tomcat
my-app-docker-1-1  | 21-Jun-2023 12:32:05.363 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.lang=ALL-UNNAMED
my-app-docker-1-1  | 21-Jun-2023 12:32:05.364 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.io=ALL-UNNAMED
my-app-docker-1-1  | 21-Jun-2023 12:32:05.364 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.util=ALL-UNNAMED
my-app-docker-1-1  | 21-Jun-2023 12:32:05.365 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.util.concurrent=ALL-UNNAMED
my-app-docker-1-1  | 21-Jun-2023 12:32:05.366 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
my-app-docker-1-1  | 21-Jun-2023 12:32:05.366 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties
my-app-docker-1-1  | 21-Jun-2023 12:32:05.367 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
my-app-docker-1-1  | 21-Jun-2023 12:32:05.367 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djdk.tls.ephemeralDHKeySize=2048
my-app-docker-1-1  | 21-Jun-2023 12:32:05.368 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.protocol.handler.pkgs=org.apache.catalina.webresources
my-app-docker-1-1  | 21-Jun-2023 12:32:05.368 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dorg.apache.catalina.security.SecurityListener.UMASK=0027
my-app-docker-1-1  | 21-Jun-2023 12:32:05.369 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dignore.endorsed.dirs=
my-app-docker-1-1  | 21-Jun-2023 12:32:05.369 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.base=/usr/local/tomcat
my-app-docker-1-1  | 21-Jun-2023 12:32:05.370 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.home=/usr/local/tomcat
my-app-docker-1-1  | 21-Jun-2023 12:32:05.370 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.io.tmpdir=/usr/local/tomcat/temp
my-app-docker-1-1  | 21-Jun-2023 12:32:05.381 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent Loaded Apache Tomcat Native library [1.2.37] using APR version [1.7.0].
my-app-docker-1-1  | 21-Jun-2023 12:32:05.383 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true], UDS [true].
my-app-docker-1-1  | 21-Jun-2023 12:32:05.383 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR/OpenSSL configuration: useAprConnector [false], useOpenSSL [true]
my-app-docker-1-1  | 21-Jun-2023 12:32:05.398 INFO [main] org.apache.catalina.core.AprLifecycleListener.initializeSSL OpenSSL successfully initialized [OpenSSL 3.0.2 15 Mar 2022]
my-app-docker-1-1  | 21-Jun-2023 12:32:06.554 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-nio-8080"]
my-app-docker-1-1  | 21-Jun-2023 12:32:06.625 INFO [main] org.apache.catalina.startup.Catalina.load Server initialization in [1966] milliseconds
my-app-docker-1-1  | 21-Jun-2023 12:32:06.789 INFO [main] org.apache.catalina.core.StandardService.startInternal Starting service [Catalina]
my-app-docker-1-1  | 21-Jun-2023 12:32:06.790 INFO [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet engine: [Apache Tomcat/9.0.76]
my-app-docker-1-1  | 21-Jun-2023 12:32:06.835 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
my-app-docker-1-1  | 21-Jun-2023 12:32:06.874 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [247] milliseconds
解决方案

从配置和日志来看,Tomcat确实启动正常,但访问异常大概率是以下几个原因,按步骤排查:

1. 确认Jar包类型是否匹配Tomcat部署要求

Tomcat的webapps目录只会自动部署WAR格式的Web应用包或解压后的Web应用目录,普通可执行Jar(比如Spring Boot内置容器的Jar)无法直接在此运行:

  • 如果是普通可执行Jar:改用OpenJDK基础镜像,直接通过java -jar启动,修改Dockerfile如下:
FROM openjdk:11-jre-slim
COPY <my-application>.jar /app/app.jar
WORKDIR /app
CMD ["java", "-jar", "app.jar"]
EXPOSE 8080
  • 如果是Web应用WAR包:确保Jar包后缀为.war,或者复制时重命名为.war,比如COPY <my-application>.jar /usr/local/tomcat/webapps/ROOT.war(命名为ROOT.war可直接通过localhost:8080访问,无需添加应用上下文路径)。

2. 检查Tomcat是否成功部署应用

查看容器内Tomcat的详细日志,确认是否有应用部署记录:

# 查看容器完整日志
docker-compose logs my-java-app
# 进入容器查看localhost部署日志
docker exec -it <容器ID> cat /usr/local/tomcat/logs/localhost.log

如果日志中无应用部署相关内容,说明Tomcat未识别到你的包,回到第一步确认包类型。

3. 确认访问路径是否正确

若WAR包未命名为ROOT.war,访问路径应为localhost:8080/<应用名称>,比如你的包是my-app.war,则访问localhost:8080/my-app。

4. 检查端口映射是否生效

确认宿主机8080端口未被其他程序占用,可换用其他端口映射,比如将docker-compose.yaml中的端口改为- 8081:8080,然后访问localhost:8081:

# 检查宿主机8080端口占用情况
netstat -tulpn | grep 8080

内容的提问来源于stack exchange,提问作者DarkDead

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 04:52:01