GMarsh
GMarsh

Reputation: 23

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. I am running on Ubuntu 21.04. I have a Spring Boot program as a .war file that I run inside of 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.

My Dockerfile is this :

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 :

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

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

the output is :

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 :

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.

When I type http://localhost:8080/ in the browser address bar I get an HTTP Status 404 – Not Found error.

When I type

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 ?

Upvotes: 2

Views: 1553

Answers (1)

jccampanero
jccampanero

Reputation: 53421

Although you indicated your Dockerfile is derived from a Tomcat 9 base image:

FROM tomcat:9-jdk8

according to your logs it seems you are using Tomcat 10 instead:

Server version name:   Apache Tomcat/10.0.14

In the later case, please, be aware that currently Spring doesn't support Tomcat 10 and the new jakarta.* namespace. As explained in this related SO question, there is an open issue for that.

To solve the problem, you can use a Tomcat 9 version based docker image.

If you are already using a Tomcat 9 version based docker image, then be sure to follow the different steps indicated in the Spring Boot documentation to successfully deploy your war.

Basically, you need to:

  • Provide a SpringBootServletInitializer subclass in your application:
@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. For instance, with Maven provide the following configuration:
<packaging>war</packaging>
  • If necessary, mark the Tomcat dependency as provided:
<dependencies>
    <!-- ... -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>
    <!-- ... -->
</dependencies>

Upvotes: 1

Related Questions