简体   繁体   English

无法使用 docker-compose 从 Tomcat Docker 容器访问主机

[英]Unable to reach the host from a Tomcat Docker Container using docker-compose

I have a docker-compose version 1.25.0 and Docker version 20.10.12.我有一个 docker-compose 版本 1.25.0 和 Docker 版本 20.10.12。 I am running on Ubuntu 21.04.我在 Ubuntu 21.04 上运行。 I have a Spring Boot program as a.war file that I run inside of tomcat.我有一个 Spring 引导程序作为 .war 文件,我在 tomcat 内部运行。 The program works fine outside the docker container but when I run inside the docker container I am unable to access it in the browser.该程序在 docker 容器外运行良好,但是当我在 docker 容器内运行时,我无法在浏览器中访问它。

My Dockerfile is this:我的 Dockerfile 是这样的:

FROM tomcat:9-jdk8
ADD ./build/libs/studentLetter-1.0.2.war /usr/local/tomcat/webapps/
EXPOSE 8080
RUN mkdir -p /home/gmarsh/workdir
CMD ["catalina.sh", "run"]

My docker-compose.yml file contains this:我的 docker-compose.yml 文件包含以下内容:

version: '3.8'

services:
    app:
      build: ./
      image: wbsgrader-online-img
      ports:
        - 8080:8080
      extra_hosts:
        - dockerhost:$DOCKER_HOST
      network_mode: "host"

where DOCKER_HOST is exported as this in my.profile其中 DOCKER_HOST 在 my.profile 中被导出为 this

export DOCKER_HOST=`/sbin/ifconfig docker0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'`

I enter at the terminal我在终端输入

docker-compose up --build -d docker-compose up --build -d

the output is: output 是:

Building app
Step 1/4 : FROM tomcat:latest
 ---> fb5657adc892
Step 2/4 : ADD ./build/libs/studentLetter-1.0.2.war /usr/local/tomcat/webapps/
 ---> Using cache
 ---> 891060c813d6
Step 3/4 : EXPOSE 8080
 ---> Using cache
 ---> fbd16298db6c
Step 4/4 : CMD ["catalina.sh", "run"]
 ---> Using cache
 ---> 432a1484e8ae
Successfully built 432a1484e8ae
Successfully tagged wbsgrader-img:latest
Creating onlinewbsgrader_app_1 ... done

and the output in docker-compose logs is: docker-compose 日志中的 output 是:

Attaching to onlinewbsgrader_app_1
app_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
app_1  | 31-Dec-2021 22:57:51.711 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version name:   Apache Tomcat/10.0.14
app_1  | 31-Dec-2021 22:57:51.716 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built:          Dec 2 2021 22:01:36 UTC
app_1  | 31-Dec-2021 22:57:51.717 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version number: 10.0.14.0
app_1  | 31-Dec-2021 22:57:51.717 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name:               Linux
app_1  | 31-Dec-2021 22:57:51.717 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version:            5.11.0-41-generic
app_1  | 31-Dec-2021 22:57:51.717 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture:          amd64
app_1  | 31-Dec-2021 22:57:51.718 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Java Home:             /usr/local/openjdk-11
app_1  | 31-Dec-2021 22:57:51.718 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Version:           11.0.13+8
app_1  | 31-Dec-2021 22:57:51.718 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Vendor:            Oracle Corporation
app_1  | 31-Dec-2021 22:57:51.719 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE:         /usr/local/tomcat
app_1  | 31-Dec-2021 22:57:51.719 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME:         /usr/local/tomcat
app_1  | 31-Dec-2021 22:57:51.736 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.lang=ALL-UNNAMED
app_1  | 31-Dec-2021 22:57:51.736 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.io=ALL-UNNAMED
app_1  | 31-Dec-2021 22:57:51.736 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.util=ALL-UNNAMED
app_1  | 31-Dec-2021 22:57:51.736 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.base/java.util.concurrent=ALL-UNNAMED
app_1  | 31-Dec-2021 22:57:51.736 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
app_1  | 31-Dec-2021 22:57:51.737 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties
app_1  | 31-Dec-2021 22:57:51.737 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
app_1  | 31-Dec-2021 22:57:51.737 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djdk.tls.ephemeralDHKeySize=2048
app_1  | 31-Dec-2021 22:57:51.737 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.protocol.handler.pkgs=org.apache.catalina.webresources
app_1  | 31-Dec-2021 22:57:51.738 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dorg.apache.catalina.security.SecurityListener.UMASK=0027
app_1  | 31-Dec-2021 22:57:51.738 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dignore.endorsed.dirs=
app_1  | 31-Dec-2021 22:57:51.738 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.base=/usr/local/tomcat
app_1  | 31-Dec-2021 22:57:51.739 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.home=/usr/local/tomcat
app_1  | 31-Dec-2021 22:57:51.739 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.io.tmpdir=/usr/local/tomcat/temp
app_1  | 31-Dec-2021 22:57:51.744 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent Loaded Apache Tomcat Native library [1.2.31] using APR version [1.7.0].
app_1  | 31-Dec-2021 22:57:51.744 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true], UDS [true].
app_1  | 31-Dec-2021 22:57:51.748 INFO [main] org.apache.catalina.core.AprLifecycleListener.initializeSSL OpenSSL successfully initialized [OpenSSL 1.1.1k  25 Mar 2021]
app_1  | 31-Dec-2021 22:57:52.344 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-nio-8080"]
app_1  | 31-Dec-2021 22:57:52.382 INFO [main] org.apache.catalina.startup.Catalina.load Server initialization in [967] milliseconds
app_1  | 31-Dec-2021 22:57:52.463 INFO [main] org.apache.catalina.core.StandardService.startInternal Starting service [Catalina]
app_1  | 31-Dec-2021 22:57:52.463 INFO [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet engine: [Apache Tomcat/10.0.14]
app_1  | 31-Dec-2021 22:57:52.484 INFO [main] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive [/usr/local/tomcat/webapps/studentLetter-1.0.2.war]
app_1  | 31-Dec-2021 22:57:58.056 INFO [main] org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
app_1  | 31-Dec-2021 22:57:58.134 INFO [main] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive [/usr/local/tomcat/webapps/studentLetter-1.0.2.war] has finished in [5,650] ms
app_1  | 31-Dec-2021 22:57:58.141 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
app_1  | 31-Dec-2021 22:57:58.153 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [5770] milliseconds

As it shows in the logs the catalina service has started and my program.war file has deployed to /usr/local/tomcat/webapps inside the docker container.正如它在日志中显示的那样,catalina 服务已启动,并且我的 program.war 文件已部署到 docker 容器内的 /usr/local/tomcat/webapps。

When I type http://localhost:8080/ in the browser address bar I get an HTTP Status 404 – Not Found error.当我在浏览器地址栏中键入 http://localhost:8080/ 时,我收到 HTTP 状态 404 – 未找到错误。

When I type当我输入

docker ps docker ps

I get this:我明白了:

CONTAINER ID   IMAGE           COMMAND             CREATED          STATUS          PORTS     NAMES
097a4da40100   wbsgrader-img   "catalina.sh run"   10 minutes ago   Up 10 minutes             onlinewbsgrader_app_1

Notice the ports are missing in the display.请注意,显示器中缺少端口。 It looks like the port binding isn't happening for some reason.看起来端口绑定由于某种原因没有发生。

How do I get the port binding to work using docker-compose and gain browser access through localhost?如何使用 docker-compose 使端口绑定工作并通过 localhost 获得浏览器访问权限?

If you are facing a 404 error it means that your ports are in fact exposed, but that Tomcat is unable to found an application in the root context path.如果您遇到404错误,则意味着您的端口实际上已暴露,但 Tomcat 无法在根上下文路径中找到应用程序。

In the case of Docker and Spring Boot you should follow certain steps to successfully deploy your war.在 Docker 和 Spring 引导的情况下,您应该按照某些步骤成功部署您的战争。

Basically, you need to:基本上,您需要:

  • Provide a SpringBootServletInitializer subclass in your application:在您的应用程序中提供SpringBootServletInitializer子类:
@SpringBootApplication
public class MyApplication extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(MyApplication.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }

}
  • Package your application as a war file. Package 你的应用程序作为一个war文件。 For instance, with Maven provide the following configuration:例如,使用 Maven 提供以下配置:
<packaging>war</packaging>
  • If necessary, mark the Tomcat dependency as provided :如有必要,将 Tomcat 依赖项标记为provided
<dependencies>
    <!-- ... -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>
    <!-- ... -->
</dependencies>

The process is very well described in the Spring Boot documentation . Spring 引导文档中很好地描述了该过程。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM